在解釋我的bash問題之前,讓我給你一些上下文:在bash中克隆一個變量?
我正在寫一些腳本,使用我當前使用的bash「框架」。該框架的一個特點是啓動一組有用的環境變量,以便在我們的集羣基礎架構上運行作業。
這些變量取決於由$YY
,$mm
和$dd
指定的日期,這些日期也是環境變量(是的,這是有線的)。要使用框架,首先定義日期,然後調用一個函數來初始化其他變量。當您編寫只需要特定日期的變量的腳本時,此工作正常。今天我寫了一些需要2天不同的變量。寫這個我面臨一個奇怪的問題。爲了您更好地理解這個問題我寫了這個代碼,模擬它:
#!/bin/bash
function assign(){
date=$1
date[1]=$YY
date[2]=$mm
date[3]=$dd
}
function display() {
date=$1
echo "${date[1]}/${date[2]}/${date[3]}"
}
export YY=2012
export mm=09
export dd=20
declare -a my_date1=()
assign $my_date1
export YY=2012
export mm=08
export dd=20
declare -a my_date2=()
assign $my_date2
display $my_date1
display $my_date2
預期輸出是:
2012/09/20
2012/08/20
但輸出是:
2012/08/20
2012/08/20
起初我還以爲分配函數參考$YY
,$mm
和$dd
而不是它們的值填充陣列。但後來我嘗試使用下面的代碼,它不會改變結果。
date[1]=$(echo $YY)
date[2]=$(echo $mm)
date[3]=$(echo $dd)
有人可以解釋我附加什麼嗎? 可能與date=$1
有線連接...
嘗試將shebang行更改爲'#!/ bin/bash -xv'來查看bash是如何解釋代碼的。 – choroba
永遠不需要兩次導出變量,並且在這個腳本中沒有明顯需要導出它們一次。 –
@WilliamPursell:這就是爲什麼我把我的問題的一些背景!我做了這些事情是因爲我在當前工作中使用了瘋狂的框架。我問了這個問題,以理解這種行爲不是爲了解決我在工作中遇到的問題。即使這個劇本是愚蠢的,我也從中學到了一些東西。感謝chepner的回答和choroba的建議,這使我完全明白答案。 –