文章目錄
shell 編程
變量
1、變量是以$
開始的
2、變量分爲:臨時變量
(只在shell中有效)和永久變量
(在系統任何地方都可以執行,如:$SHELL
)
3、變量名必須是由字母``數字
或下劃線
組成,且以字母或下橫線開頭
4、變量名一般爲大寫
5、變量的定義:變量名=值
,等號左右沒有空格
NUM=100
echo $NUM
100
TIME=`date` #可要將其它命令結果賦值給變量,可以用命令替換符(``),即反引號
echo $TIME
Mon Nov 7 17:06:32 CST 2016
TIME=$(date +%F) #date與“+”之前必須要有空格,+和%F之間不能有空格
echo $TIME
2016-11-07
DATE=$TIME #可以將一個變量賦值給另一個變量
ABC="$DATE" #變量可以被解釋
ABC='$DATE' #變量不被解釋,當字符串
位置變量
和特殊變量
位置變量就是參數,參數都被叫做位置變量
ls -l file1 file2 file3
#在位置變量中:ls -l是$0
#在位置變量中:file1、file2就是位置參數$1、$2……$9
#sh xxx.sh /etc #xxx.sh就是位置參數$0,/etc就是位置參數$1
特殊變量
$? #判斷上一條命令執行是否成功,成功返回0,不成功返回非0
$* #列出所有參數
$$ #這個腳本的PID
$! #執行上一個後臺命令的PID
$# #參數的個數
$0 #這個腳本的名稱
read
從鍵盤讀入數據,賦值給變量
read first second third #read在等待用戶數據的內容中,會依次將三個變量分別賦值給first、second、third
sh -x #-x參數可以將腳本的執行過程展示出來,行首的“+”就是執行過程展示
#賦值少於變量數,最後的將是空值;如果賦值多於變量婁,那麼將多餘的值都賦值給最後一個變量
expr
變量算術運算,對整數行進行數學運算,小數點以後不進行計算
expr 2 + 3
expr 10 \* 3 #乘法需要用轉義符
if語句
if [條件];then
exp
elif [條件];then
exp
else [條件];then
exp
fi
流程控制語句
-a #[a -a b]
-o #[a -o b]
#[-e file] 如果file文件存在則爲真
#[-f file] 如果file存在且是一個普通文件則爲真
#[-a file] 如果file存在則爲真
#[-d file] 如果file文件存在且是一個目錄則爲真
#-a 和 -o 操作允許分別使用邏輯 AND 和 OR 來合併表達式,而一元操作符 ! 則是對測試含義取反。
退出語句
exit 0 #正常退出 非0爲非正常退出
for語句
for 變量 in 名字表
do
命令列表
done
case
case 變量 in
字符串1) 命令1
;;
字符串2) 命令2
;;
esac
#字符串1就會在shell中找對應的字符串1
while
while [ 條件 ] #如果條件爲真,do中的命令一直會執行
do
命令1
命令2
done
shift
將腳本傳遞的參數依次進行遞減,一般用於循環中
sh shift.sh 111 222 333
shift
sh shift.sh 222 333
shift
sh shift.sh 333
#這樣的話,就可以使用$1進行挨個提取參數,然後進行運算
函數
使腳本的可讀性比較好
start(){
命令1
命令2
}
#函數的調用,使用不帶括號的函數名
例
#!/bin/bash
/usr/sbin/service nginx start #系統命令必須是絕對路徑
其它用戶對腳本的執行權限
sh 腳本:
1、對腳本有r權限
2、對腳本所在目錄的rx權限
腳本: #直接執行腳本
1、對腳本有rx權限
2、對腳本所在目錄的rx權限
附
[root@bogon ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
awk
awk是一個強大的文本分析工具
awk其實很複雜,這裏只是簡單提一下,在shell中會用到
awk -F: '$3==0 {print $1}' /ect/passwd
awk -F: 'length($2)==0 {print $1}' /etc/shadow
#默認是使用空格作爲分隔符,用“-F”指定“:”,就以“:”作爲分隔符
踢出登錄用戶
pkill -kill -t pts/2 #踢出pts/2這個連接
#還有一種踢出的方式,就是關閉這個用戶的所有進程
非交互式設置用戶密碼
echo 123456 | passwd --stdin username
#--stdin 從標準輸入讀取令牌(只有根用戶才能進行此操作)
set
1、查看系統中定義的變量
2、刪除變量使用unset NAME
附1
exit是一個庫函數,exit(1)表示發生錯誤後退出程序, exit(0)表示正常退出。
對你的程序來說,沒有區別。對使用你的程序的人或者程序來說,區別可就大了。
一般來說,exit 0 可以告知你的程序的使用者:你的程序是正常結束的。如果 exit 非 0 值,那麼你的程序的使用者通常會認爲你的程序產生了一個錯誤。
以 shell 爲例,在 shell 中調用完你的程序之後,用 echo $? 命令就可以看到你的程序的 exit 值。在 shell 腳本中,通常會根據上一個命令的 $? 值來進行一些流程控制。
附2
-eq 等於
-ne 不等於
-gt 大於
-ge 大於等於
-lt 小於
-le 小於等於
至於 ! 號那就是取非了
輸入輸出基本知識
1)默認地,標準的輸入爲鍵盤,但是也可以來自文件或管道(pipe |)。
2)默認地,標準的輸出爲終端(terminal),但是也可以重定向到文件,管道或後引號(backquotes `)。
3) 默認地,標準的錯誤輸出到終端,但是也可以重定向到文件。
4)標準的輸入,輸出和錯誤輸出分別表示爲STDIN,STDOUT,STDERR,也可以用0,1,2來表示。
5)其實除了以上常用的3中文件描述符,還有39也可以作爲文件描述符。39你可以認爲是執行某個地方的文件描述符,常被用來作爲臨時的中間描述符。