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
下一篇 2017-04-16

相關推薦

  • BIND(Berkeley Internet Name Domain) is an implementation of the DNS(Domain Name System) (Blob 12)

    正向解析區域、反向解析區域;主/從;子域;基本安全控制;

    2017-11-29
  • nginx+tomcat+memcached構建session共享集群

    一、安裝配置tomcat 配置前說明: 系統為centos7 m1.xsllqs.com地址為192.168.1.107 c1.xsllqs.com地址為192.168.1.114 c2.xsllqs.com地址為192.168.1.113 安裝tomcat需要配合JDK使用,JDK有oracle JDK和open JDK兩種 oracle JDK8的下載地…

    Linux干貨 2016-06-26
  • linux 計劃任務

    Linux之 計劃任務 介紹 相信每個人都有使用鬧鐘的習慣,我們設定鬧鐘的種類有很多。比如說,只提醒一次、工作日提醒、休息日提醒等。在設定鬧鐘之后,每天的設定時間都會按時的提醒你去做什么事情,以免自己忘記一些重要的會議等事情。像這樣在每天特定的時間安排做一些事情。這樣一種事情我們就稱之為例行任務計劃。 其實在個系統平臺上都有類似的例行性任務計劃功能,那如何去…

    Linux干貨 2017-09-04
  • N25-第十一周作業

    1、詳細描述一次加密通訊的過程,結合圖示最佳。   以Bob和Alice安全通訊為例:     Bob<———>Alice    1. Bob要和Alice安全通信首先要取得對方的公鑰,即對方的證書,并驗證證書的合法性。驗證過程和內容: &n…

    Linux干貨 2017-03-20
  • 任務計劃2

    [root@localhost app]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin:/root/bin MAILTO=root   # For details see man 4 crontabs   # Example of job defi…

    Linux干貨 2017-05-15
  • Tomcat基礎及常見使用入門

    Tomcat的簡單介紹,安裝,以及簡單的配置運用

    2017-09-11

評論列表(1條)

  • renjin
    renjin 2017-04-21 09:57

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

欧美性久久久久