11. 數組:
Shell中提供了創建一維數組的能力,你可以把一串數字、名字或者文件放在一個變量中。使用declare的-a選項即可創建它們,或者在變量後面增加下標操作符直接創建。和很多其它開發語言一樣,Shell中的數組也是0開始的,然而不同的是Shell中數組的下標是可以不連續的。獲取數組中某個元素的語法格式爲: ${arrayname[index]}。見如下示例:
/> declare -a friends #聲明一個數組變量
/> friends=(sheryl peter louise) #給數組變量賦值
/> echo ${friends[0]} #通過數組下標的方式訪問數組的元素
sheryl
/> echo ${friends[1]}
peter
/> echo ${friends[2]}
louise
/> echo ${friends[*]} #下標中星號表示所有元素。
shery1 peter louise
# ${#array[*]}表示數組中元素的數量,而${#friend[0]}則表示第一個元素的長度。
/> echo ${#friends[*]}
3
/> unset friends #unset array清空整個數組,unset array[index]僅清空指定下標的元素。
/> x[3]=100
/> echo ${x[*]}
100
/> echo ${x[0]} #0下標的元素並沒有被賦值過,因爲輸出爲空。
/> echo ${x[3]}
100
/> states=(ME [3]=CA [2]=CT) #ME的下標爲0。
/> echo ${states[0]}
ME
/> echo ${states[1]} #數組下標爲1的位置沒有被賦值過,因此沒有輸出。
/> echo ${states[2]}
CT
/> echo ${states[3]}
CA
12. 函數:
和C語言一樣,Shell中也可以創建自己的自定義函數。其格式如下:
function_name () { commands; commands; }
function function_name { commands; commands; }
function function_name () { commands; commands; }
函數的參數在函數內是以$[0-9]、${10}...,這種局部變量的方式來訪問的。見下面的示例:
#函數的左花括號和命令之間必須有至少一個空格。每個命令的後面都要有一個分號,即便是最後一個命令
/> function greet { echo "Hello $LOGNAME, today is $(date)"; }
#此時函數已經駐留在當前的bash shell中,因此使用函數效率更高。
/> greet
Hello root, today is Fri Nov 18 20:45:10 CST 2011
/> greet() { echo "Hello $LOGNAME, today is $(date)"; }
/> greet
Hello root, today is Fri Nov 18 20:46:40 CST 2011
#welcome函數內部使用了函數參數。
/> function welcome { echo "Hi $1 and $2"; }
/> welcome stephen jane
Hi stephen and jane
#declare -F選項將列出當前Shell中駐留的函數
/> declare -F
declare -f greet
declare -f welcome
#清空指定的函數,使其不在Shell中駐留。
/> unset -f welcome
13. 重定向:
下面的列表爲Shell中支持的重新定向操作符。
操作符 |
功能 |
< |
重新定向輸入 |
> |
重新定向輸出 |
>> |
追加輸出 |
2> |
重新定向錯誤 |
&> |
重新定向錯誤和輸出 |
>& |
重新定向錯誤和輸出 |
2>&1 |
重新定向錯誤到標準輸出 |
1>&2 |
重新定向標準輸出到錯誤 |
>| |
重新定向輸出的時候覆蓋noclobber選項 |
#find命令將搜索結果輸出到foundit文件,把錯誤信息輸出到/dev/null
/> find . -name "*.c" -print > foundit 2> /dev/null
#將find命令的搜索結果和錯誤信息均輸出到foundit文件中。
/> find . -name "*.c" -print >& foundit
#同上。
/> find . -name "*.c" -print > foundit 2>&1
#echo命令先將錯誤輸出到errfile,再把信息發送到標準錯誤,該信息標準錯誤與標準輸出合併在一起(errfile中)。
/> echo "File needs an argument" 2> errfile 1>&2
和C語言一樣,Shell中也可以創建自己的自定義函數。其格式如下:
function_name () { commands; commands; }
function function_name { commands; commands; }
function function_name () { commands; commands; }
函數的參數在函數內是以$[0-9]、${10}...,這種局部變量的方式來訪問的。見下面的示例:
#函數的左花括號和命令之間必須有至少一個空格。每個命令的後面都要有一個分號,即便是最後一個命令
/> function greet { echo "Hello $LOGNAME, today is $(date)"; }
#此時函數已經駐留在當前的bash shell中,因此使用函數效率更高。
/> greet
Hello root, today is Fri Nov 18 20:45:10 CST 2011
/> greet() { echo "Hello $LOGNAME, today is $(date)"; }
/> greet
Hello root, today is Fri Nov 18 20:46:40 CST 2011
#welcome函數內部使用了函數參數。
/> function welcome { echo "Hi $1 and $2"; }
/> welcome stephen jane
Hi stephen and jane
#declare -F選項將列出當前Shell中駐留的函數
/> declare -F
declare -f greet
declare -f welcome
#清空指定的函數,使其不在Shell中駐留。
/> unset -f welcome
13. 重定向:
下面的列表爲Shell中支持的重新定向操作符。
操作符 |
功能 |
< |
重新定向輸入 |
> |
重新定向輸出 |
>> |
追加輸出 |
2> |
重新定向錯誤 |
&> |
重新定向錯誤和輸出 |
>& |
重新定向錯誤和輸出 |
2>&1 |
重新定向錯誤到標準輸出 |
1>&2 |
重新定向標準輸出到錯誤 |
>| |
重新定向輸出的時候覆蓋noclobber選項 |
#find命令將搜索結果輸出到foundit文件,把錯誤信息輸出到/dev/null
/> find . -name "*.c" -print > foundit 2> /dev/null
#將find命令的搜索結果和錯誤信息均輸出到foundit文件中。
/> find . -name "*.c" -print >& foundit
#同上。
/> find . -name "*.c" -print > foundit 2>&1
#echo命令先將錯誤輸出到errfile,再把信息發送到標準錯誤,該信息標準錯誤與標準輸出合併在一起(errfile中)。
/> echo "File needs an argument" 2> errfile 1>&2
/> cat errfile