大文字と小文字の変数を設定したい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