我最近开始使用 bash 脚本,并尝试编写一个从 0000 到 9999 计数的脚本 - 我认为这是一个相当简单的任务。然后我遇到了 bash 将 0007 作为八进制并给出 0009 错误的问题。我找到了使用 base10 的解决方案,但它不起作用。我究竟做错了什么?这是有问题的代码:
guess=0000
for guess in $(seq -f "%04g" 0000 9999)
do
echo $((10#guess))
guess=$((10#guess+1))
done
答案1
您错过了$
变量名称之前的 ( $guess
),以将其标记为变量扩展:
for guess in $(seq -f "%04g" 0000 9999)
do
echo $((10#$guess))
guess=$((10#$guess+1))
done
否则,算术扩展将按字面意思$(())
进行计算guess
,而不是其值,从而导致值对于基数来说太大的错误。
答案2
请注意,您的循环有点多余,for
将设置guess
为 打印的所有值seq
,您不需要自己更改该值。
for guess in $(seq -f "%04g" 0000 9999) ;do
guess=$((10#guess+1))
done
事实上,for
循环几乎覆盖了您所做的分配,与此相比:
$ for x in 9 6 3 ; do echo $x; x=1 ; done
9
6
3
(所分配的值1
永远不会被打印。)
所以,只要这样就可以了:
$ for x in $(seq -f "%04g" 1 2) ; do echo $x; done
0001
0002
或者您可以使用printf
以下方法获取所需格式的号码:
$ for x in $(seq 1 2) ; do printf "%04d\n" $x; done
0001
0002
我认为有些系统没有seq
,所以你需要不需要。在 Bash 中,这应该有效:
$ for (( x=0 ; x < 100 ; x++ )) ; do
printf "%04d\n" $x
done