2017-02-03 54 views
1

我有两个变量,我想从他们的一个运行一个for循环:变了个“for循环”

a=5 
z="i=0;i<=$a;i++" 
x="i=$a;i>=1;i--" 
read -p "choose loop:" loop 
    case "$loop" in 
    plus) l="$z" ;; 
    minus) l="$x" ;; 
    esac 

for (($l)) do 
#also tried (('$l')) & (("$l")) 
    ... 
done 

当我这样做我有:

syntax error: arithmetic expression requiered 
syntax error:'(($l))' 

所以,我想:

a=5 
x="\(\(i=1;i<=$a;i++\)\)" 
#also tried "((...))" 

for $x do 
    ... 
done 
#also tried "$x" & '$x' 

但是,当我这样做是因为我得到了:

bash: '"$l"': not a valid identifier

但我只想要一个“循环结构”,我不想复制我的代码两次。
那么我该怎么做才能运行我的循环,而不必在循环内写入两次我的代码?

回答

3

可以使用seq存储在一个变量列表:

loop_max=5 
read -p "choose loop:" loop 
case "$loop" in 
    plus) myseq=$(seq 0 "$loop_max");; 
    minus) myseq=$(seq "$loop_max" -1 0);; 
esac 

for i in $myseq; do 
    echo "$i" 
done 

编辑:

您还可以设置seq参数在case声明和你for循环调用seq

loop_max=5 
read -p "choose loop:" loop 
case "$loop" in 
    plus) start="0";; 
    minus) end="-1 0";; 
esac 

for i in $(seq $start "$loop_max" $end); do 
    echo "$i" 
done 
+0

这非常优雅! – codeforester

+0

@SLePort thx很多..这正是我需要.. – user7427983

+1

感谢@codeforester。我正在考虑只使用一个'seq'命令,但我发现它的可读性会降低。 – SLePort

2

我不认为for语法允许你正在尝试做什么。相反,这样做是为了保持它的可读性更强:

loop_max=5 
read -p "choose loop:" loop 
case "$loop" in 
    plus) loop_type="ascending" 
    ;; 
    minus) loop_type="descending" 
    ;; 
esac 

[[ $loop_type == "ascending" ]] && for ((i = 0; i <= $loop_max; i++)); do 
    : your code goes here 
done 

[[ $loop_type == "descending" ]] && for ((i = $loop_max; i > 0; i--)); do 
    : your code goes here 
done 

case声明并没有太多的价值。所以,你可以重写整个事情是这样的:

loop_max=5 
read -p "choose loop:" loop_type 
if [[ $loop_type == "plus" ]]; then 
    for ((i = 0; i <= $loop_max; i++)); do 
    : your code goes here 
    done 
elif [[ $loop_type == "minus" ]]; then 
    for ((i = $loop_max; i > 0; i--)); do 
    : your code goes here 
    done 
else 
    printf "Invalid choice.\n" 
fi 
0

您可以修改您的for循环看起来像这样:

for j in $l 
do 
    echo $j; # whatever you need to do here 
done 

希望这将解决你的目的。

+0

你测试了吗?它不会以OP的方式进行迭代 - 它只会在'j'设置为'$ l'的值时运行循环一次。 – codeforester

+1

@codeforester,我看到你发布了正确的答案。我试图用他没有面对的“无效标识符”错误来解决他的问题。从你的回答可以看出,他的剧本存在多个问题。 – Rishi