文章版權:http://www.cnblogs.com/linux-super-meng/
環境變量路徑:
[root@localhost ~]# set
//檢視到的是局部變量和全局變量2種
[root@localhost
~]# env //檢視系統的全局環境變量
~]# echo $PATH //檢視系統環境變量路徑
~]# export $PATH //也可以使用export檢視環境變量路徑
~]# export PATH=$PATH:/date/ //臨時添加/date目錄到環境變量路徑下
要想重新開機主機後還生效就要編輯環境配置檔案root/.bashec或/root/.bash_profile與/etc/profile檔案,想要立刻生效可以使用指令:
注:.bash_profile檔案支隊系統目前使用者生效
~]# source .bash_profile
~]# ls –a 可以檢視到這2個檔案
腳本的執行:
sh script
//這種方法script不需要可執行權限
./
script //必須具有可執行權限
.
script
//這種方法script也不需要可執行權限
區分局部變量和全局變量
~]# str=1000 //局部變量
~]# echo $str
1000
去編輯一個腳本:
#
vim bianliang.sh
#!/bin/bash
echo
$str
~]# bianliang.sh //我們定義的變量,但是通過腳本卻不能輸出
~]# export str //添加到全局變量中
~]# bianliang.sh //再次使用完全ok
要想完全的清除某個全局變量:
unset str 清除全局變量
#env
可以檢視到所有全局變量
&& || 的用法:(參數的比對)
&& 條件符合要求才會執行後面的動作
|| 條件不符合要求時才會執行後面的動作
//檢視/ect目錄下是否有/grub.conf檔案,有則輸出yes,無則輸出no。
~]# [ -f /etc/grub.conf ] && echo yes || echo no
Yes
檢視/shellscripts/hello.sh是否可執行,可執行則輸入yes,否則就賦予它可執行權限
shellscripts]# [ -x /shellscripts/hello.sh ] && echo yes || chmod +x
/shellscripts/hello.sh
shellscripts]# ls
hello.sh
ipadd.sh logmess_clean.sh
shellscripts]# hello.sh
hello
world!
“”和‘’與 ` ` 在shell變量中的差別
“ ” 允許通過$符引用其他變量
‘’禁止引用其他變量符,視為普通字元
`` 将指令執行的結果輸出給變量
~]# echo "$PWD is lujing"
/root
is lujing
~]# echo ‘$PWD is lujing‘
$PWD
~]# echo $a
~]# echo $aaaaaaaa //系統把$aaaaa視為一個變量
~]# echo ${a}aaaaaa //把變量用{}括起來,系統才會去輸出變量
1000aaaaaa
#echo
`ls` 反引号中的指令時可以單獨執行的,然後再由echo輸出
擴充:”\ “反斜杠,作用屏蔽字元的特殊意義
test指令
用途:測試表達式是否成立,成立傳回值為0,否傳回值為其他值。
格式:test
條件表達式 [條件表達式]
≡
常見的測試類型
測試檔案的狀态
字元的串比較
整數值比較
邏輯測試
測試檔案的狀态
格式:[操作符 檔案或目錄]
常見的測試操作符
-d :測試是否為目錄【directory】
/]# [ -d /var/spool/ ]
/]# echo $?
-e:測測試目錄或檔案是否存在【exist】
/]# [ -e /etc/passwd ]
-f:測試是否為檔案【file】
Packages]# [ -f /etc/passwd ]
Packages]# echo $?
Packages]#
-r:測試目前的使用者是否有讀取的權限【read】
/]# [ -r /etc/shadow ]
/]#
-w:測試目前的使用者是否有寫的權限【write】
/]# [ -w /etc/shadow ]
-x:測試目前的使用者是否可執行和該檔案【excute】
/]# [ -x /etc/shadow ]
1
/]# ll /etc/shadow
----------.
1 root root 1086 2月 26 22:38 /etc/shadow
-L:測試是否為符号連結檔案【link】
/]# [ -L /etc/shadow ]
格式:[ 整數1 操作符整數2
]
常用的操作測試符
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lessser or Equal)
-ge:大于或等于(Greater or Equal)
案例:
如果登入使用者數小于或等于10則輸出YES
桌面]# who|wc -l
2
桌面]# [ `who|wc -l` -le 10 ] && echo "YES"
YES
變量的加減法運算:
變量的加法運算:
~]# a=1000
~]# 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 *
//* 在作業系統中視為特殊字元,\屏蔽字元的特殊意義
expr: syntax error
[root@localhost ~]# expr $a \*
$a
1000000
[root@localhost ~]# expr 2 /
1 //除法
[root@localhost ~]# expr 2 –
1 //減法
[root@localhost ~]# expr 2 %
1
//取餘
位置變量:
0-9 常用的為1-9
通過腳本來看些位置變量:
[root@localhost shellscripts]# cat
a.sh
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
3
[root@localhost shellscripts]# a.sh 2
5
echo `expr $1 +
$2`
//$1和$2代表了2個位置變量
[root@localhost shellscripts]#
預定義變量
$# : 指令行中位置參數的個數
$* : 所有位置參數的内容
$? : 上一條指令執行後傳回的狀态,當狀态為0時表示正常,非0表示執行異常或出錯。
$$ : 目前所在程序的程序号
$! : 背景運作的最後一個程序号
$0 : 目前執行的程序/程序名
腳本的規範書寫:
#Date : 2014-5-28
#Author : Create by
meng //腳本的創始人
:~~
//郵件位址
#Func (do):this is useradd user
script.
//腳本的作用
#V1.1
//腳本的版本
"hello,world!"
//後面的才是腳本的内容
文章版權:/
字元串比較
格式 [ 字元串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: "
zhangsan
格式:[表達式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服務
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
#a.sh
NUM=`df | awk ‘NR==5{print
if
[ $NUM -gt 80 ]
echo "Warning,DISK is
awk的額外擴充
[root@localhost ~]# cat /etc/passwd | grep
bash | awk -F: ‘{print ($1)}‘
lenovo
[root@localhost ~]# ^C
for循環語句
for 收件人
in 郵件位址清單
根據變量的不通值,重複執行一組指令操作
==》
do
for 變量名 in 取值清單 發郵件
done
指令序列
for TM in a b c d e
echo $TM
sleep 1
~
重複測試指定的條件,隻要條件成立則反複執行對應的指令操作
while 指令或表達式
while 可用記憶體<100mb
do
==》do
指令清單 擷取可用記憶體數
done
多重分支語句
root@localhost ~]# cat a.sh
case $1 in
start)
echo
"start...."
;;
stop)
"stop......"
restart)
"restart........"
laod)
echo
"laod......."
status)
"start....."
esac
[root@localhost ~]# ./a.sh start
start....
[root@localhost ~]# ./a.sh stop
stop......
[root@localhost ~]#
[root@localhost ~]# cat a.sh
read -p "input:" NUM
case "$NUM" in
[a-z]|[A-Z])
echo "it is
english"
[0-9])
shuzi"
*)
"........."
[root@localhost ~]# ./a.sh
input:2
it is shuzi
input:a
it is english
[root@localhost ~]# ./a.sh @
input:@
.........
input:#
shift遷移語句
用于遷移位置變量,将$1~$9依次向左傳遞
[root@localhost ~]# ./a.sh 10 20
The sum is: 30
Result=0
while [ $# -gt 0 ]
Result=`expr $Result + $1`
shift
echo "The sum
is: $Result"
break語句
用于跳出目前的循環體,執行循環體後的語句。
函數的應用
[root@localhost ~]# ./c.sh
46
55
[root@localhost ~]# cat c.sh
#c.sh
adder(){
echo `expr $1 + $2`
}
adder 12 34
adder 22 33
聲明:以上知識全來自與自學shell程式設計總結回顧