我正在尝试开发一个 bash 脚本,该脚本处理可能包含空间名称的文件列表。
(我已经咨询过文件名中存在空格的脚本出现问题和为什么我无法在 bash 脚本中转义空格?,但似乎无法完善我的脚本。)
这是我的脚本。实际的过程比较复杂,我在这里简化为简单的file
命令。
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Usage is $0 <files to be tested>"
exit
fi
allfilestobetesed=$@
for filetobetested in "$allfilestobetested"
do
file "$filetobetested"
done
如何改进我的脚本?
答案1
allfilestobetested
如果可以的话,您可能应该删除变量:
for filetobetested in "$@"; do
file "$filetobetested"
done
将正确扩展
答案2
你们非常接近。首先,你正确地使用了 $@ 而不是 $*。
您需要担心 shell 扩展,因此不要"
像作业中那样使用不必要的扩展。这将消除令牌之间的界限。然而你做需要它围绕“@_”。
所以我们有:
if [ $# -eq 0 ]; then
echo "Usage is $0 <files to be tested>"
exit
fi
for filetobetested in "$@"
do
file "$filetobetested"
done
最后,我的 bash 调试器http://bashdb.sf.net可以帮助你关注这样的事情。bashdb 手册第 1.2 节描述如何设置 PS4 以从set -x
跟踪中提供更多信息。
答案3
你不需要"$@"
:
for filetobetested
do
file "$filetobetested"
done