我正在为有限的基于unix的微内核编写一个shell脚本,它没有bash!由于某些原因,/ bin / sh无法运行以下行。
if [[ `uname` =~ (QNX|qnx) ]]; then
read -p "what is the dev prefix to use? " dev_prefix
if [[ $dev_prefix =~ ^[a-z0-9_-]+@[a-z0-9_-"."]+:.*$ ]]; then
对于第1行和第3行,它抱怨缺少表达式运算符,对于第2行,它表示没有协处理!任何人都可以了解/ bin / bash和/ bin / sh脚本之间的差异吗?
答案 0 :(得分:5)
您可以在/bin/sh
中使用此等效脚本:
if uname | grep -Eq '(QNX|qnx)'; then
printf "what is the dev prefix to use? "
read dev_prefix
if echo "$dev_prefix" | grep -Eq '^[a-z0-9_-]+@[a-z0-9_-"."]+:'; then
...
fi
fi
答案 1 :(得分:2)
以下是查看脚本中非Posix功能的方法:
将其复制/粘贴到shellcheck.net:
#!/bin/sh
if [[ `1uname` =~ (QNX|qnx) ]]; then
read -p "what is the dev prefix to use? " dev_prefix
if [[ $dev_prefix =~ ^[a-z0-9_-]+@[a-z0-9_-"."]+:.*$ ]]; then
: nothing
fi
fi
或在本地安装shellcheck,然后运行shellcheck ./check.sh
,
它将突出显示非posix功能:
In ./check.sh line 2:
if [[ `1uname` =~ (QNX|qnx) ]]; then
^-- SC2039: In POSIX sh, [[ ]] is not supported.
^-- SC2006: Use $(..) instead of deprecated `..`
In ./check.sh line 4:
if [[ $dev_prefix =~ ^[a-z0-9_-]+@[a-z0-9_-"."]+:.*$ ]]; then
^-- SC2039: In POSIX sh, [[ ]] is not supported.
你要么必须将表达式重新命名为globs(不现实),要么使用外部命令(grep / awk),由@anubhava解释