bash 脚本正在尝试执行一个变量

bash 脚本正在尝试执行一个变量

我有一个非常短的 Bash 脚本,如下所示:

variable="3 things"
if $(echo $variable|grep "^[0-9]\{1,\}") #if $variable begins with [0-9]
then
    echo $(echo $variable|sed 's/ .*$//')
else
    echo "0"
fi

$variable最终将是命令的输出,该命令将以数字或单词“No”开头的字符串。我希望脚本只返回数字,否则返回数字 0。

我收到错误,script.bash: line 2: 3: command not found我不明白为什么 bash 试图将“3”作为命令执行。任何见解将不胜感激(或者关于更好的编写方法的建议——我不擅长 bash 脚本)。

谢谢

答案1

尝试这个:

variable="3 things"
if echo "$variable" | grep "^[0-9]\{1,\}" >/dev/null 2>&1 #if $variable begins with [0-9]
then
    echo "$variable" | sed 's/ .*$//'
else
    echo "0"
fi

使用该$(...)符号时,您正在执行内部命令并将其输出放在其位置。该指令if运行该指令的输出并查看它是否成功。在这种情况下,您确实想测试放入$(...).使用时引用变量也很好。

答案2

您的脚本并未尝试执行您的多变的
它正在尝试执行“grep”的输出...
它尝试执行的原因3, 的原因与if command脚本中遇到的相同。命令运行并通过if.. 测试其退出代码。您的 grep 输出呈现if 3给 bash。

if command ;then do-something; fi 没问题,因为if测试了 的退出代码command
if 3 ; then do-somethin; fi 会失败,因为3不是命令...这是一个简单的示例来指示if command...

function error() { return 1 ; }
if error  ;then echo A-cond1 ; else echo A-cond2 ;fi
if echo -n;then echo B-cond1 ; else echo B-cond2 ;fi
# `if 3` fails as you already know..
# output:
A-cond2
B-cond1

您可以轻松避免所有这些,并让“sed”处理条件测试和输出。

for var in \
  "3 things" \
  " 1 leading space" \
  "10 green bottles" \
  "albatross"
do 
  echo "$var" |sed -e "s/^\([0-9]\+\).*/\1/" \
                   -e "s/^[^0-9].*/0/"
done

输出:

3
0
10
0

相关内容