if结构语法如下:
if condition
then
statements
[elif condition
then statements .. ]
[else
statements ]
fi
返回状态和返回:
每个UNIX命令,无论是什么语言,每当结束都对其调用程序(这里即为bash)返回一个整数值。这里称为退出状态。0通常为无措退出状态,1~255通常表示错误。
上一章的pushd函数,如果输入无效目录时会出错,下面是改进版
pushd ()
{
dirname=$1
id cd ${dirname:?"missing directory name."}
then
DIRSTACK="$dirname ${DIRSTACK:-$PWD' '}"
echo $DIRSTACK
else
echo still in $PWD
fi
}
cd执行成功就返回0,否则返回退出状态1。
用户通常依赖命令和标准UNIX使用程序返回适当的退出状态,但对自己的shell脚本和函数应该如何处理?加入一下编写来一个cd函数,覆盖了内置的cd命令。
假设在.bashrc中有下面的代码:
cd ()
{
bultin cd "$@"
echo "$OLDPWD --> $PWD"
}
builtin 命令告诉shell使用内置名字函数,不然会出现无限递归。
这里还介绍shell的一个特殊变脸$?,其值为运行的最后一个命令的退出状态。例如:
cd baddir
echo $?
返回:
语句return N使得包含它的函数以状态N结束,N实际上可选。return只能用在函数以及使用source执行的shell脚本。语句exit N将退出整个脚本,而不管其嵌套在函数内多少层。
cd ()
{
builtin cd "$@"
es=$?
echo "$OLDPWD --> $PWD"
return $es
}
组合退出状态:
允许使用&&和||
如:
if statement1 && statement2
if statement1 || statement2
条件测试:
if不仅可以检查命令是否运行正常。shell使用[]结构提供了测试各种条件的方式。
注意:“[”符号后"]"前的空格是必须的。。。。。。
字符串比较:
操作符如下:
str1 = str2 (注意:只有一个等号,和c++不一样)
str1 != str2
str1 > str2
str1 < str2
-n str1 (str1为非null)
-z str1 (str1为null)
下面是popd函数的改进:
popd ()
{
if [ -n "$DIRSTACK" ]; then
DIRSTACK=${DIRSTACK#* }
cd ${DIRSTACK%% *}
echo "$PWD"
else
echo "stack empty, still in $PWD"
fi
}
文件属性检查:
文件属性操作符:
-d (检查是否为目录)
-e (是否存在)
-f (是否为正规文件,即不是目录或者其他特殊类型)
-r (读的权限)
-s (文件存在且非空)
-w (写权限)
-x (执行权限)
-O (文件所有者)
-G (file的组ID匹配你的组ID)
file1 -nt file2 (file1比file2新)
file1 -ot file2 (file1比file2旧)
另外可以使用圆括号和斜线转义防止shell对其进行特殊处理将之分组或者使用没有介绍的两个逻辑操作符:
-a(AND)和-o(OR),进而实现条件操作的复杂逻辑表达式。
他们的作用类似&&和||,但只在test表达式内可用。
pushd ()
{
dirname=$1
if [ -n "$dirname" ] && [ \( -d "dirname" \) -a \( -x "$dirname" \) ]; then
DIRSTACK="$dirname ${DIRSTACK:-$PWD' '}"
cd $dirname
else
echo "still in $PWD"
fi
}
整数条件:
算术测试操作符:
-lt 小于
-le 小于等于
-eq 等于
-ge 大于等于
-gt 大于
-ne 不等于
阅读(1032) | 评论(0) | 转发(0) |