(一)shelll 腳本
什麼是shell腳本?
簡單的說,只要將平時使用的各種linux命令,按順序保存到一個文本文件中,然後添加可執行權限,這個文件就成爲一個shell腳本。
shell腳本格式:
#!/bin/bash //特殊腳本聲明,表示此行以後的語句通過/bin/bash程序來解釋執行
#這是一個簡單的shell腳本 //#開頭表示註釋信息
cd ~root
touch shell
mv shell shelll
echo 這就是shell腳本的基本格式 //echo用於輸出字符串,以使腳本輸出信息更容易讀懂
shell腳本運行方式
1.給腳本添加可執行權限(x)
例:chmod +x shell
./shell
2.通過內部命令sh、source、.
例:sh -x shell(加 -x參數,可以查看腳本運行過程)
source shell
. shell
(二)shell 變量
什麼是shell變量
shell變量用來存放系統和用戶需要使用的特定參數(值),而且這些參數可以根據用戶的設定或系統環境的變化而相應變化,通過使用變量,shell程序能夠提供更加靈活的功能,適應性更強。
set 查看所有shell變量
unset 刪除變量(後跟變量名即可)
1.自定義變量(本地變量)
例:_XIAO=this //設置自定義變量
echo _XIAO //查看自定義變量
注:變量名建議用大寫,只能用字母、數字,下劃線,而且不能以數字開頭
雙引號 ""
_XIAO1="$XIAO is cat" //要包括別的變量,或跟多個單詞,必須用""括起來
echo $_XIAO1
this is cat
單引號 ''
_XIAO2='$XIAO is cat !' //不能包含變量,裏面寫什麼就是什麼
echo $_XIAO2
$XIAO is cat !
反撇號 ``
_XIAO3=`which man` //將可執行的命令行的結果,賦值給自定義變量
echo $_XIAO3
/usr/bin/man
$()
_XIAO3=$(rpm -qf $(which man)) //如果要使用多重反撇號,只能用$()表示
echo $_XIAO3
man-1.6f-32.el6.x86_64
expr數值變量的運算
注:expr命令對整數型變量進行算術變量
例:
#!/bin/bash
#這是個數值變量運算
VALUE1=10
VALUE2=20
VALUE3=30
A=`expr $VALUE1 + $VALUE2 + $VALUE3`
echo + $A +加
B=`expr $VALUE1 - $VALUE2 - $VALUE3`
echo - $B -減
C=`expr $VALUE1 \* $VALUE2 \* $VALUE3`
echo "\* $C" \*乘(因爲*是通配符,不能當乘法運算符,所以要加轉譯符\)
D=`expr $VALUE1 / $VALUE2 / $VALUE3`
echo / $D /除
read命令:從鍵盤讀入數據,賦給變量
例:
#!/bin/bash
read A B C
echo one is $A
echo two is $B
echo three is $C
sh read.sh //執行shell腳本
10 20 30 //輸入10、20、30
one is 10
two is 20
three is 30
2.環境變量
set 查看當前工作下的環境變量
3.位置變量
將命令行的第一個部分作爲命令名,其它部分作爲參數。
例:
#!bin/bash
#這是一個位置變量
ls -l $1 $2 $3 //$0爲這個程序的命令名即ls -l,$n爲這個程序的第n個參數吧,n=1-9
sh wzbl.sh file1 fil2 fil3 //file1、file2、file3 分別對應$1 $2 $3
4.預定義變量
$* 這個程序的所有參數
$# 這個程序的參數個數
$$ 這個程序的PID
$! 執行上一個命令的PID
$? 執行上一個命令行的返回值 0爲這個程序執行正確 非0爲不正確
$0 這個程序本身
例:
#!/bin/bash
#this is ydybl
echo '$* is' $*
echo '$# is' $#
echo '$$ is' $$
echo '$! is' $!
echo '$? is' $?
echo '$0 is' $0
echo '$1 is' $1
echo '$2 is' $2
echo '$3 is' $3
echo '$4 is' $4
sh ydybl.sh file1 file2 file3 file4 //執行預定義變量腳本
$* is file1 file2 file3 file4
$# is 4
$$ is 21155
$? is 0
$0 is tsbl.sh
$1 is file1 //位置變量1是file1
$2 is file2 //位置變量2是file2
$3 is file3 //位置變量3是file3
$4 is file4 //位置變量4是file4
(三)條件測試操作
1.test條件表達式
形式一:test 條件表達式
例:
test 5 -ne 6 && echo '5不等於6'
5不等於6
形式二:[條件表達式]
例:
[ 5 -ne 6 ] && echo "5不等於6"
5不等於6
字符串測試:
test xiao = hang 測試字符串是否相等
test xiao != hang 測試字符串是否不相等
test xiao 測試字符串是否不爲空
test -n xiao 測試字符串是否不爲空
test -z xiao 測試字符串是否爲空
整數測試:
test xiao -eq hang 測試整數是否相等
test xaio -ge hang 測試xiao是否>=hang
test xiao -gt hang 測試xiao是否>hang
test xiao -le hang 測試xaio是否<=hang
test xiao -lt hang 測試xiao是否<hang
test xiao -ne hang 測試整數是否不相等
文件測試:
test -d xiao 指定文件是否爲目錄
test -f xiao 指定文件是否爲文件
test -x xiao 指定文件是否是否可執行
test -r xiao 指定文件是否可讀
test -w xiao 指定文件是否可寫
test -a xiao 指定文件是否存在 或者用-e參數
test -s xiao 文件大小是否非0
邏輯測試:
! 邏輯否(不)
&& 或 -a 邏輯與(而且),-a只能使用test命令測試時才能用
|| 或 -o 邏輯與(或者),-o只能使用test命令測試時才能用(只寫一個test就可以)
例:
A=5
test $A -gt 10 || test 1 -lt $A && echo "符合要求" 或 test $A -gt 10 -o1 -lt $A && echo "符合要求"
2.單分支if語句
如果結果爲“真”就執行一個操作,爲“假”什麼都不執行
if [條件測試操作]
then
命令序列
fi
3.雙分支if語句
如果結果爲“真”執行一個操作,爲“假”再執行一個操作
if [條件測試操作]
then
命令序列1
else
命令序列2
fi
4.多分支if語句
if [條件測試操作1]
then
命令序列1
elif [條件測試2]
then
命令序列2
else
命令序列3
fi
例:
#!/bin/bash
#多分支if語句
echo “請輸入您的成績”
read A 或 read -p “請輸入您的成績” A
if [ $A -ge 85 ] && [ $A -le 100 ]
then
echo 您的成績爲,優!
elif [ $A -ge 70 ] && [ $A -le 84 ]
then
echo 您的成績爲合格!
else
echo 您的成績不合格?
fi
(四) for循環語句
for循環語句語法結構:
for 變量名 in 取值列表
do
命令序列
done
例:
#!/bin/bash
#這是個批量添加用戶的腳本
USER=xiao
A=123
for NAME in {1..10} //變量名爲NAME,取值範圍爲1~10
do
useradd ${USER}$NAME &> /dev/null //批量添加用戶,並把消息給/dev/null
echo "${USER}${NAME}${A}" | passwd --stdin ${USER}$NAME &> /dev/null //批量設置密碼
done
(五) while循環語句
特殊條件測試操作: while true(真) 、while false(假) //while true 等同於 while :
let XIAO++ 使變量XIAO的值增加1(等同於XIAO=`expr $XIAO + 1`)
exit 0 退出
break 強制退出
while循環語句語法結構:
while 條件測試操作
do
命令序列
done
例:
ech#!/bin/bash
#猜我生日
D=0
echo "猜猜我生日吧,我是哪一年"
while true
do
read A
let D++
if [ $A -lt 1993 ]
then
echo "我有那麼老嗎?再猜猜看哦! "
elif [ $A -eq 1993 ]
then
echo "你總共猜了${D}次"
echo "小子,眼力不錯嘛?"
break
else
echo "我有那麼小嗎?再猜猜看哦!"
fi
done
(六) case分支語句
case 語句的結構:
case 變量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
......
* ) //若找不到任何匹配的值,則執行默認模式
默認命令序列
esac
例:
e#!/bin/bash
#整人的心理測試題
echo " ------------------------------------------------------------"
echo "|這是一道高智商的心裏測試題,作者xiaoxiao|"
echo " ------------------------------------------------------------"
echo
echo "做題前要有心理準備哦!"
echo " 你被困在一個孤島上,船隻能載一個人,你需要選擇"
echo "A 搶船走人"
echo "B 殺死美女搶船走人"
echo "C 留下美女天天雲雨"
echo "D 放走美女自己等死"
echo "請您做出選擇,並按Enter鍵確認"
F=0
G="您可嘗試做出別的選擇"
while [ $F -lt 4 ] //當while循環體次數,大於4,程序結束
do
read E
let F++
case "$E" in
A)
if [ $F -ne 4 ] //if雙分支語句和case分支語句套用
then
echo "禽獸!"
echo "$G!"
else
echo "禽獸!歡迎下次再來哦!"
fi
B)
if [ $F -ne 4 ]
then
echo "禽獸不如!"
echo "$G!"
else
echo "禽獸不如!歡迎回答笑笑問答!"
fi
;;
C)
if [ $F -ne 4 ]
then
echo "比禽獸還禽獸!"
echo "$G"
else
echo "比禽獸還禽獸!歡迎回答笑笑問答!"
fi
;;
D)
if [ $F -ne 4 ]
then
echo "不但不如禽獸,還是個蠢貨!"
echo "$G"
else
echo "不但不如禽獸,還是個蠢貨!拜拜哦!"
fi
;;
*) //默認模式
echo "請您做出正確選擇!"
esac //case 分支語句結束
done //while 循環語句結束
Shell 語法 | |||||
if 語句 | for 循環語句 | while 循環語句 | case 分支語句 | ||
語法格式 | if [條件測試操作1] then 命令序列1 elif [條件測試2] then 命令序列2 else 命令序列3 fi | for 變量名 in 取值列表 do 命令序列 done | while 條件測試操作 do 命令序列 done | case 變量值 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; ...... * ) 默認命令序列 esac | |
說明 | if語句是最爲常用的一種流程控制方式,用來根據特定的條件測試結果,分別執行不同的操作(如果.......那麼......) | 指定一個變量及可能的取值列表,針對每一個不同的取值,重複執行相同的命令序列,直到變量值用完退出循環 | 根據特定的條件反覆執行一個命令序列,直到改條件不再滿足爲止 | case語句可以使腳本程序的結構更加清晰,層次分明 | |
適用場合 | 適用於選擇執行的命令語句較多時 | 適用於列表對象無規律,且列表來源已固定(如某個列表文件) | 適用於控制循環次數、操作對象按數字順序編號,按特定條件執行重複操作 | 適用於某個變量存在多種取值,需要對其中的每一種取值分別執行不同的命令序列,與多分支if 語句非常相似,只不過if語句需要判斷多個不同的條件,而case語句只是判斷一個變量的不同值 | |
小技巧 | 取值列表中: [1....9] 表示一個範圍 `` 直接把命令結果傳遞給前面變量名 | while true(真) while false(假) while true等同於while : let XIAO++(等同於XIAO=`expr $XIAO + 1`) exit 0 退出 break 強制退出 | 模式字符串中: [0-9] 表示一個連續範圍 | 表示”或” 例 A|B |