Linux

如何將 /* 或 / 解析為 bash shell 腳本

  • April 24, 2020

我正在嘗試編寫一個腳本,讓我在執行腳本時獲取參數。我可以在腳本中使用 $@ 來做到這一點。/*但是,如果我使用or執行腳本,它會給出or*/*中所有目錄的列表。/*``*/*

我想在腳本中作為變數得到的是值/**/*如果使用的話;/*每當執行腳本時,而不是 中的所有目錄和文件。

我知道問題在於 linux 獲取與“*”相關的值的方式。但沒有找到解決方案。

下面是一個範例腳本:

#!/bin/bash
int_v=0
get_str="$@"
for f in $get_str
do
if [ "$f" == "/*" ] || [ "$f" == "*/*" ] || [ "$f" == "/" ] || [ "$f" == "/boot" ] || [ "$f" == "/bin" ] || [ "$f" == "/root" ] || [ "$f" == "/dev" ] || [ "$f" == "/etc" ] || [ "$f" == "/sbin" ] || [ "$f" == "/home" ] || [ "$f" == "/mnt" ] || [ "$f" == "/sys" ] || [ "$f" == "/tmp" ] || [ "$f" == "/usr" ] || [ "$f" == "/var" ] || [ "$f" == "/proc" ];
then
int_v=1
else
int_v=0
fi
echo $f
done
if [ $int_v == 1 ];
then
echo "Cannot run it with the use of: */* or /* or /. "
else
echo "This script can run"
fi

還在腳本中添加了一個解決方法:因為/*是根目錄;我已經為 /bin、/root 添加了一個 if 語句……這行得通,但問題在於*/*.

任何人都知道我們如何解析執行腳本時使用的實際變數,而不是它的輸出?

當您從 shell 執行腳本時,shell 會在腳本執行之前擴展萬用字元(請參閱參考資料中的路徑名擴展man bash)。因此,腳本永遠不會看到*/*,它已經看到了所有展開的文件。

要將萬用字元表達式逐字傳遞給腳本,請引用它或反斜杠:

myscript.sh '*/*'
myscript.sh \*/\*

如果您想防止萬用字元擴展,您需要正確地對所有包含萬用字元表達式的變數進行雙引號,因為變數擴展發生在路徑名擴展之前(請參閱中的擴展man bash)。

a=*        # No expansion, assignments are special.
echo $a    # Expands the wildcard.
echo "$a"  # Outputs *.

引用自:https://serverfault.com/questions/1013785