我想编写一个简单的bash脚本来包装bash中的默认unix / linux查找程序,以找到匹配的多个文件。
这是我的名为#!/bin/bash
patt=""
first=true
for i in "$@"; do
if [ "$first" = true ]; then
patt="-name '$i'"
first=false
else
patt="${patt} -o -name '$i'"
fi
done
echo "$patt"
find . -type f \( ${patt} \)
echo 'done'
的程序:
find
假设我有一些my_find_command icon.png profile.png
命令可以返回某些文件的文件。
但是当我打电话给{{1}}时,我什么也没得到。
这里出了什么问题?。
答案 0 :(得分:3)
字符串中的引号不按您希望的方式工作。你是./my_find_command icon.png
找不到icon.png
的,这是正确的。但是,它会找到'icon.png'
。例如:
$ ls
'icon.png' my_find_command
$ ./my_find_command my_find_command icon.png
-name 'my_find_command' -o -name 'icon.png'
./'icon.png'
done
问题来自于尝试将多个命令参数放入变量中。有关出错的方法的完整说明,请参阅 "I'm trying to put a command in a variable, but the complex cases always fail!"。相反,使用数组:
#!/bin/bash
patt=()
for i in "$@"; do
if [ "${#patt}" -eq 0 ]; then
patt=(-name "$i")
else
patt+=(-o -name "$i")
fi
done
echo "${patt[@]}"
find . -type f \( "${patt[@]}" \)
echo 'done'
现在打印正确的文件:
$ ls
'icon.png' icon.png my_find_command
$ ./my_find_command my_find_command icon.png
-name my_find_command -o -name icon.png
./icon.png
./my_find_command
done
要证明通配符正常工作:
$ ls
'icon.png' icon.png my_find_command
$ ./my_find_command my_find_command '*icon.png*'
-name my_find_command -o -name *icon.png*
./icon.png
./my_find_command
./'icon.png'
done