在我的 bash 脚本中,我尝试使用数字作为输入变量for
for 循环,我将脚本运行为
./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}
大括号仍然在那里,因为它们没有被大括号扩展所消耗。
至于解决方案,请参见拉曼·赛洛帕尔的回答。