我正在编写一段bash脚本,它循环输出命令替换的结果,并在循环体内尝试执行另一个命令替换。以下是代码:
我将IFS设置为换行符,这样循环就可以遍历xmllint命令的每个输出“LINE”,而不是遍历每个以空格分隔的单词。 然而,这使得循环内的命令替换失败。一些调试工作得出结论,问题的本质在于:
您可以看到,在第一个代码示例中,我尝试通过在循环内部重置IFS来修复问题。但那并没有起作用。
我意识到我可以使用不同的脚本风格来解决这个问题。
例如,将xmllint命令的进程替换为awk而不是对每个单独行执行awk等等。 欢迎您提出相关评论,但请提交与以下相关的答案:
更新: 根据与Barmar的讨论,IFS用于命令/变量扩展后进行词拆分。
#!/usr/bin/bash
IFS=$'\n'
for i in $( xmllint --xpath "string(/*[local-name()='Project'])" gsGDAL/gsGDAL.vcxproj.user )
do
IFS=' ' #attempted with and without this line
"$( awk -F= '{printf("export %s=\"%s\"", $1, $2)}' <(echo $i) )"
IFS=$'\n' #attempted with and without this line
done
我将IFS设置为换行符,这样循环就可以遍历xmllint命令的每个输出“LINE”,而不是遍历每个以空格分隔的单词。 然而,这使得循环内的命令替换失败。一些调试工作得出结论,问题的本质在于:
#!/usr/bin/bash
IFS=$'\n'
$(echo export TEST="test")
出现以下错误:
./x.sh: line 6: export TEST=test: command not found
您可以看到,在第一个代码示例中,我尝试通过在循环内部重置IFS来修复问题。但那并没有起作用。
我意识到我可以使用不同的脚本风格来解决这个问题。
例如,将xmllint命令的进程替换为awk而不是对每个单独行执行awk等等。 欢迎您提出相关评论,但请提交与以下相关的答案:
- 为什么将IFS设置为换行符会损坏命令替换生成的导出项?
- 为什么在循环中重置IFS不能修复问题?
更新: 根据与Barmar的讨论,IFS用于命令/变量扩展后进行词拆分。
export TEST="test"
解释为单个标记吗?如果是这样,那么为什么eval不受此影响(当我使用eval时,我的代码无需将IFS重置为空格即可正常工作)? - user2141130eval
之前执行IFS=' '
。 - BarmarIFS
仅用于命令/变量扩展后的单词拆分,而不是解析命令本身。 - Barmar