使用sh:条件表达式来自[[$ COUNT == 0]]和[$ COUNT == 0]的错误

时间:2017-12-18 18:06:02

标签: sh

为什么以下剪切代码会返回以下消息:条件表达式中的语法错误并失败。

#!/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

哪种格式正确?

1 个答案:

答案 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。 (对于某些命令,这只是一个小的区别;对于可以在给定直接文件句柄时并行或搜索的命令 - 例如sorttail - 它可以更大)
  • POSIX标准保留环境变量和shell内置名称的全部大写名称,这些名称对操作系统和shell本身有意义,并保证小写名称不会意外地修改POSIX定义工具的行为。见http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html,第四段。