shell 脚本的坑

最近都在写shell脚本,免不了遇到每个新手都要填的坑,在这里简单记录一下。

test语句的坑

test语句在shell脚本里用的非常多,像if语句后面的其实都是test语句,也是新手最容易遇到坑的地方之一

(1)[: =: unary operator expected

if [ $var = "hello" ]; then
    echo "world"
fi

如果var的值为空,执行上面这段脚本的时候会出现这样的错误./test.sh: line 12: [: =: unary operator expected

运行脚本之前加上-x参数,在每条命令执行前打印出命,就可以发现问题了,这个时候 [ 跟 "hello"做比较,可以test语句少了个"[",因此解析时会出现语法错误。

修正为 if [ "$var" = "hello" ] 问题就解决了,有了双引号之后,就可以将空字符与"hello"作比较,这样就不会出错了,当然这个错误只有在var为空值的时候才会发生。

 

(2)[: too many arguments

如果var是包含空格的字符串那么在if语句中没有给$var加上双引号时,会出现上面的错误,原因是在解析test语句时,没有引号就不能将=号左边的变量完整的解析成一个字符串,使得其无法跟右边的字符串比较,解决的方法也是给$var加上引号。

 

ls语句的坑

file_list=$(ls test/*)
for file in $file_list; do
    echo $file
done

这样一段代码,看上去是没问题的,不过当test目录下的文件有文件名包含空格的话,文件名就会被拆开,这样输出的文件就不是目录下原有的文件了,

解决的方法是直接把for语句写成 for file in test/* 注意不要写成“test/*”否则所有的文件都会在同一行列出,这样就不能一个个文件地进行操作。

暂时就这么多坑,后续有的继续加上

原文地址:https://www.cnblogs.com/-Lei/p/3309077.html