我正在尝试创建一个 BASH 脚本来读取参数,测试它们是目录、普通文件、可执行文件还是符号链接文件,并将它们打印在终端上。
执行脚本时,我使用“./myscript.bash *”查看,但没有得到任何预测结果。我确实只得到“未找到”主目录中所有项目的名称。示例:
“未找到桌面”、“未找到下载”等,即使它们在我的主文件夹中,并且是目录中。有人知道我做错了什么吗?
#!/bin/bash
for i in $*; do
if [ -d “{$i}” ]; then
echo “${i} (Directory)”;
elif [ -x “{$i}” ]; then
echo “${i} (Executable)”;
elif [ -h “{$i}” ]; then
echo “${i} (Symbolic)”;
elif [ -f “{$i}” ]; then
echo “${i} (Ordinary)”;
else
echo “${i} not found”
fi
done
答案1
调试简单脚本的第一条规则:
如果不起作用,请尝试回显。
在这种情况下:
for i in $*; do
echo "testing if “{$i}” exists"
if [ -d “{$i}” ]; then
echo “${i} (Directory)”;
<... rest of the script ...>
你会立即看到答复是:
testing if “{Downloads}” exists
...
即:测试”{Downloads}”(smartquotes-accolade open-Downloads-accolade close smartquotes)是否存在。
该目录可能不存在。
对于初级 shell 脚本编写者来说,智能引号可能是一个疏忽。Bash(以及大多数其他 shell)对引号的使用非常挑剔。单引号 ( '
) 与双引号 ( "
) 的含义不同。反引号的含义也不同。智能引号是妈妈给你的,什么也不做(请原谅我引用了 Jefferson Airplane)。你肯定需要在这里使用双引号 ( "
),因为它们允许变量扩展。
接下来是{
和}
。在您echo
的中,您给出:
echo “${i} not found”
但在它if
是{$i}
。找出不同之处。如果你使用
if [ -d "${i}" ]; then
它本来会起作用。
Kamil 在评论中写道:
你几乎从来不会想要
$*
;相反,你几乎总是想要"$@"
。
他是对的。有整整几页的篇幅专门讨论和的区别$*
,"$@"
但显示区别的最简单方法是:
#!/bin/bash
echo ------------------
echo '$*'
for i in $* ; do echo $i ; done
echo ------------------
echo '"$@"'
for i in "$@" ; do echo $i ; done
echo ------------------
(我将此脚本命名为a
)并执行:
bash a 'plop 123' plop 123
------------------
$*
plop
123
plop
123
------------------
"$@"
plop 123
plop
123
------------------
答案2
@ljm 说到点子上了,我唯一想说的是,始终回应所期望的结果,并围绕此构建更好的功能。
简而言之,首先确保它能正常工作,然后让它更好地工作