我有一个 bash 脚本,我想在其中设置 case 变量。对于 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.
因此,为了制作文件的两个副本,您需要使用不同的方法。
这里有一些想法(请注意,我将变量名称改为小写:使用大写字母作为 shell 脚本变量名称是不好的做法,因为按照惯例,全局环境变量都是大写的,因此这可能会导致命名冲突和难以调试的问题):
在声明中复制一份
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