我在运行 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