shell腳本基礎

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,則退出

 

#!/bin/bash
#
read -p "please input a string : "  STRING
while [ $STRING !=  quit  ];do
        echo "$STRING" | tr 'a-z' 'A-Z'
        read -p "please input a string : "  STRING
done
  

寫一個腳本每隔5秒檢測Hadoop用戶是否登錄,如果登錄則顯示"hadoop  is logged in "

 

 

#!/bin/bash
#
who | grep 'hadoop'
REV=$?
while [ $REV  -ne   0  ];do
        echo "`date`,hadoop is not logged"
        sleep 5
        who | grep 'hadoop'
        REV=$?
done

 

如何測試192.168.0.151~192.168.7.254  之間的主機是否在線,統計個數并將它們顯示出來

 

#!/bin/bash
#
declare -i SUM=0
for (( J=250;J<=254;J++ ));do
        for (( K=200;K<=254;K++ ));do
        ping -c 1 -W  1 172.16.$J.$K  &> /dev/null
        REV=$?
                if [ $REV -eq  0  ];then
                        echo -e "\033[32m 172.16.$J.$K\033[0m  is logged"
                        SUM=$[$SUM+1]
                else
                        echo -e "\033[31m 172.16.$J.$K\033[0m  is not  logged"
                fi
        done
done
echo "the number of logged is : $SUM"

 

 

寫一個腳本,根據用戶的輸入情況來決定循環是否繼續,如果用戶輸入的是q則退出,否則一直循環

 

 

  1 #!/bin/bash
  2 #
  3 while :;do
  4         read -p "please input a filename : " FILENAME
  5         if  [ $FILENAME == ‘q’    ];then
  6                 break
  7         fi
  8 done

 

腳本綜合運用

 

寫一個腳本,為指定的硬盤創建分區
    列出當前系統上的所有磁盤,讓用戶選擇,如果選擇q則退出腳本,如果用戶選擇錯誤則讓用戶重新選擇
    當用戶選擇以后,提醒用戶接下來的操作可能會損毀數據,并請用戶確認,如果用戶選擇Y就繼續,否則,讓用戶重新選擇
    抹除那塊硬盤上的所有分區(提示,抹除所有分區后執行sync命令,并讓腳本睡眠3秒鐘再創建分區):并為其創建3個主分區,第一個為20M,第二個為512M etx3,第三個為128M ext3,
    且第三個分區類型為swap分區類型(提示:將分區命令用echo傳送給fdisk即可)

 

 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

 72 
 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

 

103 
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

(0)
Double fDouble f
上一篇 2017-04-16 09:46
下一篇 2017-04-16 13:49

相關推薦

  • lamp平臺 php解析器基于模塊和php-fpm

    首先,我先介紹一下實驗環境: http服務器:192.168.236.128(php解析器基于modules) mysql服務器:192.168.236.129 編譯和配置http服務器,http版本是2.4以上的。 由于http依賴于apr apr-util這兩個包,但是我們系統上的rpm包版本比較低,我們也需要下載這兩個源碼包來編譯,解決依賴關系。 還要…

    Linux干貨 2015-08-31
  • keepalived的安裝和配置

    一、簡介 Keepalived是一個免費開源的,用C編寫的類似于layer3, 4 & 7交換機制軟件,具備我們平時說的第3層、第4層和第7層交換機的功能。主要提供loadbalancing(負載均衡)和 high-availability(高可用)功能,負載均衡實現需要依賴Linux的虛擬服務內核模塊(ipvs),而高可用是通過VRRP協議實現多臺…

    Linux干貨 2017-10-30
  • tar,cpio,rpm,yum的使用詳解(適合初學者)

    基于linux下的tar包管理和yum源配置 友情提示:對于這些實際操作的,還是需要進行手工的嘗試,由于這幾個對于包管理的是比較常用和實用的, 所以,一定要熟練使用。 1.tar tar是對于系統中文件,目錄等進行打包,解包的工具。tar也可以對文件進行打包存放到別的目錄下, 所以在很早的時候,一些老的工程師經常使用tar對文件進行備份。很大程度上,所謂的t…

    Linux干貨 2016-08-21
  • Linux磁盤和文件系統管理

      Linux磁盤和文件系統管理.pdf Part.I 磁盤管理 1.cfdisk   #圖形化的很簡單. 不知道你們用什么 反正我喜歡這個 ^_^ cfdisk – display or manipulate disk partition table 必要參數的具體說明如下: -a用箭頭表示選取,而不是以反白表示 …

    Linux干貨 2016-04-05
  • Linux 基礎知識(二)

    一、Linux文件管理類命令的使用方法及其相關示例演示? 1、文件管理 2、文件查看 二、Bash特性詳解 1、命令行展開 (1)在/tmp目錄下創建:a_c,a_d,b_c,b_d 方法一:mkdir -pv {a,b}_{c,d} (2)在/tmp目錄下創建mylinux目錄,其結構如下:         方法一:…

    Linux干貨 2016-09-26

評論列表(1條)

  • renjin
    renjin 2017-04-21 09:57

    主要介紹了bash編程的基礎用法,及示例說明,內容總結的詳細,排版也很好,在排版上需要注意將終端命令或代碼添加至”插入程序代碼”中去,還有在總結的shell程序,建議將注釋標明

欧美性久久久久