[英]Can I do a for loop over variables in the bash shell?
我正在學習shell,我希望能夠遍歷一些變量。 我似乎找不到任何人做過這個的地方,所以我不確定它是否可能。
基本上我只想通過對每個變量使用相同的sed命令來省去自己的麻煩。 但是代碼顯然不起作用。 我的問題是,是否可以循環變量,如果不是,我應該怎么做呢?
title="$(echo string1)"
artist="$(echo string2)"
album="$(echo string3)"
for arg in title artist album do
$arg="$(echo "$arg" | sed -e 's/&/\&/g' -e 's/</\</g' -e 's/>/\>/g')"
done
這是錯誤:
line 12: syntax error near unexpected token `$arg="$(echo "$arg" | sed -e 's/&/\&/g' -e 's/</\</g' -e 's/>/\>/g')"'
你的問題不在於循環,而在於賦值。 變量名在分配中需要是文字的,即你可以寫title=some_value
而不是$arg=some_value
。
分配給可變命名變量的可移植方法是使用eval
。 您還需要獲得價值$arg
(不只是價值arg
,這是$arg
),而這又需要使用eval
。
new_value="$(eval printf %s \"\$$arg\" | …)"
eval $arg=\$new_value
另一種分配給特定於bash / ksh / zsh但在普通sh中不起作用的變量命名變量的方法是使用內置的typeset
。 在bash中,如果在函數中執行此操作,則會使賦值對函數本地化。 要獲取變量命名變量的值,可以使用${!arg}
; 這是針對bash的。
typeset $arg="$(printf %s "${!arg}" | …)"
您的代碼段的其他問題:
title="$(echo string1)"
是一種復雜的寫入title="string1"
,如果它包含反斜杠或以-
開頭,它還可能會破壞string1
。 do
關鍵字之前需要一個命令終止符( ;
或換行符)。 如果您依賴於bash / ksh / zsh,則可以使用${VARIABLE//PATTERN/REPLACEMENT}
構造在shell中進行${VARIABLE//PATTERN/REPLACEMENT}
。
title="string1"
artist="string2"
album="string3"
for arg in title artist album; do
eval value=\$$arg
value=${value//&/&}
value=${value//</<}
value=${value//>/>}
eval $arg=\$value
done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.