2017-02-03 52 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