您好,登錄后才能下訂單哦!
這篇文章主要介紹了LINUX中shell腳本編程的方法是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇LINUX中shell腳本編程的方法是什么文章都會有所收獲,下面我們一起來看看吧。
當命令不在命令行中執行,而是從一個文件中執行時,該文件就稱為 Shell 腳本。shell腳本是純文本文件,以行為單位逐行執行。
相當于一種命令翻譯器。
使用文本編輯器(或touch)創建腳本文件
語法:touch a.sh
將腳本添加可執行權限
語法:chmod +x a.sh
執行腳本命令:
(1)./a.sh
(2)sh a.sh
(3)source a.sh //不需要x權限
編輯腳本:vim a.sh
#!/bin/bash //系統以bash解釋器執行腳本
cd /etc/
pwd //命令語句
重定向輸出:將命令的執行結果覆蓋到目標文件
語法:df > a.txt //將磁盤信息覆蓋到a.txt文件
重定向追加:uname -p >> a.txt //將處理器類型追加到a.txt
重定向輸入:
vim pass.txt
123456
passwd --stdin jerry < pass.txt //標準輸入
tail -2 /etc/shadow //查看用戶密碼信息后兩行
將左側的命令輸出結果,作為右側命令的處理對象
cat a.txt |grep “123” //篩選出含字符串“123”的行
grep "bash$" /etc/passwd | awk -F: '{ print $1,$7 }' //-F:后要求有空格
例:提取根分區/的磁盤使用情況
df -hT //查看磁盤使用情況-h顯示更易讀-T顯示文件系統類型
df -hT | grep "/$" | awk '{print $6}'
shell變量用來存放系統和用戶需要使用的特定參數(值),而且這些參數可以根據用戶的設定或系統環境的變化而相應變化。
格式:變量名=變量值
格式:echo $變量名
echo命令的選項:
-n:取消自動換行
-e:使用轉義字符,把字符串中某些字符當成特殊字符處理
\t:制表符
\n:換行符
\b:刪除前一個字符
\f:換行但光標仍舊停留在原來的位置
\r:光標移至行首,但不換行
賦值時使用引號
雙引號:允許通過$符號引用其他變量值
單引號:禁止引用其他變量值,$視為普通字符
反撇號:命令替換,提取命令執行后的輸出結果
格式: read [-p "提示信息"] 變量名
Shell變量的數值運算多用于腳本程序的過程控制,只能進行整數運算,不支持小數 運算。整數的運算主要通過內部命令Expr進行。
格式:expr 變量1 運算符 變量2 [運算符 變量3]... //注意空格
常用運算符:加(+)、減(-)、乘(\*)、除(/)、取模(%)
例:設置X(值為35)、Y(值為16)兩個變量,并進行加、減、乘、除、取模運算
X=35
Y=16
expr $X + $Y
expr $X - $Y
expr $X \* $Y //乘法符號在shell中有其它含義,運算時需要轉意符號
expr $X / $Y
expr $X % $Y
由系統提前創建,用來設置用戶的工作環境
配置文件:/etc/profile 、~/.bash_profile
env :查看當前工作環境下的環境變量。
這表示為 $n,n為1~9之間的數字
例:編寫一個加法運算的小腳本a.sh,用來計算兩個整數的和。需要計算的兩個整數在執行腳本時以位置變量的形式提供。
#vim a.sh
#!/bin/bash
SUM=`expr $1 + $2`
echo "$1 + $2 = $SUM"
#chmod +x a.sh
#./a.sh 12 24 //$1為12、$2為24
是由Bash程序預先定義好的一類特殊變量,使用"$"符號和另一個符號組合表示。
$# :命令行中位置變量的個數
$* :所有位置變量的內容
$? :表示上一條命令執行后返回的狀態,當返回狀態值為0時表示執行正常,非0值表示執行異常或出錯
$0 :當前執行的進程/程序名
例:編寫一個備份小腳本
#vim mybak.sh
#!/bin/bash
TARFILE=beifen-`date +%s`.tgz
tar zcf $TARFILE $* &> /dev/null
echo "已執行$0腳本,"
echo "共完成$#個對象的備份"
echo "具體內容包括:$*"
#chmod +x mybak.sh
#./mybak.sh /boot/grub
#./mybak.sh /etc/passwd /etc/shadow
測試特定的表達式是否成立,當條件成立時,測試語句的返回值為0,否則為其他數值
格式1:test 條件表達式
格式2:[ 條件表達式 ] //注意空格,中括號與表達式之間有空格
執行條件測試操作以后,通過預定義變量"$?"獲取返回狀態值。
根據給定的路徑名稱,判斷對應的是文件還是目錄,或者判斷文件是否可讀、 可寫、可執行等。
用法:[ 操作符 文件或目錄 ]
-d:測試是否為目錄(Directory)
-e:測試目錄或文件是否存在(Exist)
-f:測試是否為文件(File)
-r:測試當前用戶是否有權讀取(Read)
-w:測試當前用戶是否有權寫入(Write)
-x:測試是否設置有可執行權限(Excute)
例:
[ -d /media/cdrom ]
echo $?
0 //返回0表示條件成立,返回1表示條件不成立
使用邏輯與"&&"和echo命令一起更直觀的顯示結果
[ -d /media/cdrom ] $$ echo "yes"
yes
根據給定的兩個整數值,判斷第一個與第二個數的關系
用法:[ 整數1 操作符 整數2]
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)
例:判斷當前已登錄的用戶數,超出五個時輸出"Too many"
Unum=`who | wc -l` //查看當前已登錄用戶數
[ $Unum -gt 5 ] && echo "Too many."
通常用來檢查用戶輸入、系統環境等是否滿足條件
用法1:[ 字符串1 = 字符串2] [ 字符串1 != 字符串2 ]
用法2:[ -z 字符串 ] //檢查是否為空
通用 :[ 字符串1 操作符 字符串2 ]
例1:判斷當前系統語言,不是"http://en.US"時輸出"Not http://en.US "
echo $LANG
[ $LANG != "http://en.US" ] && echo "Not http://en.US"
例2:用戶需輸入yes或no來確認操作
read -p "是否覆蓋現有文件(yes/no)?" ACK
[ $ACK = "yes" ] && echo "覆蓋"
read -p "是否覆蓋現有文件(yes/no)?" ACK
[ $ACK = "no" ] $$ echo "不覆蓋"
判斷兩個或多個條件之間的關系
用法1:[ 表達式1 ] 操作符 [ 表達式2 ]
用法2:命令1 操作符 命令2
&& :邏輯與,“而且”,使用test命令時可改為"-a"
|| :邏輯或,“或者”,使用test命令時可改為"-o"
! :邏輯否,“不”
例:測試當前系統內核版本是否符合要求
uname -r
Mnum=$(uname -r | awk -F. '{print $1}')
Snum=$(uname -r | awk -F. '{print $2}')
[ $Mnum -eq 2 ] && [ $Snum -gt 4 ] && echo "符合要求"
根據復雜程度:單分支的if語句,雙分支的if語句,多分支的if語句
只有條件成立時才會執行一條相應的代碼
用法:
if 條件測試
then 命令序列
fi
例:判斷掛載點目錄是否存在,若不存在則新建此目錄
vim chkmountdir.sh
#!/bin/bash
MOUNT_DIR="/media/cdrom/"
if [ ! -d $MOUNT_DIR ]
then
mkdir -p $MOUNT_DIR
fi
chmod +x chkmountdir.sh //給chkmountdir.sh執行的權限
./chkmountdir.sh
用法:
if 條件測試操作
then 命令序列1
else 命令序列2
fi
例:檢查目標主機是否能連通,顯示相應信息
vim pinghost.sh
#!/bin/bash
ping -c 3 -i 0.2 -w 3 $1 &> /dev/null //命令執行時的消息都不看
if [ $? -eq 0] //判斷前一條命令的返回狀態
then
echo "Host $1 is up."
else
echo "Host $1 is down."
fi
chmod +x pinghost.sh
./pinghost.sh 192.168.4.11
用法:
if 條件測試操作1
then 命令序列1
elif 條件測試操作2
then 命令序列2
else
命令序列3
fi
例:判斷分數范圍,分出優秀、合格、不合格三擋
vim gradediv.sh
#!/bin/bash
read -p "請輸入您的分數(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ &GRADE -le 100 ]
then
echo "$GRADE 分!優秀"
elif [ $GRADE -ge 70 ] && [ &GRADE -le 84 ]
then
echo "$GRADE 分,合格"
else
echo "$GRADE分?不合格"
fi
chmod +x gradediv.sh
./gradediv.sh
讀取不同的變量,用來逐個執行同一組命令
用法:
for 變量名 in 取值列表
do
命令序列
done
例1:根據姓名列表批量添加用戶
vim /root/users.txt //用做測試列表文件
jdy
ttl
tcc
vim uaddfor.sh
#!/bin/bash
ULIST=$(cat /root/users.txt)
for UNAME in $ULIST //從列表文件讀取用戶名
do
useradd $UNAME
echo "123456" | passwd --stdin $UNAME &> /dev/null
//通過管道指定密碼字串
done
chmod +x uaddfor.sh
./uaddfor.sh
tail -3 /etc/passwd
例2:根據IP地址列表檢查主機狀態
vim /root/ipadds.txt
192.168.4.11
192.168.4.100
192.168.4.120
vim chkhosts.sh
#!/bin/bash
HLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ] //嵌套if語句判斷連通性
then
echo "Host $IP is up."
else
echo "Host $IP is down."
fi
done
chmod +x chkhosts.sh
./chkhosts.sh
for循環語句非常適合用于列表對象無規律,且列表來源已經固定。而對于要求控制循環次數,操作對象按數字順序編號、按特定條件執行重復操作等情況,則更適合while循環語句。
重復測試某個條件,只要條件成立則反復執行
用法:
while 條件測試操作
do
命令序列
done
例:批量添加規律編號的用戶
#vim uaddwhile.sh
#!/bin/bash
PREFIX="stu"
i=1
while [ $i -le 20 ]
do
useradd ${[PREFIX}$i
echo "123456" | passwd --stdin ${PREFIX}$i &> /dev/null
let i++ //序號遞增,避免死循環
done
chmod +x uaddwhile.sh
./uaddwhile.sh
grep "stu" /etc/passwd | tail -3
例:猜價格游戲,要求由腳本預先生成一個隨機的價格數目(0-99)作為實際價格,判斷用戶猜測得價格是否高出或低于實際價格,給出相應的提示后再次要求用戶猜測,直到用戶猜中實際價格為止,輸出用戶共猜測的次數、實際價格。
#vim pricegame.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000) //輸入price一個隨機數
TIMES=0
echo "商品實際價格范圍為0-999,猜猜看是多少?"
while true //循環條件:true
do
read -p "請輸入你猜測的價格數目:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜你答對了,實際價格是$PRICE"
echo "你總共猜測了$TIMES次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了!"
else
echo "太低了!"
fi
done
chmod +x pricegame.sh
./pricegame.sh
針對變量的不同取值,分別執行不同的命令序列
用法:
case 變量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
......
*)
默認命令序列
esac
例:檢查用戶輸入的字符類型
提示用戶從鍵盤輸入一個字符,通過case語句判斷該字符是否為字母、數字或者其他控制字符,并給出相應的提示信息。
#vim hitkey.sh
#!/bin/bash
read -p "請輸入一個字符,并按Enter鍵確認:" KEY
case "$KEY" in
[a-z] || [A-Z])
echo "你輸入的是 字母."
;;
[0-9])
echo "你輸入的是 數字."
;;
*)
echo "你輸入的是 空格、功能鍵或其他控制字符."
esac
chmod -x hitkey.sh
./hitkey.sh
sed是stream editor(流編輯器)的縮寫,是一種在線編輯器,它一次處理一行內容。sed是非交互式的編輯器。
處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。
格式:sed+[選項]+‘命令’+文件名
常用選項:
-n :取消默認輸入
-e :多項編輯
-i :直接修改讀取的檔案內容,而不是由屏幕輸出
常用命令:
a\ :當前行后添加行
i\ :當前行前添加行
c\ :用字符串替換行
d :刪除行
p :打印行
s :用一個字符串替換另一個
w :將所選的行寫入文件
用于‘命令’之前,決定對哪些行進行編輯。
如果沒有指定地址,sed將處理輸入文件的所有行。
1.地址是一個數字,則表示行號;是“$"符號,則表示最后一行。
2.地址可以指定范圍,當需指定范圍時使用逗號(,)隔開。
1.p命令
格式:sed -n ‘行號p’ 文件名
2.d命令
格式:sed -n ‘行號d’ 文件名
3.s命令
格式:sed -n ‘行號s/a/b/g’文件名
將文件中指定行里所有的a字符替換為b字符,g為全局變量
4.i命令
格式:sed -i ‘行號3d’文件名
直接修改文件內容,不打印在屏幕上
5.e命令
格式:sed -e ‘3d’ -e ‘4p’ 文件名
先刪除第三行,再打印第四行字符
awk是一個強大的文本分析工具,相對于grep的查找,sed的編輯,awk在其對數據分析并生成報告時,顯得尤為強大。
簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。
1.格式:awk ' pattern {action} '
pattern常指關系表達式,例如:
awk‘/a/’file——顯示文件中包含a的行
awk‘$2>10’file——顯示第二列中數字大于10的行
2. 分隔提取:awk –F“分隔符”‘{print $1}’
例如:
awk –F.‘{print $1, print $2}’表示以點為分隔符將每一行的前二個字段,分行輸出
判定輸入ip的有效性:
vim a.sh
#!/bin/bash
read -p “請輸入ip:” A
B=`echo $A |awk -F. “{print $1}”`
if [ $B -le 0 ] || [ $B -gt 255 ]
then echo “請輸入正確的IP”
else
echo “ok”
fi
chmod +x a.sh
sh a.sh
例1:編寫一個系統服務腳本
vim myprog
#!/bin/bash
case "$1" in
start)
echo -n "正在啟動sleep服務..."
if sleep 7200 &
then
echo "OK"
fi
;;
stop)
echo -n "正在停止sleep服務..."
pkill "sleep" &> /dev/sull
echo "OK"
;;
status)
if pgerp "sleep" &> /dev/sull ;
then
echo "sleep服務已經啟動."
else
echo "sleep服務已經停止."
fi
;;
restart)
$0 stop
$0 start
;;
esac
chmod +x myprog
./myprog start
例2: shell打印九九乘法表
使用for循環
for i in $(seq 1 9)
do
for j in $(seq 1 $i)
do
echo -n “$j * $i” = $[i * j] “ ”
done
echo
done
//例中$[i * j]可寫為:$((i * j))、$[$j*$i]、$(( $j * $i ))、`expr $i \* $j`
//修改:第二個do下加一行 let “temp = i * j”,再把$[i * j]改為:$temp
while 反向的乘法表:
i=9
j=1
while ((i>=1))
do
while ((j<=i))
do
echo -n “$j * $i”=$[$j * $i] “ ”
let j++
done
len j=1
let i--
echo “”
done
關于“LINUX中shell腳本編程的方法是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“LINUX中shell腳本編程的方法是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。