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

如何解决我可以在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
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?