2010-09-17 101 views
0

我試圖寫一個簡單的bash腳本,但有什麼不對勁,我測試在命令行中執行以下操作:的Bash腳本:參數替代問題

DATE="2010-09-{10,11}" 
result=`\ls *ext.$DATE.Z` 

和LS的結果:不能訪問* ext.2010-09- {} 10,11 .Z:沒有這樣的文件或目錄

但如果我執行此:

result=`\ls *ext.2010-09-{10,11}.Z` 

它完美的作品...

我甚至試圖刪除從DATE參數引號,但是這不是問題,bash的手冊沒有幫助,我究竟做錯了什麼?是不是應該執行參數替換並將其傳遞給我的命令?

我想我應該有逃脫$符號,但沒有任何工作。

編輯 - 故意添加說明

我試圖做到的是填充可變結果與匹配給定模式的所有文件名(* ext.2010-09- {} 10,11)我知道我可以用一個for循環來解決這個問題,但我想到了使用大括號來簡化。

+0

你爲什麼要運行它像'\ ls'?別名不會結轉到腳本中。 – Daenyth 2010-09-17 15:49:17

回答

4

問題是當您直接在命令行上執行它時\ls *ext.2010-09-{10,11}.Z是一種擴展爲兩個命令的簡短格式:ls *ext.2010-09-10.Zls *ext.2010-09-11.Z(通過命令行 - 每個隨後調用)。 ls本身不直接支持這樣一種表達,所以當你建立了到一個腳本,它得到的文本字符串,它不理解。

括號擴展不被所有命令行isn't recommended for shell scripts支撐,並且:

括號擴展不應 便攜式外殼腳本中使用,這是因爲 伯恩殼不會產生相同的輸出 。

這裏有一個解決方案腳本:

#!/bin/sh 
DAYS="10 11" 
for i in $DAYS; 
do 
    ls *ext.2010-09-$i.Z 
done 
+0

正確,您的文章完成了我的簡短說明。問候 – 2010-09-17 15:44:29

+0

你的答案接近但不完全正確。看我的。 – Daenyth 2010-09-17 15:47:30

+0

Mhhh我想我搞砸了,然後,謝謝:) – OverLex 2010-09-17 15:56:22

1

如果你把它分配給variabile的的{X,Y}組不再擴大。但是你可以編寫一個像「ls ...」這樣的字符串並提交給「eval」函數。 再見!

+1

'eval'是不安全的,可能會引入安全漏洞。可能有更好的方法 – Daenyth 2010-09-17 15:48:29

3

這是因爲括號擴展變量擴展之前發生。首先,它擴展了括號 - 除非有沒有在你的論點來ls。然後它擴展變量。然後它運行它。此時,擴展大括號太遲了。

如果您闡述一下你正在試圖解決我也許能幫助你找到一個更好的辦法的具體問題。

0

這將使你要找的文件名中的變量:

result=$(echo *ext.2010-09-{10,11}.Z)