2013-10-03 70 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