2

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

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}
}

但我收到此错误:

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

我错过了什么?

4

4 回答 4

3

您的脚本包含以下内容:

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 语法。

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,并且还转义了反斜杠。这将产生一个包含两个反斜杠的值,我认为这不是您想要的。删除引号或反斜杠之一。

于 2017-04-10T09:53:12.173 回答
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

于 2017-04-10T09:52:17.150 回答
1

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

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

作为source命令,以下命令正在尝试打开=不存在的文件

source = ...
于 2017-04-10T09:53:49.547 回答
0

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

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

2. "="在 Unix 中 a=b 没有空格被视为赋值运算符,a = b 用于比较两个字符串,或者您可以检查条件语句,如 [[ $str1 == $str2 ]。它是字符串相等检查的另一种方法。

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

*$ 回声 ${SHELL}

/bin/bash

$ 回声 $SHELL

/bin/bash*

于 2017-04-10T10:18:48.930 回答