我正在学习 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
),这又需要使用 评估
。
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 中进行替换。
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
关于linux - 我可以在 bash shell 中对变量进行 for 循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6394682/