如何在/ bin / sh脚本中编写和匹配正则表达式?

时间:2015-06-04 15:11:33

标签: regex shell unix sh

我正在为有限的基于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脚本之间的差异吗?

2 个答案:

答案 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解释