bin/sh 脚本失败并出现语法错误:意外重定向

bin/sh 脚本失败并出现语法错误:意外重定向

我现在尝试将以下 bash 脚本转换为使用系统 shell 运行:

  1 #!/bin/sh
  2 #testtotal
  3 lines="$(crontab -l | awk '{if(NR>2)print}')"
  4 echo "1..$lines"
  5 counter=1
  6 while read p; do
  7         if [[ -x "$p" ]]
  8         then
  9             echo "ok $counter - $p is executable"
 10         else
 11             echo "not ok $counter - $p is not executable or found"
 12         fi
 13         counter=$((counter+1))
 14 done < <(crontab -l | awk '{if(NR>2)print}' | awk '{print $6}')

当我使用“sh”运行时,它失败并出现错误:

      ctest: line 14: syntax error: unexpected redirection 

你能告诉我如何调整它以在 bin/sh 下运行吗?

答案1

在第 7 行,而不是[[ ... ]]您想要的[ ... ]test ...(确保总是,总是,总是引用每个变量——你已经这样做了,但[它的不是可选,值得其他人重复阅读)。

if [ -x "$p" ]

在第 14 行,您可以使用此处文档结合命令替换来替换进程替换:

done <<EOF
$(crontab -l | awk 'NR > 2 { print $6 }')
EOF

这样,您就可以避免while read p由于管道进入子 shell 中而在子 shell 中运行循环,因此您的变量将保留下来。

这样应该可以使这个 POSIX 兼容。

相关内容