簡體   English   中英

我可以在bash shell中對變量執行for循環嗎?

[英]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/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g')"
done

這是錯誤:

line 12: syntax error near unexpected token `$arg="$(echo "$arg" | sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/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//&/&amp;}
  value=${value//</&lt;}
  value=${value//>/&gt;}
  eval $arg=\$value
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM