bash 脚本大小写切换

bash scripting case switch

我正在尝试在 bash 脚本的 case 语句中初始化一个变量,

function cpfiles(){
case  in
        a) echo "a" ; source = ${HOME}/dev/a.zip ; dest = 'PROGRA~2\a.zip';;
        b) echo "b" ; source = ${HOME}/dev/b.zip ; dest = PROGRA~2\b.zip;;
        *) echo "INVALID MODULE !" ;;
esac

echo ${source} ${dest}
}

但我收到此错误:

[#] cpfiles a
a
bash: =: No such file or directory
bash: dest: command not found...

我错过了什么?

shell 中的赋值 不要在 = 周围使用空格。 某些命令期望单个 = 作为参数是完全有效的。

你得到 =: No such file or directory 因为 source 是一个试图打开指定文件的 shell 命令:

source: source filename [arguments]
    Execute commands from a file in the current shell.

dest: command not found因为后半部分被当作运行命令dest.

你的脚本包含这个:

a) echo "a" ; source = ${HOME}/dev/a.zip ; dest = 'PROGRA~2\a.zip';;
b) echo "b" ; source = ${HOME}/dev/b.zip ; dest = PROGRA~2\b.zip;;

问题:

  • source 是一个 shell 内置
  • 您在 = 符号前后添加了额外的空格。您可能会发现它更容易阅读,但它是无效的 shell 语法。

因此,您实际上不是在为名为 source 的变量赋值,而是在调用 source 内置函数,将其作为参数传递给 =

试试这个:

a) echo "a" ; source=$HOME/dev/a.zip ; dest='PROGRA~2\a.zip';;
b) echo "b" ; source=$HOME/dev/b.zip ; dest='PROGRA~2\b.zip';;

请注意 HOME 两边的大括号虽然完全有效,但并不是必需的,因为变量名结束的位置没有歧义(/ 在变量名中无效,因此shell 解析时停在那里)。大多数人会在赋值时使用双引号,但当赋值的字符串不包含空格时不需要双引号(即使它的扩展值包含空格)。

最后一期...在其中一种情况下,您单引号 dest 的指定值,并且还转义了反斜杠。这将产生一个包含两个反斜杠的值,我认为这不是您想要的。删除引号或反斜杠之一。

空格在bash中很重要,用于分割参数;设置一个变量

source=${HOME}/dev/a.zip

因为 source 是一个命令,下面的命令试图打开不存在的文件 =

source = ...

脚本中有两件重要的事情导致了错误:

1. source : 它是一个 shell 变量,可用于将任何函数文件加载到当前 shell 脚本或命令提示符中。 它从给定的 FILENAME 和 return.

读取并执行命令

2。 "=" in Unix a=b without space treated as assignment operator and a = b used for comparison of two strings 或者你可以签入条件语句,如 [[ $str1 == $str2 ] .它是字符串相等性检查的替代方法。

此外,$HOME 足以代替 ${HOME} 来获取变量的值,但如果您正在使用它,则不会出现任何错误。请参阅以下上下文。

*$回显${SHELL}

/bin/bash

$ 回声 $SHELL

/bin/bash*