可以在一个 case 语句中匹配多个条件并将它们作为变量传递吗?

可以在一个 case 语句中匹配多个条件并将它们作为变量传递吗?

我有一个 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
    

相关内容