Caseステートメントで複数の条件を一致させて変数として渡すことはできますか?

Caseステートメントで複数の条件を一致させて変数として渡すことはできますか?

大文字と小文字の変数を設定したいbashスクリプトがあります。 file1には2つの異なる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

あなたが望むロジックがうまくいかないようです。変数に2つの値を割り当てることはできず、2番目の値を割り当てると最初の値が失われます。これは、これが決して望むことをしないことを意味します。

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

したがって、ファイルのコピーを2つ作成するには、異なる方法を使用する必要があります。

以下はいくつかのアイデアです(変数名を小文字に変更しました。シェルスクリプト変数名に大文字を使用すると、慣例によってグローバル環境変数がすべて大文字であるため、命名の競合が発生し、問題をデバッグするのが難しい可能性があるため、悪い習慣です)。

  • ステートメントから 1 つのコピーをコピー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
    

    この方法の1つの欠点は、移動ではなくコピーを介してすべての操作を実行するため、最初の方法で1つ以上のタスクがあるため、少し遅くなることですmv。 1つ以上を持つことはできませんが、mv少なくとも1つになるように変更できるため、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
    

関連情報