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

| 我正在学习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
。 您必须在ѭ18need关键字之前使用命令终止符(
;
或换行符)。 如果您依赖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
    

要回复问题请先登录注册