文章版權:http://www.cnblogs.com/linux-super-meng/
環境變數路徑:
[root@localhost ~]# set //檢視到的是區域性變數和全域性變數2種
[root@localhost ~]# env //檢視系統的全域性環境變數
[root@localhost ~]# echo $PATH //檢視系統環境變數路徑
[root@localhost ~]# export $PATH //也可以使用export檢視環境變數路徑
[root@localhost ~]# export PATH=$PATH:/date/ //臨時新增/date目錄到環境變數路徑下
要想重啟主機後還生效就要編輯環境配置檔案root/.bashec或/root/.bash_profile與/etc/profile檔案,想要立刻生效可以使用命令:
注:.bash_profile檔案支隊系統當前使用者生效
[root@localhost ~]# source .bash_profile
[root@localhost ~]# ls –a 可以檢視到這2個檔案
指令碼的執行:
sh script //這種方法script不需要可執行許可權
./ script //必須具有可執行許可權
. script //這種方法script也不需要可執行許可權
區分區域性變數和全域性變數
[root@localhost ~]# str=1000 //區域性變數
[root@localhost ~]# echo $str
1000
去編輯一個指令碼:
# vim bianliang.sh
#!/bin/bash
echo $str
[root@localhost ~]# bianliang.sh //我們定義的變數,但是通過指令碼卻不能輸出
[root@localhost ~]# export str //新增到全域性變數中
[root@localhost ~]# bianliang.sh //再次使用完全ok
1000
要想完全的清除某個全域性變數:
# unset str 清除全域性變數
#env 可以檢視到所有全域性變數
&& || 的用法:(引數的比對)
&& 條件符合要求才會執行後面的動作
|| 條件不符合要求時才會執行後面的動作
//檢視/ect目錄下是否有/grub.conf檔案,有則輸出yes,無則輸出no。
[root@localhost ~]# [ -f /etc/grub.conf ] && echo yes || echo no
Yes
檢視/shellscripts/hello.sh是否可執行,可執行則輸入yes,否則就賦予它可執行許可權
[root@localhost shellscripts]# [ -x /shellscripts/hello.sh ] && echo yes || chmod +x /shellscripts/hello.sh
[root@localhost shellscripts]# ls
hello.sh ipadd.sh logmess_clean.sh
[root@localhost shellscripts]# hello.sh
hello world!
“”和‘’與 ` ` 在shell變數中的區別
“ ” 允許通過$符引用其他變數
‘’禁止引用其他變數符,視為普通字元
`` 將命令執行的結果輸出給變數
[root@localhost ~]# echo "$PWD is lujing"
/root is lujing
[root@localhost ~]# echo '$PWD is lujing'
$PWD is lujing
[root@localhost ~]# echo $a
1000
[root@localhost ~]# echo $aaaaaaaa //系統把$aaaaa視為一個變數
[root@localhost ~]# echo ${a}aaaaaa //把變數用{}括起來,系統才會去輸出變數
1000aaaaaa
#echo `ls` 反引號中的命令時可以單獨執行的,然後再由echo輸出
擴充套件:”\ “反斜槓,作用遮蔽字元的特殊意義
test命令
用途:測試表示式是否成立,成立返回值為0,否返回值為其他值。
格式:test 條件表示式 [條件表示式]
≡ 常見的測試型別
測試檔案的狀態
字元的串比較
整數值比較
邏輯測試
測試檔案的狀態
格式:[操作符 檔案或目錄]
常見的測試操作符
-d :測試是否為目錄【directory】
[root@localhost /]# [ -d /var/spool/ ]
[root@localhost /]# echo $?
0
-e:測測試目錄或檔案是否存在【exist】
[root@localhost /]# [ -e /etc/passwd ]
[root@localhost /]# echo $?
0
-f:測試是否為檔案【file】
[root@localhost Packages]# [ -f /etc/passwd ]
[root@localhost Packages]# echo $?
0
[root@localhost Packages]#
-r:測試當前的使用者是否有讀取的許可權【read】
[root@localhost /]# [ -r /etc/shadow ]
[root@localhost /]# echo $?
0
[root@localhost /]#
-w:測試當前的使用者是否有寫的許可權【write】
[root@localhost /]# [ -w /etc/shadow ]
[root@localhost /]# echo $?
0
[root@localhost /]#
-x:測試當前的使用者是否可執行和該檔案【excute】
[root@localhost /]# [ -x /etc/shadow ]
[root@localhost /]# echo $?
1
[root@localhost /]# ll /etc/shadow
----------. 1 root root 1086 2月 26 22:38 /etc/shadow
-L:測試是否為符號連結檔案【link】
[root@localhost /]# ll /etc/shadow
----------. 1 root root 1086 2月 26 22:38 /etc/shadow
[root@localhost /]# [ -L /etc/shadow ]
[root@localhost /]# echo $?
1
整數值比較
格式:[ 整數1 操作符整數2 ]
常用的操作測試符
-eq:等於(Equal)
-ne:不等於(Not Equal)
-gt:大於(Greater Than)
-lt:小於(Lesser Than)
-le:小於或等於(Lessser or Equal)
-ge:大於或等於(Greater or Equal)
案例:
如果登入使用者數小於或等於10則輸出YES
[root@localhost 桌面]# who|wc -l
2
[root@localhost 桌面]# [ `who|wc -l` -le 10 ] && echo "YES"
YES
變數的加減法運算:
變數的加法運算:
[root@localhost ~]# a=1000
[root@localhost ~]# echo $a
1000
[root@localhost ~]# expr $a + $a
2000
[root@localhost ~]# echo $a + $a //這是2中錯誤的操作,運算必須使用expr
1000 + 1000
[root@localhost ~]# expr $a+$a //$a + $a 要有空格否則也是錯誤的
1000+1000
變數的乘法運算:
[root@localhost ~]# expr $a * $a //* 在作業系統中視為特殊字元,\遮蔽字元的特殊意義
expr: syntax error
[root@localhost ~]# expr $a \* $a
1000000
[root@localhost ~]# expr 2 / 1 //除法
2
[root@localhost ~]# expr 2 – 1 //減法
1
[root@localhost ~]# expr 2 % 1 //取餘
0
位置變數:
0-9 常用的為1-9
通過指令碼來看些位置變數:
[root@localhost shellscripts]# cat a.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $0
[root@localhost shellscripts]# a.sh a b c d e
a
b
c
/shellscripts/a.sh //$0列印的是指令碼笨的名字
[root@localhost shellscripts]# a.sh 1 2
3
[root@localhost shellscripts]# a.sh 2 3
5
[root@localhost shellscripts]# cat a.sh
#!/bin/bash
echo `expr $1 + $2` //$1和$2代表了2個位置變數
[root@localhost shellscripts]#
預定義變數
$# : 命令列中位置引數的個數
$* : 所有位置引數的內容
$? : 上一條命令執行後返回的狀態,當狀態為0時表示正常,非0表示執行異常或出錯。
$$ : 當前所在程式的程式號
$! : 後臺執行的最後一個程式號
$0 : 當前執行的程式/程式名
指令碼的規範書寫:
#!/bin/bash
#Date : 2014-5-28
#Author : Create by meng //指令碼的創始人
#Mail :~~ //郵件地址
#Func (do):this is useradd user script. //指令碼的作用
#V1.1 //指令碼的版本
echo "hello,world!" //後面的才是指令碼的內容
文章版權:http://www.cnblogs.com/linux-super-meng/
字串比較
格式 [ 字串1 = 字串2 ]
[ 字串1 != 字串2 ]
[ -z 字串 ]
常用的測試操作符
=:字串內容相同
!=:字串內容不相同,!號表示相反的意思
-z:字元內容為空
#read -p "input your name: " name
root
#echo $name
#[ $name != "root"] && echo "name is erro"
##read -p "input your name: " name
zhangsan
#[ $name != "root"] && echo "name is erro"
#echo $name
文章版權:http://www.cnblogs.com/linux-super-meng/
邏輯測試
格式:[表示式1] 操作符 [表示式2]
常用的測試操作符
-a 或&&:邏輯與,“而且”的意思
#前後兩個表示式都成立是整個測試結果才為真,否則為假
(前面真則執行後面)
-o或||:邏輯或,或者的意思
#操作符兩邊至少一個為真時,結果為真,否則結果為假
(前面假則執行後面)
!:邏輯否
#當指定條件不成立時,返回結果為真
if條件語句 --單分支
當“條件成立“時執行相應的操作
if 條件測試命令 if 磁碟已用空間>80%
then 命令序列 ==》 then 報警
fi
應用案例:
如果/boot分割槽的空間使用超過80%,輸出報警資訊
#!/bin/bash
RATE=`df |awk'NR==4{print int($5)}'`
if [$RATE -gt 80]
then
echo "warning,DISK is full!"
if
if條件語句--雙分支
當“條件成立”、“條件不成立”時執行不同的操作
if 條件測試命令 if 3306埠是否在監聽狀態
then 命令序列1 ==》 then mysqld 服務已執行
else 命令序列2 else 啟動mysqld服務
fi
引用案例:
判斷vsftp是否在執行。若已執行則輸出提示資訊,否則重新啟動vsftp服務
#!/bin/bash
service vsftp status &>/dev/null
if [ $? -eq 0 ]
then
echo "vsftp service is running"
else
/etc/init.d/vsftp restart
fi
如果/boot分割槽的空間使用超過80%,輸出警報資訊。我們來寫個指令碼
#vi a.sh
#!/bin/bash
#a.sh
NUM=`df | awk 'NR==5{print int($5)}'`
if
[ $NUM -gt 80 ]
then
echo "Warning,DISK is full!"
if
awk的額外擴充套件
[root@localhost ~]# cat /etc/passwd | grep bash | awk -F: '{print ($1)}'
root
lenovo
[root@localhost ~]# ^C
文章版權:http://www.cnblogs.com/linux-super-meng/
for迴圈語句 for 收件人 in 郵件地址列表
根據變數的不通值,重複執行一組命令操作 ==》 do
for 變數名 in 取值列表 發郵件
do done
命令序列
done
#!/bin/bash
for TM in a b c d e
do
echo $TM
sleep 1
done
~
重複測試指定的條件,只要條件成立則反覆執行對應的命令操作
while 命令或表示式 while 可用記憶體<100mb
do ==》do
命令列表 獲取可用記憶體數
done done
文章版權:http://www.cnblogs.com/linux-super-meng/
多重分支語句
root@localhost ~]# cat a.sh
#!/bin/bash
#a.sh
case $1 in
start)
echo "start...."
;;
stop)
echo "stop......"
;;
restart)
echo "restart........"
;;
laod)
echo "laod......."
;;
status)
echo "start....."
echo "stop......"
;;
esac
[root@localhost ~]# ./a.sh start
start....
[root@localhost ~]# ./a.sh stop
stop......
[root@localhost ~]#
[root@localhost ~]# cat a.sh
#!/bin/bash
#a.sh
read -p "input:" NUM
case "$NUM" in
[a-z]|[A-Z])
echo "it is english"
;;
[0-9])
echo "it is shuzi"
;;
*)
echo "........."
;;
esac
[root@localhost ~]#
[root@localhost ~]# ./a.sh
input:2
it is shuzi
[root@localhost ~]# ./a.sh
input:a
it is english
[root@localhost ~]# ./a.sh @
input:@
.........
[root@localhost ~]# ./a.sh
input:#
.........
[root@localhost ~]#
shift遷移語句
用於遷移位置變數,將$1~$9依次向左傳遞
[root@localhost ~]# ./a.sh 10 20
The sum is: 30
[root@localhost ~]# cat a.sh
#!/bin/bash
#a.sh
Result=0
while [ $# -gt 0 ]
do
Result=`expr $Result + $1`
shift
done
echo "The sum is: $Result"
[root@localhost ~]#
break語句
用於跳出當前的迴圈體,執行迴圈體後的語句。
函式的應用
[root@localhost ~]# ./c.sh
46
55
[root@localhost ~]# cat c.sh
#!/bin/bash
#c.sh
adder(){
echo `expr $1 + $2`
}
adder 12 34
adder 22 33
[root@localhost ~]# ./c.sh
46
55
[root@localhost ~]#
宣告:以上知識全來自與自學shell程式設計總結回顧