base10 不起作用

base10 不起作用

我最近开始使用 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

相关内容