我正在用 bash 编写一个脚本,我想将括号中的两个数字,准确地说是 x 和 y,作为变量。
我是这样编写脚本的:
echo "x?"
read x
echo "y"
read y
for i in {$x..$y}
但它不起作用。
我该如何设置它才能让它发挥作用?
提前致谢。
答案1
使用这个简单的bash
解决方案:
for ((i=$x;i<=$y;i++))
在使用以下功能之前,请阅读以下内容!
对于数字序列,您可以使用seq
:
for i in $(seq $x $y)
如果你确实需要括号扩展,你可以使用eval
:
for i in $(eval echo {$x..$y})
免责声明:
eval
是邪恶的。这个案例是一个很好的例子:如果用户输入的$(do_something_evil)
不是数字,do_something_evil
则会执行。因此在使用之前eval
,请确保您的输入不是恶意的。这同样适用于seq $x $y
。
如果您仍然想使用其中一个功能,请测试用户输入,这通常是一个好主意:如何在 Bash 中测试某个变量是否为数字?
答案2
- 对不起,我的英语不好
- 你可以这样做:
在 bash 中
echo -n "x: "; read x
echo -n "y: "; read y
对 {$x..$y} 的“赞”
for i in $(echo "echo {$x..$y}" | /bin/bash) do echo $i done
或更短
/bin/bash -c "echo {$x..$y}" | tr " " "\n"
使用 awk
echo "$x:$y" | awk -F ":" '{while($1<=$2){print $1; $1++}}'
使用 xargs
bash -c "echo {$x..$y}" | xargs --max-args=1 # or use -n instead --max-args. The same with parallel
与并行
parallel -d " " --max-args=1 echo :::: <(bash -c "echo {$x..$y}" )
在 zsh 中
for i in {$x..$y}
do
echo $i
done
在所有情况下,结果几乎都相同。
在您的代码中:
for i in {$x..$y}
不起作用,因为括号扩展比变量扩展具有更高的优先级。您可以在 中阅读man bash
。
我的意思是,{$x..$y}
不是{1..6}
扩展,或者其他什么,因为假设相反,即变量扩展比括号扩展具有更高的优先级,那么$y
和$x
也不会扩展{$x..$y}
,然后它只是逐字打印“{1..6}”,即首先打印“{$x..$y}”并且不能进行括号扩展,因为$x
和$y
不是整数,然后扩展变量并打印“{1..6}”。