在 find 命令中 Bash 使用单引号

在 find 命令中 Bash 使用单引号

我在运行 shell 脚本时遇到了一些麻烦。我尝试根据用户输入动态生成 find 命令,但遇到的问题是我在 find 命令中的变量被括在单引号中,如前所述这里

因此,如果我回显我的变量,它们就会显示出来,-iname "*.flv"但是一旦它们进入 find 命令,它们就会-iname "*.flv"带有单引号,并且 find 命令就不会执行。

我试图实现其他 SO 线程中给出的答案,但我无法弄清楚。

知道那里出了什么问题吗?

谢谢!

if [[ ! "$medium" == "" ]]
  then
    needles=$needles' -iname "'*$medium*'"'
  fi

  echo $needles
  #-iname "*.flv"

  echo $path
  #/Users/user/Movies/

  find "$path" $needles -type f -exec basename {} \; | gshuf -n 1
  # + find '/Users/user/Movies' -iname '"*dvd*"' -type f -exec basename '{}' ';'

答案1

正如我在回答链接问题时所说,您没有神秘出现的单引号。单引号是 bash 对命令行的跟踪显示的一部分。您有的是多余的双引号,而且您自己把它们放在那里。所以不要这样做。

最好的选择是创建needles一个数组;链接问题的答案中也有一个例子,但这是针对您的特定问题的解决方案:

# Make needles an empty array
needles=()

# If medium is not empty, add two parameters to needles:
if [[ -n $medium ]]; then
  # We quote *$medium* so that the asterisks won't get glob-expanded, and 
  # so that the value won't get word split even if it includes whitespace.
  # NO QUOTES ARE ADDED TO THE VALUE.
  needles+=(-iname "*$medium*")
fi

# The expression "{needles[@]}" means:
#   expand this into each element of needles (needles[@])
#   and don't expand the elements even if they include whitespace ("")
find "$path" "${needles[@]}" -type f -exec basename {} \; | gshuf -n 1

相关内容