bash 脚本 – for i in {x..y}

bash 脚本 – for i in {x..y}

我正在用 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

  1. 对不起,我的英语不好
  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}”。

相关内容