대소문자 변수를 설정하려는 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