我一直试图弄清楚什么是错与此,但只是不出来..
这是部分似乎得到一个错误..
elif [ $operation = "man" ]; then
if [ $aug1 = "add" ]; then # <- Line 75
echo "Man Page for: add"
echo ""
echo "Syntax: add [number 1] [number 2]"
echo ""
echo "Description:"
echo "Add two different numbers together."
echo ""
echo "Info:"
echo "Added in v1.0"
echo ""
elif [ -z $aug1 ]; then
echo "Please specify a command to read the man page."
else
echo "There is no manual page for that command."
fi
我得到这个错误:
calc_1.2: line 75: [: =: unary operator expected
如果你知道你总是要使用bash,它更容易为始终使用双支架有条件的复合命令[[ ... ]]
而不是符合POSIX标准的单支架版本[ ... ]
内部[[ ... ]]
复合,字的拆分和路径扩展不会应用到的话,那么你可以依靠
if [[ $aug1 == "and" ]];
到的值进行比较$aug1
与串and
。
如果您使用[ ... ]
你总是需要记住翻一番这样的引用变量:
if [ "$aug1" = "and" ];
如果不引用变量扩展和变量未定义或空的,它从犯罪现场消失,只留下
if [ = "and" ];
这不是一个有效的语法。 (这也将失败,如果一个不同的错误信息$aug1
包含空格或shell转义字符。)
现代[[
经营者有很多其他不错的功能,包括正则表达式匹配。
我花了一段时间才能找到这一点,但请注意,如果你有一个间距错误你也将得到同样的错误:
[: =: unary operator expected
正确:
if [ "$APP_ENV" = "staging" ]
VS
if ["$APP_ENV" = "staging" ]
与往常一样设定-x
调试变量帮助找到这些:
set -x
尝试将值分配给$aug1
在使用之前, if[]
报表; 该错误消息后会消失。
您还可以设置为变量的默认值,所以你并不需要使用两个“[”,这相当于两个进程(“[”其实是一个程序),而不是一个。
它的推移,这种语法:$ {变量:-default}。
整个事情必须以这样的方式来认为,这种“默认”值是不同的东西从一个“有效”的价值/内容。
如果这是不可能因为某些原因,你可能需要添加像检查,如果有一个价值可言,沿行一步,“如果[-z $变量;然后回声‘的变量需要填写’”,或者“如果[-z $变量!],然后#everything是好的,继续执行脚本”的其余部分。