2013-10-20 59 views
3

更新2:此問題與this question有關,可能是因爲這可能/不可能工作的基本原因是相同的。但我不確定它是否實際上是重複的,因爲嵌套只是如何獲取字符串的一個例子。相同的基本問題,也可以表述爲:Bash子串和參數擴展不分配給變量

  • 是否有直接的參數擴展使用一個字符串的方式,可能使用expr
  • 什麼是最簡潔的方式來管輸出參數擴張? 「假」的語法

更多的例子來說明這些目標......

${$(echo "b"; b="ABCDE")::3} # Assign output inside? 
... | grep -o "ABCDE" | ${-::2} # pipe to placeholder inside? 

所以這取決於你的目標,它可能是一個欺騙與否。 總之,從目前的答案,它聽起來就像是不可能反正有這樣的做法...


這是關於bash的操作一個一般性的問題,而不是試圖獲得一個特定的字符串subser ...

我知道你可以使用參數擴展和其他技巧來提取或替換定義變量的部分。

例如:

$ MYVAR=$(date) # just to generate text; could be "ABCDE" 
$ echo $MYVAR 
Mon Oct 20 15:55:07 PDT 2014 
$ echo ${MYVAR:11} 
15:55:07 PDT 2014 
$ echo ${MYVAR%:*} 
Mon Oct 20 15:55 

我想是一種方法,「鳥巢」這些操作,而無需創建中間變量。

例如,你當你做了什麼:

$ TIME=${MYVAR:11} 
$ echo ${TIME%:*} 
    15:55 

我希望能夠到鳥巢了與TIME發生,這是在MYVAR發生的操作中的操作。

想到的潛在語法類似於$(),它可以讓您嵌套操作,但可以爲變量執行操作。它可能是這個樣子...(不工作! - 我已經試過)

echo ${`${MYVAR:11}`%:*}  # ERROR 

的好處是,你可以用分配MYVARTIME完全免除,並使用字符串或$(date)(或輸出grep等)。

+0

可能重複http://stackoverflow.com/questions/6724056/nested- shell參數擴展) – Graham

+0

謝謝@Graham。這個問題也指出了我沒有發現的另一套答案。 – beroe

+0

'bash'不以這種方式鏈接參數擴展。 '$ {foo ...}'中的'foo'必須是文字名稱;沒有其他表達是允許的。一些shell(特別是'zsh')確實允許這種鏈式擴展。 – chepner

回答

1

首先,如果你真的想解析日期,你應該知道,你可以從date命令本身得到正是你想要的日期格式:

[[email protected] ~]$ read year month day < <(date '+%Y %m %d') 
[[email protected] ~]$ echo "year=$year month=$month day=$day" 
year=2013 month=10 day=20 

如果你使用Linux,man date用於格式化詳細信息。在其他操作系統(FreeBSD,OSX等)中,date命令是strftime()的包裝,因此您可以閱讀man page for that instead

但要回答你的問題,你可以在zsh中,但不能在bash,ksh或其他Bourne shell中。處理這個問題的標準方法是使用臨時變量,但請注意,您可以回收您的現有變量。

[[email protected] ~]$ foo="Hello world." 
[[email protected] ~]$ foo="${foo//l/}"; echo "$foo" 
Heo word. 
[[email protected] ~]$ foo="${foo:4}"; echo "$foo" 
word. 
+0

謝謝魚。是的,我知道'日期'標誌。那只是爲了生成一個字符串。我應該編輯這個問題,只是說'ABCDE''回收變量很好。 Re'zsh'我想我應該考慮一下,但我寧願堅持bash出於幾個原因。 – beroe

2

您可以使用BASH arrays砍下臨時變量的作品是這樣的:

$ MYVAR=($(date)) 
$ echo "${MYVAR[@]}" 
Mon Oct 20 15:55:07 PDT 2014 

# get 4th elements and substring in SINGLE operation 
$ echo "${MYVAR[3]%:*}" 
15:55 
[嵌套殼牌參數擴展(的