1、shell基本
2、父shell在執行shell指令時,通常是建立子shell,繼承父shell環境,執行指令,退出,相關環境銷毀;父shell得到子shell的退出狀态。
通過指令.或source來使其有目前環境中執行,而不建立子程序。
3、通配符與運算符
4、轉義
單引号
硬轉義,單引号内的字元就是其字面意義
雙引号
會進行變量替換
反單引号----$()
會把指令執行的輸出,替換;相當于函數調用,嵌套的變量會一直解析
****/home/edwardlewis/altraman # echo 'date'
date
****:/home/edwardlewis/altraman # echo "date"
****:/home/edwardlewis/altraman # echo `date`
Fri Aug 19 07:00:02 CST 2011
5、變量
變量指派: name=value
變量引用: $name
合法的變量名: 字母、下劃線、數字
=号兩邊不容許有空格(否則可能解析成指令,預設情況下IFS為空格)
$name是${name}的縮寫
$?
上一指令的退出狀态
$!
最後一個背景程序的pid
$0
目前程序的程式名稱
$$
目前程序的程序id号
$n
n為1,2,…n腳本或程式的參數
$@
腳本或程式的所有參數
$#
腳本或程式的參數個數
$UID
目前使用者的UID
$LOGNAME
目前使用者的使用者名
$HOSTNAME
主機名
$RANDOM
1-32767之間随機數
$SECONDS
以消耗的秒數
$PWD
目前工作目錄
$OLDPWD
最後一次cd前的工作目錄
~
HOME
環境變量env是bash或使用者預設值的變量,可以被繼承并直接使用;目前變量set。local定義局部變量。
a.永久設定
export name=value
./foobar.sh
b.隻對一個指令設定
name=value
6、結構語句
1)if
[[ ]] 表達式,測試字元串,檔案
(( )) 表達式,測試數字計算結果
指令的退出碼($?) 為0時,代表true,執行成功
* 比對零個或多個任意字元
?比對一個任意字元
[] 字元組,可以比對字元組中的一個字元
A|B ,A 或者B
示例程式
i=1;
while (( i <= 10 ));
do
((i++))
done
echo i:${i}
for var in *.html
if [[ -h $var ]];
then "Yes"
fi
7、函數
調用:需要先定義後調用,名字+參數(和調用一個指令完全一緻)
參數:$1,$2,……$#,$@
傳回值:标準輸出
退出狀态:return $num;或最後一個指令的退出狀态(盡量在$?中傳回失敗碼)
注意:函數必須先定義,後調用(local可以定義局部變量)
8、塊重定向
如if,while語句塊,{}
塊中共享同一檔案描述符(統一重定向)
除非塊中自行打開關閉
{
echo msg1
echo msg2
} >> "$log"
9、簡要說明echo 和print 有何差別?
① print有傳回值,成功就傳回1,失敗就0,而echo沒有傳回值
② echo函數中,可以同時輸出多個字元串,而在print函數中則隻可以同時輸出一個字元串。
int print ( string arg)
Outputs arg. Returns 1, always.
void echo ( string arg1 [, string argn...])
Outputs all parameters.
10、其他
ps -ef | grep 'http*' | grep -v 'grep' | wc -l
包含正規表達式盡量用單引号,防止轉義。
參考: