为什么以下剪切代码会返回以下消息:条件表达式中的语法错误并失败。
#!/bin/sh
COUNT=`cat annemarie/new_files.txt | wc -l`
if [[ $COUNT -ge 1 ]]; then
echo "New files found. Stopping deployment"
exit 0
fi
if [[ $COUNT == 0 ]]; then
echo "File not found. Continuing deployment"
fi
但这会通过,但会向我发出一元运算符预期的警告,但是看起来似乎没有处理代码:
#!/bin/sh
COUNT=`cat annemarie/new_files.txt | wc -l`
if [ $COUNT -ge 1 ]; then
echo "New files found. Stopping deployment"
exit 0
fi
if [ $COUNT == 0 ]; then
echo "File not found. Continuing deployment"
fi
哪种格式正确?
答案 0 :(得分:3)
使用/bin/sh
时,无法保证[[
不受支持 - 但==
内的[ ]
也无法保证正常工作。因此,您的代码必须是:
#!/bin/sh
count=$(wc -l <annemarie/new_files.txt)
if [ "$count" -ge 1 ]; then
echo "New files found. Stopping deployment"
exit 0
fi
if [ "$count" -eq 0 ]; then
echo "File not found. Continuing deployment"
fi
注意:
[[ ... ]]
是一个ksh扩展程序,也是由bash和zsh接收的。虽然这有几个好处(其中,防止字符串拆分和glob扩展,因此不需要引用),但它没有被指定为POSIX sh标准的一部分,所以当脚本不能保证完全可用使用/bin/sh
运行。$(...)
是现代命令替换语法;嵌套时或运行包含文字反斜杠的命令时,它具有更多可预测的行为,而不是旧的POSIX基于反引号的语法。==
应替换为=
以便于移植;请参阅the POSIX test
specification,其中=
是唯一的字符串比较运算符。也就是说,因为我们想要的是数字比较,-eq
可以说是工作的正确运算符。cat foo | bar
的效率可能远低于bar <foo
。 (对于某些命令,这只是一个小的区别;对于可以在给定直接文件句柄时并行或搜索的命令 - 例如sort
或tail
- 它可以更大)