第一行通常這樣寫 #!/bin/bashshell
#! 是一個約定的標記,它告訴系統這個腳本須要什麼解釋器來執行,即便用哪種 Shell。bash
#!/bin/bash函數
echo "hello world"工具
保存爲t.sh,而後 chmod +x ./t.sh 賦予這個文件可執行權限oop
首個字符必須爲字母,可使用下劃線_,不能使用標點符號,不能用bash的關鍵字,賦值變量的時候跟等號之間不能有空格spa
使用變量的時候,要在變量前加上$,變量最好加上花括號,好比字符串
name="tracy"input
echo ${name}數學
只讀變量:只讀變量的值不能被改變 it
readonly name
原生的bash不支持簡單的數學運算,可是能夠經過其餘的命令來實現。好比 awk 和 expr。expr最經常使用。expr 是一款表達式計算工具,使用它能完成表達式的求值操做。好比
val=`expr 2 + 2`
echo "val = $val"
結果:val = 4
注意:1.表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2
2.完整的表達式要被 ` ` 包含 (esc下面這個鍵)
布爾運算符:! -o -a 分別表明非,或,與
條件控制
name="tracy"
if [ $name = "tracy" ]
then
echo 'name = tracy'
fi
注意判斷語句要加上 [ ] ,而且要空格,若是then要寫在上面一行的話,上一行要先加上分號隔開一下。好比
if [ $name = "tracy" ];then ..... 之後還有相似的狀況,總之就是,若是寫在一行要記得用分號隔開。
for循環
for loop in 1 2 3 4 5
do
echo "the value is:$loop"
done
while循環
int=1
while(( int < 5 ))
do
echo $int
let 'int++'
done
無參數,無返回值的函數
myfun(){
echo 'my first shell fun'
}
myfun #函數調用,不須要加括號
無參數,有返回值
sum(){
echo "input a num"
read num_a
echo "input another num"
read num_b
return $(( $num_a + $num_b ))
}
sum
echo "sum is $? "
注意:在函數調用後使用$?來獲取返回值
帶參數的函數
funWithPara(){
echo "the first para is $1"
echo "the second para is $2"
echo "the third para is $3"
}
funWithPara 1 2 3
經過$n來獲取參數的值,$1表示第一個參數,以此類推。$#表示傳進來的參數的總數,$*以字符串的形式顯示全部傳進來的參數
一般來講, UNIX 系統命令從你的終端接受輸入並將所產生的輸出發送回到您的終端。
1.輸出重定向
格式:command>file
echo "hello world" > a
cat a # hello world
注意若是文件a裏有內容,那麼上面代碼是會覆蓋掉裏面的內容的,若是不想覆蓋,要使用 >> ,這樣就會加在內容末尾(以追加的方式)
2.輸入重定向
格式:command < file
wc -l < t.sh # 打印出文件打行數
通常狀況下,每一個 Unix/Linux 命令運行時都會打開三個文件
若是但願 stderr 重定向到 file,能夠這樣寫
command 2 > file
若是但願將 stdout 和 stderr 合併後重定向到 file,能夠這樣寫:
command > file 2>&1 或者 command >> file 2>&1
3.Here Document
格式:
command << delimiter
document
delimiter
注意:1.結尾的delimiter 必定要頂格寫,前面不能有任何字符,後面也不能有任何字符,包括空格和 tab 縮進。
2.開始的delimiter先後的空格會被忽略掉。
3.我試了下,delimiter能夠寫aaa,bbb什麼的,這玩意只是用來界定開始結束的,網上通常你們都寫EOF。
cat << aa
go lakers
go shell
aa
/dev/null
若是但願執行某個命令,但又不但願在屏幕上顯示輸出結果,那麼能夠將輸出重定向到 /dev/null
command > /dev/null 好比 echo "hello world" > /dev/null
/dev/null 是一個特殊的文件,寫入到它的內容都會被丟棄;若是嘗試從該文件讀取內容,那麼什麼也讀不到。可是 /dev/null 文件很是有用,將命令的輸出重定向到它,會起到"禁止輸出"的效果。
若是但願屏蔽 stdout 和 stderr,能夠這樣寫:
command > /dev/null 2>&1
包含一個文件用
. filename #注意點和filename之間的空格
或者
source filename這兩種形式均可以包含進來
好比
新建一個文件t1.sh
#!/bin/bash
val="i am val"
新建一個文件t.sh
#!/bin/bash
#. ./t1.sh
source ./t1.sh
echo "the val is $val"
結果: the val is i am val
注意:被包含的文件不須要可執行權限
刪除多個帳號
好比有5個帳號分別是myquota1,myquota2,myquota3,myquota4,myquota5,要刪掉他們,寫以下腳本
#!/etc/bash
users=`grep "myquota*" /etc/passwd | cut -d ':' -f1`
for username in $users
do
userdel -r $username
done
執行完,再看看 grep myquota* /etc/passwd 發現已經刪除掉了