繁体   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