内建命令和普通命令
时间:2006-01-07 来源:yszll
在shell脚本的内部有两类可执行的命令: "普通"命令,"内建"命令. 内建命令是shell内部实现的,不能做为外部程序被调用. 大部分内部命令都是POSIX技术规范的组成部分.
1.break
这条命令在控制条件尚未满足的情况下从封闭的for,while或until循环里中途退出. 你可以给break命令额外加上一个数值参数,它表示准备退出的循环嵌套数.但这会增加脚本阅读难度,因此不建议使用,默认情况,它只退出一个循环层.
比如下面这个程序:
#!/bin/sh
rm -fr fred*
echo > fred1
echo > fred2
mkdir fred3
echo > fred4
for file in fred*
do
if [ -d "$file" ]; then
break;
fi
done
echo "First directory starting fred was $file"
exit 0
2 ":" 冒号命令
冒号命令是一个空命令. 它偶尔会被用来简化逻辑条件,相当于true的一个假名. 因为它是内建的,所以它比true运行的要快,但它的可读性要差了不少.
你可能会在while循环的某个条件里看到它,"while :" 表示这是一个无限循环,相当于更常见的 "while true".
":" 还被用在对变量进行条件化设置的情况下,比如说
: ${var:=value}
如果没有":",shell会尝试把$var解释为一个命令.
某些旧的shell脚本程序里,你会看到冒号被用在一行的开始以引起一个注释.但现代的脚本程序总是用"#"来开始一个注释,因为这样做的执行效率更高.
3.continue命令
类似C语言中的同名语句,这个命令让for,while,until循环跳到下个循环继续执行,循环变量取循环清单里的下个值.
#!/bin/sh
rm -fr fred*
echo > fred1
echo > fred2
mkdir fred3
echo > fred4
for file in fred*
do
if [ -d "$file" ]; then
echo "skipping directory $file"
continue
fi
echo "File is $file"
done
rm -fr fred*
exit 0
同样,continue也可以附加参数,表示继续开始天外跳的循环嵌套层数,但同样很少使用.
4. "." 句点命令
句点命令的作用是执行当前shell中的某个命令.
. ./shell_script
在一般情况下,当某个脚本程序执行一个外部命令或脚本的时候,会创建一个新的执行环境(子shell),命令就在这个新环境里被执行. 子环境会在执行完毕后丢弃,只留下退出码返回给上级shell. 但外部的source命令和句点命令(两个差不多是同义词)在执行某个脚本程序里列出的命令时使用的是调用该脚本程序的同一个shell.