Case 문에서 여러 조건을 일치시켜 변수로 전달할 수 있나요?

Case 문에서 여러 조건을 일치시켜 변수로 전달할 수 있나요?

대소문자 변수를 설정하려는 bash 스크립트가 있습니다. file1에는 두 개의 서로 다른 NUMBER 변수가 있으며 이를 텍스트 파일에 전달하고 싶습니다.

나는 다음을 시도했습니다 :

case $FILE in
   "file1")
    NUMBER="12";;&
    NUMBER="34";;&
   "file2")
    NUMBER="56";;
esac

mv textfile.txt $NUMBER.txt

file1의 출력이 다음과 같기를 원합니다.

12.txt
24.txt 

다음 오류가 발생합니다.

syntax error near unexpected token `;;&'

추천 메뉴가 무엇인가요? 매우 감사합니다.

답변1

당신이 원하는 논리가 작동하지 않는 것 같습니다. 변수에 두 개의 값을 할당할 수 없으며 두 번째 값을 할당하면 첫 번째 값이 손실됩니다. 이는 이것이 결코 원하는 것을 수행하지 않음을 의미합니다.

number=1 ## $number is now 1
number=2 ## $number is now 2, and the original value 1 has been replaced.

따라서 파일의 복사본을 두 개 만들려면 서로 다른 방법을 사용해야 합니다.

다음은 몇 가지 아이디어입니다(변수 이름을 소문자로 변경했습니다. 쉘 스크립트 변수 이름에 대문자를 사용하는 것은 관례에 따라 전역 환경 변수가 모두 대문자이므로 이름 지정 충돌이 발생하고 문제를 디버그하기 어려울 수 있으므로 나쁜 습관입니다).

  • 명령문에서 하나의 사본을 복사 case한 다음 다른 사본을 복사하십시오.

    case $file in
      "file1")
        cp textfile.txt 23.txt
        number="34";;
       "file2")
        number="56";;
    esac
    
    mv textfile.txt $number.txt
    
  • 대신 배열을 사용하세요

    case $file in
      "file1")
        numbers+=(23 34);;
       "file2")
        numbers+=(56);;
    esac
    
    for number in "${numbers[@]}"; do
      cp textfile.txt "$number".txt
    done
    rm textfile.txt
    

    이 방법의 한 가지 단점은 이동이 아닌 복사를 통해 모든 작업을 수행하므로 첫 번째 방법에 작업이 하나 이상 있으므로 약간 느려진다는 것입니다 mv. 하나 이상을 가질 수는 없지만 mv적어도 하나가 되도록 수정할 수 있으므로 mv첫 번째 방법만큼 빠릅니다.

    case $file in
      "file1")
        numbers+=(23 34);;
       "file2")
        numbers+=(56);;
    esac
    
    ## Iterate over all except the first element of the array
    for number in "${numbers[@]:1}"; do
      cp textfile.txt "$number".txt
    done
    ## move the file using the first number in the array
    mv textfile.txt "${numbers[0]}".txt
    

관련 정보