我想了解bash好一点,因为我显然很可怕......
我正在尝试生成一系列恒定宽度的整数,但是然后测试它们以针对特定值执行特殊操作。像这样:
for n in $(seq -w 1 150)
do
# The next line does not work: doit.sh: line 9: XX: command not found
#decval= $( echo ${n} | sed 's/^0//g' | sed 's/^0//g' )
#if [[ ${decal} -eq 98 ]] ; then
if [[ $( echo ${n} | sed 's/^0//g' | sed 's/^0//g' ) -eq 98 ]] ; then
echo "Do something different for 98"
elif [[ $( echo ${n} | sed 's/^0//g' | sed 's/^0//g' ) -eq 105 ]] ; then
echo "Do something different for 98"
fi
done
这个脚本适用于我的目的,但是如果我尝试进行赋值'decval = $(......'我得到错误'命令未找到'。我不明白这个,有人可以解释一下吗?
此外,如果我有大量例外以防止长列表if,我可以对此脚本进行改进吗?那么elif ......?
答案 0 :(得分:6)
问题出在=
和$
:
decval= $(…
你应该写不带空格:
decval=$(...
因为,如果你编写空格,你的shell会将decval=
读作declval=""
并将$(echo...)
的结果视为要执行的命令的名称,显然它不会找到命令。
另外(只是一个小优化),你可以写:
sed 's/^0\+//'
而不是
sed 's/^0//g' | sed 's/^0//g'
下面:
0\+
表示0
一次或多次; g
已删除,因为g
表示替换字符串中的所有出现,并且您只有一次出现(^
只能在字符串中出现一次)。此外,您可以使用前导零检查变量,而不使用sed
:
[[ "$n" =~ "0*98" ]]