‘:toomany一個__uments___時間__________[’$F我樂_’==‘XXXX’:噸○○米一個n是的一個rG你米en噸s’一世Fs噸一個噸e米en噸一世F[’$F我大號乙“==”XXXX’: too many arg…
即使我刪除了空格,我也不確定下面的腳本有什麼問題,但我仍然遇到錯誤“[:參數太多”
oldPlugin="/old/plugins/" cd "$oldPlugin" || true for FILE in *; do if [ "$FILE" == "csharp-plugin"* ] || [ "$FILE" == "flex-plugin"* ] || [ "$FILE" == "go-plugin"* ] || [ "$FILE" == "html-plugin"* ] || [ "$FILE" == "iac-plugin"* ] || [ "$FILE" == "jacoco-plugin"* ] || [ "$FILE" == "java-plugin"* ] || [ "$FILE" == "javascript-plugin"* ] || [ "$FILE" == "kotlin-plugin"* ] || [ "$FILE" == "php-plugin"* ] || [ "$FILE" == "python-plugin"* ] || [ "$FILE" == "ruby-plugin"* ] || [ "$FILE" == "scala-plugin"* ] || [ "$FILE" == "vbnet-plugin"* ] || [ "$FILE" == "xml-plugin"* ]; then rm -rf "$extensionPlugin"/"$FILE" fi done
如果我對指定的文件執行 rm -rf 它會刪除它,但是當我添加 if 條件時它會給我錯誤,如果我在 if 條件下繼續說 5 或 6 個文件名它可以工作但如果我保留更多它會給我錯誤,
如果條件或需要其他條件,我是否需要做空,請幫助
問候
有 Korn shell 的
[[ var = pattern ]]
or[[ var == pattern ]]
運算符(現在其他一些 shell 也支持,但不是標準sh
語法的一部分),還有[
支持=
字元串相等比較運算符的命令。一些
[
實現==
也支持運算符,但這只是=
字元串相等的別名,而不是模式匹配。一些[
實現,如[
內置的yash
或zsh
支持正則表達式匹配的運算符,但同樣,這在標準+ 實用程序語法=~
中不可用。sh
[
只是一個普通的命令,[ "$FILE" == "csharp-plugin"* ]
解釋為:
echo "$FILE" == "csharp-plugin"* ]
或任何簡單的命令,
"csharp-plugin"*
並由 shell 擴展為目前目錄中的文件名列表,這些文件名csharp-plugin
通過稱為globbing或文件名生成或路徑名擴展的機制開始,並將它們作為單獨的參數傳遞給[
.因此,如果目前目錄包含
csharp-plugin1
andcsharp-plugin2
,[
將使用[
,csharp-plugin1
,==
,csharp-plugin1
,csharp-plugin2
and]
作為參數呼叫,並抱怨csharp-plugin2
它無法理解的額外參數。模式匹配
sh
是通過case
構造完成的。oldPlugin="/old/plugins/" cd -- "$oldPlugin" || exit for FILE in *; do case "$FILE" in (csharp-plugin* | flex-plugin* | go-plugin* |...) rm -rf -- "$extensionPlugin"/"$FILE";; esac done
如果您想使用
if
, 構造,您可以定義一個輔助函式,例如:match() case $1 in ($2) true;; (*) false;; esac
並將其用作:
if match "$FILE" 'csharp-plugin*' || match...; then ... fi
在 Korn shell 或 bash shell 及之後
shopt -s extglob
(在最新版本中不需要bash
)或 zsh 及之後set -o kshglob
),您還可以執行以下操作:if [[ $FILE = @(csharp|flex|go|...)-plugin* ]]; then...
在
zsh
, 沒有kshglob
, 交替只需簡單地完成:if [[ $FILE = (csharp|flex|go|...)-plugin* ]]; then...
在
sh
中,您可以通過以下方式簡化一點:oldPlugin="/old/plugins/" cd -- "$oldPlugin" || exit for FILE in *-plugin*; do case "${FILE%%-plugin*}" in (csharp | flex | go |...) rm -rf -- "$extensionPlugin"/"$FILE";; esac done