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*
我正在尝试在 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*