如何在bash的for循环中将输入参数转换为整数值?

如何在bash的for循环中将输入参数转换为整数值?

在我的 bash 脚本中,我尝试使用数字作为输入变量forfor 循环,我将脚本运行为

./script.sh InputFolder/ Number_of_iterations

Number_of_iterations该脚本应该在给定文件夹内运行,并根据变量设置的次数运行 for 循环。但不知怎的,我无法将变量设置为整数。

这是我在脚本中循环的一个示例:

for i in {1..$(($2))}
do
 echo "Welcome $i times"
done

我已经尝试过双括号$(($...))选项以及双引号"...",但我不断得到的输出是

Welcome {1..5} times

这让我想,这不是一个整数。如果您能将输入参数作为整数读取到脚本中,我将不胜感激。

答案1

您可以通过两种方式执行此操作:

使用 ksh93 兼容的 shell(ksh93、zsh、bash):

for (( i=1;i<=$2;i++ ))
do
 echo "Welcome $i times"
done

这里我们将 i 设置为 1 并循环,递增它直到小于或等于 $2,输出:

Welcome 1 times
Welcome 2 times

使用 GNU 系统上的 POSIX shell:

for i in $(seq "$2")
do
 echo "Welcome $i times"
done

seq命令(GNU 特定)将在不同的行上输出从 1 到 $2 中指定的数字。假设您尚未修改$IFS(默认情况下包含行分隔符),命令替换会将其拆分为要for循环的尽可能多的元素。

答案2

在重击中您尝试使用的此构造:{1..$(($2))}or{1..$2}是大括号扩展。它对您不起作用的原因是,在外壳扩展的顺序中,大括号扩展是第一个。因此,这种扩展何时发生$2仍然只是$2,而不是5如您所愿。那么大括号扩展不起作用。它只是生成1..$2,然后当需要扩展 时$2,shell 就会执行此操作,然后您就只剩下了这个单词:

{1..5}

大括号仍然在那里,因为它们没有被大括号扩展所消耗。

至于解决方案,请参见拉曼·赛洛帕尔的回答

相关内容