"[: パラメータが多すぎます。" if 文 if [ "$FILE" == "XXXX"* ] || ["$FILE"=="YYYY"*]|| ||

以下のスクリプトに何が問題なのかわかりません。スペースを削除しても「[:引数が多すぎます」というエラーが発生し続けます。

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個のファイル名を保持すると機能しますが、このファイル名の数のためにエラーが発生します。

条件がある場合は段落が必要ですか?それとも別の条件が必要ですか?助けてください。

挨拶

ベストアンサー1

[[ var = pattern ]]Kornシェルのor[[ var == pattern ]]演算子(現在他のシェルではサポートされていますが、標準構文の一部ではありません)があり、文字列同等比較演算子をサポートするコマンドがshあります。[=

一部の[実装では==演算子もサポートしていますが、これは=パターンマッチングではなく文字列同一性のエイリアスです。一部[の実装(正規表現一致のための組み込み演算[yashまたはサポート演算子)は、標準+ユーティリティ構文では使用できません。zsh=~sh

[ただ普通の命令なのに、

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

次のように解釈されます。

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

"csharp-plugin"*または、シェルで次のメカニズムを介して現在のディレクトリのファイル名のリストに展開された単純なコマンドcsharp-pluginワイルドカードまたはファイル名の生成またはパス名拡張そしてそれを別々のパラメータとしてに渡します[

したがって、現在のディレクトリにcsharp-plugin1andが含まれている場合、、、および引数csharp-plugin2として呼び出され、[理解できない追加の引数について文句を言います。[csharp-plugin1==csharp-plugin1csharp-plugin2]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 シェルまたは bash シェルとそれ以降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

おすすめ記事