hig*_*dth 1 bash variable-assignment
我想更好地理解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
Run Code Online (Sandbox Code Playgroud)
这个脚本适用于我的目的,但是如果我尝试将赋值'decval = $(...'我得到一个错误'命令找不到'.我不明白这个,有人可以解释一下吗?
此外,如果我有大量例外以防止长列表if,我是否可以对此脚本进行改进; 然后elif ...?
问题是在之间的空间=和$:
decval= $(…
Run Code Online (Sandbox Code Playgroud)
你应该写不带空格:
decval=$(...
Run Code Online (Sandbox Code Playgroud)
因为,如果你写的空间,你的shell读取decval=作为declval=""和治疗的结果$(echo...)作为命令的名称来执行,显然它没有找到该命令.
另外(只是一个小优化),你可以写:
sed 's/^0\+//'
Run Code Online (Sandbox Code Playgroud)
代替
sed 's/^0//g' | sed 's/^0//g'
Run Code Online (Sandbox Code Playgroud)
这里:
0\+意味着0一次或多次;g被删除,因为g意味着替换字符串中的所有出现,并且您只有一次出现(^在字符串中只能出现一次).此外,您甚至可以使用前导零检查变量,而无需sed:
[[ "$n" =~ "0*98" ]]
Run Code Online (Sandbox Code Playgroud)