我正在嘗試創建一個 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)對於引號的使用非常挑剔。單引號 ( '
) 與雙引號 ( ) 的意思不同"
。反引號也有不同的意義。智能引言是母親給你的引言,根本不要做任何事(如果你原諒我的傑佛遜飛機參考)。您肯定需要這裡的雙引號 ( "
),因為它們允許變數擴展。
接下來是{
和}
。echo
echo “${i} not found”
但在它if
是{$i}
。指出不同。如果你用過
if [ -d "${i}" ]; then
它會起作用的。
卡米爾在評論中寫道:
你幾乎不想要
$*
;你幾乎總是想要"$@"
相反。
他是對的。有完整的頁面專門討論$*
和的區別"$@"
,但顯示區別的最簡單方法是:
#!/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 擊中要害,我唯一要說的擴展就是始終回顯所需的結果並圍繞該結果構建更好的功能。
簡而言之,首先確保它有效,然後使其更好地工作