bash脚本案例切换

时间:2017-04-10 09:48:44

标签: linux bash bash-function

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

我错过了什么?

4 个答案:

答案 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

/斌/庆典*