linux - 我可以在 bash shell 中对变量进行 for 循环吗?

标签 linux shell variables

我正在学习 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),这又需要使用 评估

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//&/&amp;}
  value=${value//</&lt;}
  value=${value//>/&gt;}
  eval $arg=\$value
done

关于linux - 我可以在 bash shell 中对变量进行 for 循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6394682/

相关文章:

Linux malloc 段错误缺失

java - 在 shell 脚本中确保它不以 root 身份运行最简单的是什么?

linux - 带 GET 参数的 wget?

linux - httpd 是否在所有情况下都需要以 root 身份运行?

ruby - 在同一个 shell 进程中运行多个命令

windows - 查找文件中的特定文本

variables - Railo 中的 var 和局部作用域变量之间有明显的区别吗?

javascript - 如何根据两个不同的输入动态设置链接的路径?

r - 如何找出变量是R中的因子还是连续的

linux - Linux 上的共享库 : why does the dynamic linker run in user context?