Linux 我可以在bashshell中对变量执行for循环吗?

Linux 我可以在bashshell中对变量执行for循环吗?,linux,shell,variables,Linux,Shell,Variables,我正在学习shell,我希望能够循环一些变量。我似乎找不到任何地方有人这样做,所以我甚至不确定这是否可能 基本上,我只是想通过对每个变量使用相同的sed命令来避免麻烦。然而,代码显然不起作用。我的问题是,有可能循环变量吗?如果没有,我应该怎么做 title="$(echo string1)" artist="$(echo string2)" album="$(echo string3)" for arg in title artist album do $arg="$(echo "$a

我正在学习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
title=“$(echo string1)”
艺人=“$(回声弦2)”
相册=“$(回音字符串3)”
对于标题艺术家专辑中的arg,请执行以下操作:
$arg=“$(echo“$arg”| sed-e's/&/\&;/g'-e's//\/g')”
完成
以下是错误:

line 12: syntax error near unexpected token `$arg="$(echo "$arg" | sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g')"'
第12行:意外标记“$arg=”$(echo“$arg”| sed-e's/&/\&;/g'-e's//\/g')”附近的语法错误

你的问题不在于循环,而在于分配。变量名在赋值中必须是文字,即您可以编写
title=some\u value
,但不能编写
$arg=some\u value

分配给变量命名变量的可移植方法是使用
eval
。您还需要获得
$arg
的值(不仅仅是
arg
的值,即
$arg
),这同样需要使用
eval

new_value="$(eval printf %s \"\$$arg\" | …)"
eval $arg=\$new_value
另一种分配给变量命名变量的方法是使用内置的
字体,该变量特定于bash/ksh/zsh,但在纯sh中不起作用。在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
title=“string1”
艺人=“string2”
相册=“string3”
为标题艺术家专辑中的arg;做
评估值=\$$arg
value=${value/&/&;}
value=${value//}
eval$arg=\$value
完成

运行代码时出现了什么错误?(假设您所指的是语法突出显示尚未向您指出的内容…)解决此类问题的另一种常见方法是执行以下操作:这太棒了。我试过了,但实际上它不太管用(我正在尝试便携式路线)。下面是我的想法:
new\u value=“$(eval printf%s\”\$$arg\”\124; sed-e's/&/\&;/g'-e's/\\\/g')“eval arg=\$new\u value
我必须在printf语句中添加第二个$,否则新的值将等于“title”“album”或“artist”。我还从第二个eval语句中删除了$,否则将等于“title”等。。哦,出于好奇,为什么第二行上必须有一个“$before new”值,而不仅仅是$?@Dennis:对不起,
printf
调用中缺少的
$
是一个打字错误。我看不出其他人有什么问题,你指的是哪一个?在
eval$arg=\$new\u value
中,要计算的字符串类似于
title=$new\u value
,它将
new\u value
的值分配给变量
title
。如果编写了
eval$arg=$new\u value
,则要计算的字符串将是例如
title=撇号(')
:新值将用作shell代码,而不是文本字符串。