shell腳本(.bash/.sh)
- 用cat /etc/shells可以顯示系統安裝的Shell.
- shell是一個可以一次性執行的可執行文件,即*.sh //相當於*.bat
- 腳本格式
1)shell腳本必須爲Unix文本文件
2)shell腳本的第一句必須指定解釋的shell或者空行
• 通常固定格式爲:#!/bin/sh
• #號及其後面跟隨的同一行的所有內容都被忽略
3)shell腳本必須有可執行權限
4)$,*,\’,\是腳本保留字符,要使用需用右斜槓
5)#語句 //#號就是註釋的意思 - 變量類型
1)系統變量
2)環境變量
3)自定義變量
eg:
myfile="123" #給myfile變量賦值
echo ${myfile} #輸出myfile的值
變量特點:
1)所有變量不用定義可以直接使用
2)所有變量值都是字符類型
- 注意’字符串’和 “字符串” 意義不同
echo ‘字符串’ #’'裏的字符串按原樣輸出
echo “字符串” #""裏的字符串若是變量即輸出值,無則原樣輸出 - 自定義變量
var=12
echo ${var:-13} #-表示空值置換
#輸出:12
#相當於:var==NULL ? 13 : var
#如果var的值爲空,則輸出13其中var的值沒變,否則爲var的值
========其它表達式的含義======
echo ${var:=value} //空值置換,若爲空則給var賦值並輸出
echo ${var:?} //空值出錯,若爲空顯示系統提示的錯誤信息
echo ${var:?"err"} //若爲空,則顯示自定義的提示的錯誤信息
echo ${var:+value} //有值置換,若有值則輸出置換後的值
- 環境變量
//shell 環境變量是所有shell 程序都會接收的參數。
1)PATH 命令搜索路徑,以冒號爲分隔符.注意與DOS下不同的是,當前目錄不在系統路徑裏
2)HOME 用戶home目錄的路徑名,是cd命令的默認參數
3)IFS 定義SHELL使用的分隔符 ,指命令行參數分隔符IFS=$’ \t\n’
4)LOGNAME 用戶登錄名
5)SHELL SHELL的路徑名
6)TERM 終端類型 LD_LIBRARY_PATH 尋找庫的路徑,以冒號分隔
用法:(直接在終端下操作)
export LOGNAME //自定義一個環境變量
echo LOGNAME //輸出當前的用戶登錄名
輸出:root //當前用戶是是哪個用戶就輸出哪個用戶名
其它用法:
1)export PATH=/home/atao:$PATH //將目錄添加到了環境變量路徑中
2)unset 變量名 //取消該定義的變量
【補充】
1)export //表示設置指定的環境變量
2)unset //用於取消環境變量和自定義的變量
8. 常用系統變量
$n $1表示第一個參數 $2表示第二個參數 ...
$# 顯示命令行參數的個數
$0 顯示當前程序的名稱
$? 前一個命令或函數的返回值
$* 以"參數1 參數2 ..."形式保存所有參數
$@ 以"參數1" "參數2" ... 形式保存所有參數
$$ 本程序的(進程ID號)PID
$! 上一個命令的PID
用法:echo "$$"
- 表達式的運算達
格式:$((表達式))
eg: echo $((1 + 3)) #輸出:4
*其中兩種不同的將字符串當成數學表達式的關鍵字//let和expr
1)let num=1+3
echo $num #輸出:4
2)num=`expr 1 + 3`
echo $num #輸出:4
#注意:`這個字符是Esc鍵下的那個字符,不是單引號.
- $(())支持多進制的表示
八進制$((08))
十六進制$((0x16)) - $((進制數#數字))任意進制的表示
echo $((2#1101010)) #2進製表示
echo $((8#377)) #8進製表示
echo $((16#D8)) #16進製表示
echo $((12#10)) #12進製表示
echo $((36#ZZYY)) #36進製表示
=條件判斷=
- 文件比較運算符
-e filename //如果 filename存在,則爲真
-d filename //如果 filename爲目錄,則爲真
-f filename //如果 filename爲常規文件,則爲真
-L filename //如果 filename爲符號鏈接,則爲真
-r filename //如果 filename可讀,則爲真
-w filename //如果 filename可寫,則爲真
-x filename //如果 filename可執行,則爲真
filename1 -nt filename2 //如果 filename1比 filename2新,則爲真
filename1 -ot filename2 //如果 filename1比 filename2舊,則爲真
- 字符串比較運算符
-z string //如果 string長度爲零,則爲真
-n string //如果 string長度非零,則爲真
string1 = string2 //如果 string1與 string2相同,則爲真
string1 != string2 //如果 string1與 string2不同,則爲真
- 算術比較運算符
num1 -eq num2 //等於 [ 3 -eq $mynum ]
num1 -ne num2 //不等於 [ 3 -ne $mynum ]
num1 -lt num2 //小於 [ 3 -lt $mynum ]
num1 -le num2 //小於或等於 [ 3 -le $mynum ]
num1 -gt num2 //大於 [ 3 -gt $mynum ]
num1 -ge num2 //大於或等於 [ 3 -ge $mynum ]
=判斷表達式是否爲真的兩種表示方法=
- test和[] //返回0成功,返回1失敗
方法一:test 表達式
eg:test 1 -eq 0 #表達式爲假
方法二:[ 表達式 ]
eg: [ 1 -eq 0 ] #表達式爲假
=二種分支語句=
- if和case
- if/then/else/fi或者if/then/elif/fi
用法:
- if/then/else/fi或者if/then/elif/fi
if [ -d /home/atao/demo1 ]
then
echo true
else
echo false
fi
#如果demo1目錄存在就執行then後面的語句,否則執行else後的語句
等同於
1) [ -d /home/atao/demo1 ] && echo true || echo false
2) test -d /home/atao/demo1 && echo true || echo false
- case 字符串 in; 模式1) 語句;;模式2) 語句;;esac
其中:模式可以有多個值,用|分開 如1|2|3|4|5)
用法:
echo -n "please input option:" #提示輸入信息
read input_s #從鍵盤輸入
case "$input_s" in #判斷入口
1)echo "Linux";;
2)echo "Windows";;
3)echo "Ubuntu";;
*)echo "input_s $input_s choice err" #*)相當於default
exit 1 #錯誤則返回1
esac
=三種循環語句=
- for 判斷表達式 ;do 語句;done
#!/bin/sh
1)for((x=1; x<5; x++))
do
echo "num $x=$x"
done
2)for x in 123 "abc" "666"
do
echo ${x}
done
- while 判斷表達式; do 語句;done
#!/bin/sh
x=1
while((x<=10))
do
echo "Hello x is $x"
let x=x+1 #相當於x++
done
- until 判斷表達式;do 語句;done
翻譯:until=直到…爲止
功能描述:重複循環直到條件爲真爲止
i=0
until [ $i -ge 20] #當i>=20的時候循環
do
i=$(($i+1))
echo $i
done
- shift命令
功能描述:循環從命令行參數位置變量值取一個值出來,並且把總數減一
• shift後可加整數進行一次多個移位
eg:shift 3
• 用法:
until [ $# -eq 0 ] #從終端獲取參數,當參數總數等於0終止循環
do
echo "value=$1 count=$#"
shift 3 #每次向後移動3個位置
done
#注意命令行參數總數,$#每shift一次,值減3
=三種跳出機制=
- break
break [n]
//中止循環過程的執行,並跳到下一個命令。N表示跳出嵌套的層數 - continue
continue [n]
//停止循環過程的當前一個反覆並且跳到循環中的下一個反覆過程的開始部分,n表示忽略的層數 - exit
exit [n]
//停止shell程序的執行,並且將返回值設置爲n。
=shell函數=
- 不能單獨寫在一個腳本里,至少有一個調用語句
- 實例
#!/bin/sh
show()
{
echo "output show $*" #輸出參數表
}
echo "Hello kitty"
#調用show()函數,記住在定義函數的腳本里,至少要調用一次
show 123 "abc" "666"
echo "============"
echo $*
echo $1
=交互式腳本(輸入輸出)=
- echo 輸出語句
- read 變量名
常用參數:read -p “提示信息” //每次輸入時read提示
用法 :
#!/bin/sh
read -p "Please input var = " var
echo "var = ${var}"
- 從管道里讀取
#!/bin/sh
#read讀取一個變量
ls | while read file #默認在本目錄循環讀取文件
do
ls $file #顯示讀取到的文件
done
#!/bin/sh
#read可一次性讀取多個變量
#默認在本目錄中分別讀取文件名和文件對應的id號
ls -i | while read file id
do
#file存的是文件名,id存的是文件對應的節點號
echo "File is $file ID is $id"
done
- select 表達式是bash的擴展應用,用戶可以從一組不同的值中進行選擇
翻譯:select 選擇
語法結構:
#!/bin/sh
select var in "Linux" "Windows" "Ubuntu"
do
break
done
echo "You have selected $var"
輸出:
1) Linux
2) Windows
3) Ubuntu
#? 1
You have selected Linux
=腳本調試=
//直接在終端下輸入命令
- sh -x 命令
•功能描述:執行該腳本並顯示所有變量的值。- sh -x name.sh #sh表示運行
- bash -x name.sh #與上述功能一樣,表示運行
- sh -n 命令
•功能描述:不執行,只執行語法檢查
sh -n name.sh #運行後不報錯表示沒錯誤 - trap 命令
• 功能描述:令用於捕獲指定的信號並執行預定義的命令。
• 用法
trap ‘command’ signal
//其中signal是要捕獲的信號,command是捕獲到指定的信號之後,所要執行的命令。可以用kill–l命令看到系統中全部可用的信號名,捕獲信號後所執行的命令可以是任何一條或多條合法的shell語句,也可以是一個函數名。
• Shell僞信號
1)EXIT 從一個函數中退出或整個腳本執行完畢
2)ERR 當一條命令返回非零狀態時(代表命令執行不成功)
3)DEBUG 腳本中每一條命令執行之前
• (DEBUG)對相關變量的全程跟蹤
trap 'echo “before execute line:$LINENO, a=$a,b=$b,c=$c”' DEBUG
• (EXIT)判斷腳本的執行狀態以及出錯原因
trap 'command' EXIT 或 trap 'command' 0
• (ERR)追蹤執行不成功的命令或函數,並輸出相關的調試信息
trap 'ERRTRAP $LINENO' ERR
=系統的幾個腳本=
- init腳本的存儲目錄
• /etc/rc ,/etc/rc.d/init.d 或者 /etc/init.d 目錄下
2./sbin/service 用於控制各種服務的啓動和停止
用法:
>: /sbin/service smb restart #重啓smb服務器