【问题标题】:bash variable expansion and quoting for part of find command [duplicate]部分查找命令的bash变量扩展和引用[重复]
【发布时间】:2016-07-20 16:15:03
【问题描述】:

我在 Bash 脚本中有如下代码:

FileNames=""
while read -r FileName; do
    ...
    FileNames+=" -o -iname \"$FileName\""
    ...
done <"$ListOfFileNames"
FileNames="${FileNames# -o }"
find foo -type f \( $FileNames \)

这通常对我有用,直到我发现某些文件名包含空格(可能还有其他特殊字符)。当我围绕使用 $FileName 添加额外的引用来涵盖这些情况时,$FileNamesfind 命令中的扩展开始出现异常。我尝试了其他各种引用和转义的方法,但结果都是空的。我已经在我编写的许多其他脚本中以许多其他方式成功地使用了变量,但是这个让我感到困惑。我在 Cygwin 下运行脚本。有什么好的方法来处理这个吗?

【问题讨论】:

  • 我自己只是在寻找这个问题的答案。 Here ya go.
  • Barmar,您提供的参考资料没有显示我搜索的方式,但我认为它基本上是相同的问题。但是,我会说它不是“完全重复”,因为它不必处理引用嵌套扩展然后删除部分变量(我第一次尝试数组方法时弄错了)。跨度>
  • 丹尼尔,我实际上并没有看到你的链接发送给我的地方解释了我在命令中的变量扩展问题,但现在它是桥下的水。

标签: bash variable-expansion


【解决方案1】:

使用数组。数组可以更好地处理空白。为了更加安全,还可以使用IFS= 来保留前导空格和read

FileNames=(-false)
while IFS= read -r FileName; do
    ...
    FileNames+=(-o -iname "$FileName")
    ...
done < "$ListOfFileNames"
find foo -type f \( "${FileNames[@]}" \)

【讨论】:

  • 谢谢约翰,这行得通,但我必须弄清楚如何正确获得 FileNames="${FileNames# -o }" 功能。起初我只是将第一个数组元素设置为“”,但这不起作用。 unset 确实有效。
猜你喜欢
  • 2013-09-29
  • 2014-01-28
  • 2010-12-15
  • 2013-11-30
  • 1970-01-01
  • 2021-04-25
相关资源
最近更新 更多