2017-04-10 76 views
1

我想在bash脚本一个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... 

我缺少什么?

+0

除的答案,我会检查在B报价)dest后= – Michal

回答

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

因此,而不是将值分配给一个名为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,并且还要转义反斜杠。这将产生一个包含两个反斜杠的值,我认为这不是你想要的。删除引号或其中一个反斜杠。

+0

谢谢, 当我删除所有工作的空间,非常有帮助 – Breakidi

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

1

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

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

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

source = ... 
0

两件事情在你的脚本重要的这是造成错误:

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

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

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

* $回声$ {SHELL}

/斌/庆典

$回声$ SHELL

/斌/庆典*