Shell-Script

‘:toomany一個__uments___時間__________[’$F我樂_’==‘XXXX’:噸○○米一個n是的一個rG你米en噸s’一世Fs噸一個噸e米en噸一世F[’$F我大號乙“==”XXXX’: too many arg…

  • August 1, 2022

即使我刪除了空格,我也不確定下面的腳本有什麼問題,但我仍然遇到錯誤“[:參數太多”

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語法的一部分),還有[支持=字元串相等比較運算符的命令。

一些[實現==也支持運算符,但這只是=字元串相等的別名,而不是模式匹配。一些[實現,如[內置的yashzsh支持正則表達式匹配的運算符,但同樣,這在標準+ 實用程序語法=~中不可用。sh

[只是一個普通的命令,

[ "$FILE" == "csharp-plugin"* ]

解釋為:

echo "$FILE" == "csharp-plugin"* ]

或任何簡單的命令,"csharp-plugin"*並由 shell 擴展為目前目錄中的文件名列表,這些文件名csharp-plugin通過稱為globbing文件名生成路徑名擴展的機制開始,並將它們作為單獨的參數傳遞給[.

因此,如果目前目錄包含csharp-plugin1and csharp-plugin2[將使用[, csharp-plugin1, ==, csharp-plugin1, csharp-plugin2and]作為參數呼叫,並抱怨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

引用自:https://unix.stackexchange.com/questions/711995