"[: 매개변수가 너무 많습니다." if 문 if [ "$FILE" == "XXXX"* ] || ["$FILE"=="YYYY"*]|| ||

"[: 매개변수가 너무 많습니다." 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

관련 정보