用戶自定義變量
用戶可以按照下面的語法規則定義自己的變量:變量名=變量值 。要注意的一點是,在定義變量時,變量名前不應加符號“$”,在引用變量的內容時則應在變量名前加“$”;在給變量賦值時,等號兩邊一定不能留空格,若變量中本身就包含了空格,則整個字符串都要用雙引號括起來。
位置變量
通過命令行給程序傳遞執行參數。
$0:當前執行的進程/程序名
$n:(n爲1-9的數字)第幾個位置參數
預定義變量
$#:命令行中位置參數的個數
$*:所有位置參數的內容
$?:上一條命令執行後返回的狀態,當執行成功時返回0,不成功返回非0
$n:位置參數變量
$$:當前進程的id
$!:最後一個後臺進程的id
環境變量
在開始執行時就已經定義了一些和系統的工作環境有關的變量,這些變量用戶還可以重新定義。
HOME:用於保存註冊目錄的完全路徑名。
PATH:用於保存用冒號分隔的目錄路徑名,shell將按PATH變量中給出的順序搜索這些目錄,找到的第一個與命令名稱一致的可執行文件將被執行。
TERM:終端的類型。
UID:當前用戶的標識符,取值是由數字構成的字符串。
PWD:當前工作目錄的絕對路徑名,該變量的取值隨cd命令的使用而變化。
PS1:主提示符,在特權用戶下,缺省的主提示符是“#”,在普通用戶下,缺省的主提示符是“$”。
PS2:在shell接收用戶輸入命令的過程中,如果用戶在輸入行的末尾輸入“\”然後回車,或者當用戶按回車鍵時shell判斷出用戶輸入的命令沒有結束時,顯示這個輔助提示符,提示用戶繼續輸入命令的其餘部分,缺省的輔助提示符是“>”。
2.算數運算符
(())
例如
1.((i=$j+$k)) 等價於 i=`expr $j + $k`
2.((i=$j-$k)) 等價於 i=`expr $j - $k`
3.((i=$j*$k)) 等價於 i=`expr $j \* $k`
4.((i=$j/$k)) 等價於 i=`expr $j / $k`
$(())
例如
1.echo $((1+2))
2.echo $((1-2))
3.echo $((1*2))
4.echo $((1/2))
let
例如
1.let i=1+2
2.let i=1-2
3.let i=1*2
4.let i=1*
5.let "i=1+1"
6.let "i = 1 + 1"
7.let i=1+1
8.let "i = i + 1"
9.let i=i+1
expr
例如:
1.sum=$(expr $num1 + $num2)
declare
例如:
1.num1=123
num2=456
declare -i sum=$num1+$num2
注意:
1.在括號運算中((i=$j+$k))運算符號兩邊可以有空格也可以沒有空格,但是expr運算i=`expr $j + $k`中運算符號兩邊必須要有空格!
2.乘法運算符號是 \* ,而不是 *
3.除法運算 / 表示整除,1/2=0
4.let表達式中的變量前不必有$
5.如果表達式中包含了空格或其他特殊字符,則必須引起來。(let i=i+1中除了let後面有一個空格外,其他地方不能有一個空格!)
3.條件測試
test
用途:測試特定的表達式是否成熟,當條件成立時,命令執行後的返回值爲0,否則爲其他數字。
格式: test 條件表達式 或者 [ 條件表達式 ]
常見的測試操作符
-d:測試是否爲目錄
-e:測試目錄或者文件是否存在
-f:測試是否爲文件
-r:測試當前用戶是否有權限讀取
-w:測試當前用戶是否有權限寫入
-x:測試當前用戶是否可執行該文件
-L:測試是否爲符號連接文件
例如:
if [ -f ./file ];then
echo "exists!"
else
echo "not exists!"
fi
整數值比較
格式:[ 整數1 操作符 整數2 ]
常用的測試操作符
-eq:等於
-ne:不大於
-gt:大於
-lt:小於
-le:小於或等於
-ge:大於或等於
例如:
if [ 30 -ge 12 ];then
echo '30 > 12'
else
echo '30 < 12'
fi
字符串比較
格式:[ 字符串1 = 字符串2 ] [ 字符串1 != 字符串2 ] [ -z 字符串 ]
常用的測試操作符
=: 字符串內容相同
!=: 字符串內容不同,
-z: 字符串內容爲空
例如:
if [ 'admin' = 'admin' ];then
echo '相等'
else
echo ‘不相等’
fi
邏輯測試
格式:[ 表達式1 ] 操作符 [ 表達式2 ] ...
常用的操作符
-a或者&&:邏輯與,前後兩個表達式都成立時整個測試結果才爲真,否則爲假
-o或者||:邏輯或,操作符兩邊至少一個爲真時測試結果才爲真,否則爲假
!:邏輯否,當指定的條件不成立時,返回結果爲真
例如:
if [ 'admin' = 'admin' ] && [ 'pass' = 'pass' ];then
echo '相等'
else
echo ‘不相等’
fi流程判斷
if
例如:
1.年齡判斷
if [ $age -lt 18 ];then
echo '未成年'
else
echo '已成年'
fi
2.成績級別
if [ $score -lt 60 ];then
echo '60以下'
elif [ $score -lt 70 ];then
echo '60-70'
elif [ $score -lt 80 ];then
echo '70-80'
elif [ $score -lt 90 ];then
echo '80-90'
else
echo '90-100'
fi
case
例如:
1.星期幾的判斷
case $week in
1)
echo '週一'
;;
2)
echo '週二'
;;
3)
echo '週三'
;;
4)
echo '週四'
;;
5)
echo '週五'
;;
6)
echo '週六'
;;
7)
echo '周七'
;;
*)
echo '其他'
;;
esac
5.循環控制
while
例如;
1.
while [ $num -gt 0 ]
do
echo $num
num=$(($num-1))
done
echo $num
2.
for in
例如:
1.
for i in user0 user1 user2
do
echo $i
done
2.
for((i=0;i<10;i++))
do
echo $i
done
3.
for i in `ls /etc`
do
echo $i
done
6.shift、break、continue、exit
shift
例如:
1.
while [ $# -gt 0 ]
do
tot = $(($tot+$1))
shift
done
break
命令可以帶一個參數,一個不帶參數的break 循環只能退出最內層的循環,而break N可以退出N層循環。
例如:
1.
#!/bin/sh
for i in "a b c d"
do
echo "$i "
for j in `seq 10`
do
if [ $j -eq 5 ];then
break
fi
echo "$j "
done
echo
done
2.
#!/bin/sh
for i in "a b c d"
do
echo "$i "
for j in `seq 10`
do
if [ $j -eq 5 ];then
break 2
fi
echo "$j "
done
echo
done
continue
命令也可以帶一個參數,一個不帶參數的continue 命令只去掉本次循環的剩餘代碼,而continue N 將會把N層循環剩餘的代碼都去掉,但是循環的次數不變。
例如:
1.
#!/bin/sh
for i in "a b c d"
do
echo "$i "
for j in `seq 10`
do
if [ $j -eq 5 ];then
continue
fi
echo "$j "
done
echo
done
2.
#!/bin/sh
for i in "a b c d"
do
echo "$i "
for j in `seq 10`
do
if [ $j -eq 5 ];then
continue 2
fi
echo "$j "
done
echo
done
在shell腳本中可以終止當前腳本執行。
格式:exit n
例如:
1.exit 0
2.
if [ "$#" -ne "2" ]; then
echo "usage: $0 <area> <hours>"
exit 2
fi
注意:
1.n爲退出碼
2.退出碼的約定:0表示成功;非0表示失敗(2表示用法不當、127表示命令沒有找到、126表示不是可執行的、>=128 信號產生)。
7.函數
例如:
1.
// 函數定義
function add(){
echo 'aaaaaaaa'
}
// 函數調用
add
2.
// 函數定義及傳參
function add(){
num=$1 // 參數的調用類似於位置變量
for((i=1;i<=$num;i++))
do
tot = $(($tot+$i))
done
}
// 調用傳參的函數
add 100
3.
// 函數定義
function add(){
return 'aaaaaaaa'
}
// 函數調用
add
// 獲取函數返回值
echo $?
注意:
1、必須在調用函數地方之前,聲明函數,因爲shell腳本是逐行運行。不會像其它語言一樣先預編譯。所以必須在使用函數前先聲明函數。
2、total=$(add 100); 通過這種調用方法,我們清楚知道,在shell中單括號裏面,可以是:命令語句。 因此,我們可以將shell中函數,看作是定義一個新的命令,它是命令,因此各個輸入參數直接用空格分隔。命令裏面獲得參數方法可以通過:$0…$n得到。 $0代表函數本身。
3、函數返回值,只能通過$? 系統變量獲得,直接通過=,獲得是空值。其實,我們按照上面一條理解,知道函數是一個命令,在shell獲得命令返回值,都需要通過$?獲得。
8.文件引用
1. . filename
2. source filename
注意:
兩種方式的效果相同,簡單起見,一般使用點號(.),但是注意點號(.)和文件名中間有一空格。