Bash 脚本没有按预期打印出来。我的脚本有什么问题?

Bash 脚本没有按预期打印出来。我的脚本有什么问题?

我正在尝试创建一个 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 说到点子上了,我唯一想说的是,始终回应所期望的结果,并围绕此构建更好的功能。

简而言之,首先确保它能正常工作,然后让它更好地工作

相关内容