以下のスクリプトに何が問題なのかわかりません。スペースを削除しても「[:引数が多すぎます」というエラーが発生し続けます。
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-plugin1
andが含まれている場合、、、および引数csharp-plugin2
として呼び出され、[
理解できない追加の引数について文句を言います。[
csharp-plugin1
==
csharp-plugin1
csharp-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