bash的一些小技巧

2021-09-08 19:38:53 字數 1747 閱讀 7236

1、從輸入讀入變數

用e選項表示編輯,可以使用backspace刪除

2、陣列

a、索引陣列

declare -a arr=(var1 var2 var3) 用空格分割,如果直接訪問變數$arr,

則獲取的是陣列的第乙個元素,訪問要是用$來。

也可宣告陣列後再賦值,即declare -a arr;arr[0]=var1;arr[1]=var2;arr[3]=var3

如下:

獲取所有陣列元素把索引換為@,獲取陣列長度則要在獲取所有陣列的變數前加#

如下:

b、關聯陣列

關聯陣列把-a,換為-a即可,其它和索引陣列類似,但是直接訪問變數將沒有輸出。

這也好理解,因為沒有第乙個元素的概念了,而且可以看到獲取所有key對應的值時,也是沒有順序的。

3、字串轉變量

使用eval命令求值

eval可以用返回值儲存變數,這就有可以和關聯陣列,實現比較好玩的東西了。

4、多維陣列

declare -a map1=(

[key1]=a1

[key2]=b1

)declare -a map2=(

[key1]=a2

[key2]=b2

)declare -a arr=(map1 map2)

如果這時候想獲取陣列arr裡的第乙個元素的key1值,估計大家會想到

tmp=$;echo $

然而輸出的是map1,因為map1只是個字串,並不是指向$map1變數。

於是可能會想到,這麼修改,declare -a arr=($map1 $map2),可是結果是什麼也沒輸出。

後來我找了一些資料,也沒找到解決的方法。或許是bash不支援。

讓我們用eval來試試。

eval tmp="\$";echo $tmp;

\$表示轉義,即不要當變數解析,可以看到成功輸出a1。

那麼我們把map1構造出來,$即map1,完整如下:

eval tmp="\$[key1]}";echo $tmp

那麼我們就可以在迴圈裡做些事情了:

declare -a map1=(

[key1]=a1

[key2]=b1

)declare -a map2=(

[key1]=a2

[key2]=b2

)declare -a arr=(map1 map2)

for var in $; do

eval tmp="\$"

echo

$tmp

done

這裡的$var即陣列arr裡的元素,可以看到成功的輸出了預期值:

一些小技巧

關注 乙個好的程式設計師不應該把所有的判斷交給編譯器和偵錯程式,應該在程式中自己加以程式保護和錯誤定位,具體措施包括 對於所有有返回值的函式,都應該檢查返回值,除非你確信這個函式呼叫絕對不會出錯,或者不關心它是否出錯。一些函式返回錯誤,需要用其他函式獲得錯誤的具體資訊。例如accept返回inval...

一些小技巧

protected void repparent itemdatabound object sender,system.web.ui.webcontrols.repeateritemeventargs e 在父datalist的itemdatabound事件裡面寫子datalist的資料來源 繫結 ...

一些小技巧

protected void repparent itemdatabound object sender,system.web.ui.webcontrols.repeateritemeventargs e 在父datalist的itemdatabound事件裡面寫子datalist的資料來源 繫結 ...