我需要使用仅在运行时已知的值为find
建立参数列表。我试图用数组来做到这一点。使用数组构建参数列表
下面是使用硬编码值的简化版本。当我回应这个命令时,它看起来是正确的(当我手动运行它时,它会做我期望的)。当它进入for-loop时,它似乎在运行find
(因为当我手动运行时,我可以看到与其他用户拥有的目录相同的错误Permission denied
)。但是在for循环中,它不会回显手动运行发现的任何.txt
文件。
我做错了什么?
#!/bin/bash
args=(/tmp -iname \"*.txt\")
#args+=(-o -iname \"*.jpg\")
echo command will be: find ${args[@]}
for f in $(find ${args[@]}); do
echo found $f
done
下面接受的答案正确地确定了问题。但是,如果我添加一个额外的-iname
条款,我的剧本“忽略”除了最后详见这里:
#!/bin/bash
args=($1)
args+=(-maxdepth $2)
args+=(-iname "*$3")
args+=(-o -iname "*$4")
echo command will be: find "${args[@]}"
find "${args[@]}" -print 2>/dev/null | while read -r f; do
echo found "$f"
done
例如,当/home/me 2 .jpg .png
称这种正确的呼应,该命令将find /home/me -maxdepth 2 -iname *.jpg -o -iname *.png
但当时只有我的脚本回应它找到的.png
文件。
引用您的变量。 (例如''$ {args [@]}“',”$ f“等)。也不要像这样读取find的输出。 http://mywiki.wooledge.org/DontReadLinesWithFor http://mywiki.wooledge.org/BashFAQ/001 –
请勿转义引号。 – Barmar