我有一个非常短的 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