学习总结
- 加深了解了
if
条件控制语句的用法 - 算术比较,字符串比较,文件判断等条件判断用法
明日安排
- 继续学习《Linux Shell 脚本攻略》这本书
find
cat
xargs
tr
- 学习
for
,while
,util
,case…select
等流程控制语句
笔记内容
Linux Shell 流程控制
[ $UID -eq 0] && echo "Is root user"
如果condition为真,则执行action,[ $UID -eq 0] || echo "Is't root user"
如果condition为假,则执行action,
1.15 比较与测试
算术比较
-eq
等于,equals-ne
不等于,not equals-gt
大于-lt
小于-ge
大于或等于-le
小于或等于-o
逻辑或,or-a
逻辑与,and
具体操作示例如下:
virde@virde:~$ aa=1;bb=2 virde@virde:~$ [ $aa -eq 1 -a $bb -eq 2 ] && echo Right Right virde@virde:~$ [ $aa -eq 1 -o $bb -eq 3 ] && echo Right Right
文件系统
[ -e $var ]
文件存在则为真[ -r $var ]
文件存在且可读则为真[ -w $var ]
文件存在且可写则为真[ -x $var ]
文件存在且可执行则为真[ -s $var ]
文件存在且至少有一个字符则为真[ -d $var ]
文件存在且为目录则为真
字符串比较
使用字符串进行比较时,最好用双中括号,因为有时候采用单个中括号会产生错误,所以最好避开它们
[[ $str1 = $str2 ]]
比较两个字符串变量是否一样[[ $str1 == $str2 ]]
同上,比较两个字符串变量是否一样[[ -z $str1 ]]
str1
变量为空,则为真[[ -n $str1 ]]
str
变量非空,则为真[[ $str1 = s*a ]]
str1
是否匹配s*a
可以用test
命令执行条件检测,有助于避免使用过多括号
virde@virde:~$ str1="" virde@virde:~$ test -z $str1 && echo "str1 is empty" str1 is empty virde@virde:~$ [[ -z $str1 ]] && echo "str1 is empty" str1 is empty virde@virde:~$
IFS
变量的使用
data="name,sex,roolno,location"
oldIFS=$IFS
IFS=","
for item in $data;
do
echo Item: $item
done
IFS=$oldIFS
流程控制
str=$1;
if [[ $str == "haha" ]]
then
echo hahahahahahha;
elif [[ $str = "hi" ]]
then
echo hi,beauty~
else
echo str is $str
fi
if
条件判断语句,需要说明的是:
- 如果
then
要和if
写在一行,if
条件语句后必须加分号;
和then
隔开 elif
部分可以去掉else
部分也可以去掉- 必须以
fi
结尾
异常排查记录
用sh
调用双括号报错
str=$1;
if [[ $str == "haha" ]]; then
echo str is haha;
else
echo str is $str;
fi
这段代码保存为文件if.sh
,当用sh if.sh haha
去运行时,报错了
virde@virde:~$ sh if.sh haha if.sh: 4: [[: not found str is haha
经百度,原因是:sh命令无法识别[[]]
表达式。
解决办法:bash与sh是有区别的,两者是不同的命令,且bash是sh的增强版,而"[[]]"是bash脚本中的命令,因此在执行时,使用sh命令会报错,将sh替换为bash命令即可。
bash if.sh haha
这样调用,问题解决