我正在尝试在bash脚本中的mysql server is up on port
语句中初始化变量,
case
但是我收到了这个错误:
function cpfiles(){
case $1 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}
}
我错过了什么?
答案 0 :(得分:2)
您的脚本包含以下内容:
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停止在那里解析)。大多数人都会在分配中使用双引号,但是当分配的字符串不包含空格时(即使其扩展值不包含),也不需要双引号。
最后一个问题......在其中一个案例中,您将单引用/
的指定值,并转义反斜杠。这将产生一个包含两个反斜杠的值,我认为这不是你想要的。删除引号或其中一个反斜杠。
答案 1 :(得分:1)
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
。
答案 2 :(得分:1)
空格在bash中很重要,用于分割参数;设置变量
Mlist
由于source=${HOME}/dev/a.zip
是一个命令,以下命令正在尝试打开不存在的文件source
=
答案 3 :(得分:0)
脚本中有两个重要因素导致错误:
<强> 1。 source:它是一个shell变量,可用于将任何函数文件加载到当前shell脚本或命令提示符中。 它从给定的FILENAME中读取并执行命令并返回。
<强> 2。 Unix中的“=” a = b没有将空格视为赋值运算符而a = b用于比较两个字符串,或者您可以检查条件语句,如[[$ str1 == $ str2]。它是字符串相等性检查的另一种方法。
此外,$ HOME足以获取变量的值而不是$ {HOME},但如果您使用它,则不会出现任何错误。见下文。
* $ echo $ {SHELL}
/斌/庆典
$ echo $ SHELL
/斌/庆典*