我现在尝试将以下 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 兼容。