Linux
如何將 /* 或 / 解析為 bash shell 腳本
我正在嘗試編寫一個腳本,讓我在執行腳本時獲取參數。我可以在腳本中使用 $@ 來做到這一點。
/*
但是,如果我使用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 *.