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/

相关文章:

mysql - 带有追加模式的 tee 命令从 mysql 命令行给出错误

regex - sed,替换#include 中的反斜杠

linux - 在脚本中启用作业控制时,为什么无法捕获进程信号?

Java 全局变量作用域

java - 使用不同的变量循环?

python - Beeware 'briefcase create' 要求 cairo >= 1.15.10

linux - 如何绕过 bash 中的 CRLF 标签?

linux - 如何传递变量来执行外部操作而不是 bash 中的命令参数

variables - 我可以在配置单元中使用变量替换来获取值列表吗?

linux - 如何在 LINUX 中有选择地创建指向另一个目录中特定文件的符号链接(symbolic link)?