2013-10-03 73 views
0

我是试图学习bash编程的脚本语言的新手。理解脚本语言

我有一个非常基本的问题。假设我想创建三个文件夹,如$HOME/folder/ 与两个子文件夹folder1folder2

  1. 如果我在shell中执行命令状

    mkdir -p $HOME/folder/{folder1,folder2} 
    

    文件夹将与子文件夹一起创建。

  2. 如果通过脚本执行同样的事情我不能得到预期的结果。如果sample.sh包含

    #!/bin/sh 
    
    mkdir -p $HOME/folder/{folder1,folder2} 
    

    和我执行sh ./sample.sh,第一个文件夹将然后在一个{folder1,folder2}目录中创建创建。独立的子文件夹不会被创建。

我的查询是

  1. 当我们比较作为终端命令脚本文件是如何工作的?即为什么它不一样?

  2. 如何让它工作?

+0

请通过评论为什么你否决 –

+0

http://stackoverflow.com/questions/19112031/difference-between- korn-and-bash-shell/19112167#19112167 – SriniV

回答

1

支架膨胀不会发生在sh中。

在SH:

$ echo {1,2} 

产生

{1,2} 

在bash:

$ echo {1,2} 

产生

1 2 

使用bash执行脚本而不是使用sh,您应该看到预期的结果。

+1

这取决于什么'sh'。有时它实际上会是Bash。 :) –

+0

我用#!/ bin/bash试过,但结果相同 –

+0

@vinayhunachyal注意它是'#!/ bin/bash' <---有一个'!'。 – fedorqui

1

这可能是因为虽然您的标签表明您认为您使用的是Bash,但您可能不会。这是因为第一行:

#/bin/sh 

这就是说“使用系统默认shell”。这可能不是bash。试试这个:

#!/usr/bin/env bash 

哦,并且请注意,你错过了! #后。我不确定这只是一个复制粘贴错误,但你需要!

+0

写在这里时我错过了,但它在我的脚本文件中! –

+0

有人认为此答案?我会*爱*知道为什么。 –

+0

我没有downvote,但当脚本使用'sh。/ sample.sh'运行时,更改hashbang将不起作用。 – chepner

2

bash在被调用为sh时的行为不同,以更接近地模仿POSIX标准。其中一个变化就是不再支持扩展(这在POSIX中不存在)。您有以下几种选择:

  1. 使用bash ./sample.sh运行您的脚本。这忽略了hashbang并明确使用bash来运行该脚本。

  2. 将hashbang更改为#!/bin/bash,它允许您自行运行脚本(假设您将其执行位设置为chmod +x sample.sh)。

    请注意,将它作为sh ./sample.sh运行仍然会失败,因为只有在将文件本身作为可执行文件运行时才会使用hashbang。

  3. 不要在脚本中使用大括号扩展。你仍然可以作为一个较长的方法使用,为了避免重复代码:否决之前

    for d in folder1 folder2; do 
        mkdir -p "$HOME/folder/$d" 
    done