shell腳本基礎
變量
bash的變量:
環境變量
本地變量
位置變量
特殊變量
本地變量:bash:作用域為整個bash進程
局部變量:作用域為當前代碼段 local VARNAME=VALUE
引用變量:${VARNAME}
環境變量:作用域為當前的shell進程及其子進程 export VARNAME=VALUE導出的含義
返回結果
程序執行可能有兩類返回值:
程序執行結果
程序狀態返回代碼(0-255) 0表示正常執行,其他的為錯誤執行
如檢查一下當前主機上是否存在一個叫做student的用戶
id student 然后echo $? 如果存在的話會顯示0,否則顯示其他
shell的條件測試條件測試類型
數值測試
-eq :測試兩個整數是否相等
-ne :測試兩個整數是否不等,不等為真,等為假
-gt:測試一個數是否大于另外一個數
-lt:測試一個數是否小于另外一個數
-ge:大于或等于
-le:小于或等于
文件類型的確定
-e 該檔名是否存在
-f 該檔名是否存在且為文件
-d 該檔名是否存在
字符串判斷
test -z string 判定字符串是否為 0 若 string 為空字符串,則為 true
test str1 == str2 判定 str1 是否等于 str2 ,若相等,則回傳 true
test str1 != str2 判定 str1 是否不等于 str2 ,若相等,則回傳 false
str1 =~ str2 判斷str2是否是str1的子串
-n 與 -z相反
邏輯與和邏輯或
&& 邏輯與 前面命令是真時才執行后面的命令
|| 邏輯或 前面命令為假時才執行后面的命令
流程控制
if條件判斷
單層分支
if [ 條件判斷式 ]; then
當條件判斷式成立時,可以進行的指令工作內容;
fi(這個if非常容易忘記)
多重分支
if [ 條件判斷式 ]; then
當條件判斷式成立時,可以進行的指令工作內容;
else
當條件判斷式不成立時,可以進行的指令工作內容;
fi
for循環的結構:
for 變量 in 列表; do
循環體
done
while 循環(適用于循環次數未知的程序)
語法:
while CONDITON;do
statement
…
done
while 需要循環修正
while 里面的循環初始值需要給出,如i=1
還需要注意的是需要有循環修正,使得循環不至于一直持續下去
until(直到滿足一定條件,循環終止)
語法:
until CONDITTION; do
statement
…
done
即是條件最開始是不滿足的,只有當條件滿足的時候循環才中止
與while的當條件不滿足時就終止剛好相反
所以平常中有while的判斷條件為 當什么條件不滿足的時候就怎么樣此時就可以用until
for循環的第二種使用方式
for (( expr1; expr2; expr3 ));do
循環體
done
expr1 給定變量的初始值
expr2 判定循環退出條件
expr3 修正變量的值
case語句 多分支選擇結構
語法
case SWITCH in 這里的SWITCH一般是要引用變量的值
value1)
statement
…
;;
value2)
statement
…
;;
value3)
statement
…
;;
*)
statement
…
;;
esac
其中的value是字符,故前面的字符比較也是可以用的
while的特殊用法1:
無限循環,加上break之后,在某一條件滿足的時候退出
具體的用法:
while :;do
statement
done
while的特殊用法2:
while可以從指定的文本文件中以行為單位,依次遍歷其中的行
while read line; do
statement
done
腳本運用實例
寫一個腳本,提示用戶輸入一個字符串,將其轉換為大寫后輸出,如果用戶輸入的quit,則退出
寫一個腳本每隔5秒檢測Hadoop用戶是否登錄,如果登錄則顯示"hadoop is logged in "
如何測試192.168.0.151~192.168.7.254 之間的主機是否在線,統計個數并將它們顯示出來
腳本綜合運用
1 #!/bin/bash
2 #
3 #program
4 # the program can make 3 partations
5 #Author:Double.f
6 #Date:2017-4-13
7
8
9 fdisk -l | grep '^Disk /dev/sd[a-z]' | awk -F: '{print $1}' | cut -d' ' -f2 | sed '$ a \q'
10 A=`fdisk -l | grep '^Disk /dev/sd[a-z]' | awk -F: '{print $1}' | cut -d' ' -f2 | sed '$ a \q'`
11
12 read -p "please choose a disk: " DISK
13
14 while :;do
15 S=0
16 for I in `echo $A`;do
17
18 if [ $I == $DISK ];then
19 S=1
20 break
21 fi
22
23 done
24 if [ $S -ne 1 ];then
25 read -p "please choose a disk: " DISK
26 fi
27
28 if [ $S -eq 1 ];then
29 break
30 fi
31 done
32
33 if [ $DISK == ‘q’ ];then
34 echo "Quiting….."
35 sleep 2
36 exit 8
37 fi
38
39 rm -rf /tmp/zhanshi.txt
40
41 read -p "the operation will delte the full data of the $DISK,continue or exit?(Y/N):" JUDGE
42 until [ $JUDGE == ‘Y’ -o $JUDGE == ‘N’ ];do
43 read -p "Try again,and choose a correct option :" JUDGE
44 done
45
46
47 for I in `mount | grep "$DISK" | awk '{print $1}'`;do
48 fuser -km $I
49 umount $I
50 sleep 1
51 echo "umount $I finished"
52 done
53
54
55 if [ $JUDGE == ‘Y’ ];then
56 dd if=/dev/zero of=$DISK bs=512k count=1 &> /dev/null
57 sync
58 sleep 2
59 echo 'n
60 p
61 1
62
63 +20M
64 n
65 p
66 2
67
68 +512M
69 n
70 p
71 3
73 +128M
74 t
75 3
76 82
77 w ' | fdisk $DISK &> /dev/null
78
79 echo "partation finished !"
80 sleep 1
81 echo "mkfs is going.."
82 sleep 1
83 partprobe $DISK
84 sync
85 sleep 1
86 mke2fs -j ${DISK}1 &>/dev/null
87 mke2fs -j ${DISK}2 &> /dev/null
88 mkswap ${DISK}3 &> /dev/null
89
90 echo "mkfs is finished !"
91 sleep 1
92 echo "Preparing mount …."
93 read -p "please input a mount directory ${DISK}1:" DIR1
94 read -p "please input a mount directory ${DISK}2:" DIR2
95 read -p "please input a mount directory ${DISK}3:" DIR3
96
97 until [ $DIR1 != $DIR2 -a $DIR1 != $DIR3 -a $DIR2 != $DIR3 ];do
98 echo " mount is busy !!!please choose other directory"
99 read -p "please input a mount directory ${DISK}1:" DIR1
100 read -p "please input a mount directory ${DISK}2:" DIR2
101 read -p "please input a mount directory ${DISK}3:" DIR3
102 done
104 mount ${DISK}1 $DIR1
105 mount ${DISK}2 $DIR2
106 swapon ${DISK}3
107
108 sleep 1
109 echo "mount is finished !"
110
111 else
112 exit 9
113 fi
原創文章,作者:Double f,如若轉載,請注明出處:http://www.www58058.com/73381
主要介紹了bash編程的基礎用法,及示例說明,內容總結的詳細,排版也很好,在排版上需要注意將終端命令或代碼添加至”插入程序代碼”中去,還有在總結的shell程序,建議將注釋標明