linux學習筆記: shell腳本編程相關(上)

前言 
unix/linux操作系統下的shell,是一種,其目的是提供一個用戶與計算機相互交互的命令接口,通過輸入各種命令,達到操作的目的。 
與此同時,shell支持控制流程,進而可以組合出各種各樣的應用實例。

  • shell腳本的格式 

    • 首行shebang機制: 
      bash腳本,首行添加#!/bin/bash [options] 
      csh腳本,首行添加#!/bin/csh [options] 
      ksh腳本,首行添加#!/bin/ksh [options] 
      ……
    • 描述腳本的注釋部分: 
      包括Author, Version, Date, Description,……該部分是非必須項,目的是為了讓使用腳本的人能夠比較清晰地了解該腳本的背景以及功能 
      ……
    • 腳本的正文部分: 
      包含命令與聲明,以面向過程的形式組合在一起

腳本示例如下:

#!/bin/bash     #首行的shebang,表示使用bash編寫腳本
#Author: AAA  #標注作者(格式規范,非必須)
#Version: 1.0   #標注版本(格式規范,非必須)
#Date: 2017-04-14   #標注日期(格式規范,非必須)
#Description: XXXXX...      #腳本功能描述(格式規范,非必須)

echo "Hello World"      #腳本正文部分

  • 編寫腳本的一些規范 
    1. 腳本的第一行shebang注明調用的語言 
    2. 注釋上一些信息,諸如: 文件名,功能描述,作者,版本…… 
    3. 變量名和函數名建議使用同一種命名法則 
    4. 有盡量多的注釋說明程序的功能,單行注釋寫在代碼行上部或者尾部 
    5. 代碼做的修改要加必要的版本注釋和功能說明 
    6. 腳本的控制流程里面建議要有縮進,使用一定數量的空格或者Tab 
    7. 文件名按照使用的語言,以.sh,.pl,.py等形式為后綴

  • 常用的符號

符號 描述
在單引號中所有特殊符號均無特殊含義
“” 在雙引號中,除“$”“\”外其他特殊符號都無特殊含義
$() 在括號中使用系統命令
$ 調用變量的值
\ 轉義符
$n 代表命令行的第n個參數,其中$0代表命令本身
$# 代表命令行中參數的個數
$* 代表命令行中所有的參數,把所有參數看成一個整體
$@ 代表命令行中的所有參數,把每個參數個別對待
$? 代表最后一次執行的命令的返回狀態,返回0代表執行成功,否則不成功
$$ 代表當前進程的進程號
$! 代表后臺運行的最后一個進程的進程號

  • 變量 
    用戶自定義變量 *: 
    為局部變量,只對當前shell生效。默認類型為字符串類型。 
    定義:變量名=變量值,當變量中含有空格時,需要用引號引起來 
    聲明:declare [+/-] [option] 變量名 
    選項: +取消屬性 -設置屬性 -i 整型 -a 數組 -r 只讀 
    使用unset命令刪除變量 
    更加詳細的聲明規則,可以使用help declare查詢 
    數組 *: 
    定義數組: arr_name=(value1 value2 ….)或 使用arr_name[index]=value單獨為元素賦值 
    注意: 
    數組元素放在小括號內,而不是大括號,元素之間使用空格分開,而不是逗號,元素下標從0開始 
    獲取數組元素: {arr_name[index]} 索引號為index的元素 {array_name[*]}數組的所有元素 
    獲取數組長度: ${#arr_name[*]} 
    數組切片:${arr_name[@]:start:length} 
    元素匹配替換:${arr_name[@]/before/after} 
    環境變量 *: 
    為全局變量,對子shell仍然有效,一般定義為大寫,使用命令env或者set命令可以查詢,用命令declare -x可以自定義環境變量,使用unset命令可以刪除變量。常用的系統預定義的環境變量如下所示:
變量 描述
$PATH 命令的搜尋路徑
$OLDPWD 前一個工作目錄
$LANG 目前的工作環境語言
$BASH 目前使用的shell的絕對路徑(默認為/bin/bash)
$BASH_VERSION 使用的shell解釋器的版本
$HISTCONTROL 控制歷史記錄,常用的有ignoredups,erasedups,ignorespace,……
$OSTYPE 顯示系統類型
$MAIL 存放mail的文件
$MAILCHECK 多久檢查一下郵件
$PWD 當前路徑
$SSH_TTY 當前登錄的TTY
$SHLVL 當前SHELL在第幾層
$RANDOM 輸出一個隨機整數

注:生成0-49之間的隨機數可以用如下命令:

echo $[RANDOM%50]
  • 算數運算 
    bash支持簡單的算數運算,實現方式如下:

    1. let r=9+9
    2. r=$[9+9]; r=$[VAR1+VAR2]
    3. r=$((9+9)); r=$((VAR1+VAR2))
    4. expr 8 + 3
    5. declare -i r=9+9
    6. echo “9+9” | bc
  • 賦值 
    可以使用如下幾種賦值符號: 
    =, +=, -=, *=, /=, %= 
    使用示例如下:

[root@centos7-front1 scripts]# a=10;b=10
[root@centos7-front1 scripts]# echo $a $b
10 10
[root@centos7-front1 scripts]# let c=a++
[root@centos7-front1 scripts]# echo $c
10
[root@centos7-front1 scripts]# let d=++b
[root@centos7-front1 scripts]# echo $b
11
  • 字體顏色 
    字體顏色示例如下:

    echo -e “\033[30m 黑色字 \033[0m” 
    echo -e “\033[31m 紅色字 \033[0m” 
    echo -e “\033[32m 綠色字 \033[0m” 
    echo -e “\033[33m 黃色字 \033[0m” 
    echo -e “\033[34m 藍色字 \033[0m” 
    echo -e “\033[35m 紫色字 \033[0m” 
    echo -e “\033[36m 天藍字 \033[0m” 
    echo -e “\033[37m 白色字 \033[0m”

    帶背景的字體示例如下:

    echo -e “\033[40;37m 黑底白字 \033[0m” 
    echo -e “\033[40;37m 紅底白字 \033[0m” 
    echo -e “\033[40;37m 綠底白字 \033[0m” 
    echo -e “\033[40;37m 黃底白字 \033[0m” 
    echo -e “\033[40;37m 藍底白字 \033[0m” 
    echo -e “\033[40;37m 紫底白字 \033[0m” 
    echo -e “\033[40;37m 天藍底白字 \033[0m” 
    echo -e “\033[40;37m 白底黑字 \033[0m”

  • 條件判斷 
    使用test命令或者[]或者[[]]對條件進行測試 
    關于文件的判斷,使用方式如下:
判斷符 解釋
-e 判斷文件是否存在,如果存在則為真
-d 判斷文件是否存在并且是否是目錄(目錄是一種特殊的文件),是則返回真
-f 判斷文件是否存在并且是普通文件,是則返回真
-r 判斷文件是否存在并且執行判斷的用戶是否對該文件有讀的權限,是則返回真
-w 判斷文件是否存在并且執行判斷的用戶是否對該文件有寫的權限,是則返回真
-x 判斷文件是否存在并且執行判斷的用戶是否對該文件有執行的權限,是則返回真
-nt 判斷前面的文件是否比后面的文件新,是則返回真
-ot 判斷前面的文件是否比后面的文件舊,是則返回真
-ef 判斷前后兩個文件的i節點是否相同,是則返回真

        使用示例如下:

[guest@centos7-front1 ~]$ ls
1.sh  attach  file
[guest@centos7-front1 ~]$ [ -e "/home/guest/file" ] && echo "True" || echo "False"
True
[guest@centos7-front1 ~]$ [ -d "/home/guest/file" ] && echo "True" || echo "False" 
False
[guest@centos7-front1 ~]$ [ -f "/home/guest/file" ] && echo "True" || echo "False" 
True
[guest@centos7-front1 ~]$ ls -al
total 28
drwx------  3 guest guest  144 Apr 17 16:51 .
drwxr-xr-x. 3 root  root    18 Mar 30 10:58 ..
-rwxr-xr-x  1 guest guest  171 Apr 17 16:51 1.sh
-rw-r--r--  1 root  root     1 Mar 30 13:21 attach
-rw-------  1 guest guest  416 Apr 10 17:05 .bash_history
-rw-r--r--  1 guest guest   18 Nov 20  2015 .bash_logout
-rw-r--r--  1 guest guest  193 Nov 20  2015 .bash_profile
-rw-r--r--  1 guest guest  231 Nov 20  2015 .bashrc
--w-------  1 guest guest    0 Apr 10 16:58 file
drwxr-xr-x  4 guest guest   37 Mar 19 18:42 .mozilla
-rw-------  1 guest guest 1013 Apr 17 16:51 .viminfo
[guest@centos7-front1 ~]$ 
[guest@centos7-front1 ~]$ [ -r "/home/guest/file" ] && echo "True" || echo "False" 
False
[guest@centos7-front1 ~]$ [ -w "/home/guest/file" ] && echo "True" || echo "False" 
True
[guest@centos7-front1 ~]$ [ -x "/home/guest/file" ] && echo "True" || echo "False" 
False
......
......
[guest@centos7-front1 ~]$ [ "/home/guest/.bash_history" -nt "/home/guest/.bash_logout" ] && echo "True" || echo " False"
True
[guest@centos7-front1 ~]$ [ "/home/guest/.bash_history" -ot "/home/guest/.bash_logout" ] && echo "True" || echo " False"  
 False

        關于整數的判斷,使用的方式如下:

判斷符 解釋
-eq 判斷前后兩個整數是否相等,是則返回真
-ne 判斷前后兩個整數是否不相等,不相等則返回真
-gt 判斷前一個整數是否大于后一個整數,是則返回真
-lt 判斷前一個整數是否小于后一個整數,是則返回真
-ge 判斷前一個整數是否大于等于后一個整數,是則返回真
-le 判斷前一個整數是否小于等于后一個整數,是則返回真

        使用示例如下:

[root@centos7-front1 ~]# a=1 b=2 c=2
[root@centos7-front1 ~]# [ $a -eq $b ] && echo "True" || echo "False"
False
[root@centos7-front1 ~]# [ $a -ne $b ] && echo "True" || echo "False"  
True
[root@centos7-front1 ~]# [ $a -gt $b ] && echo "True" || echo "False"  
False
[root@centos7-front1 ~]# [ $a -lt $b ] && echo "True" || echo "False" 
True
[root@centos7-front1 ~]# [ $b -ge $c ] && echo "True" || echo "False"    
True
[root@centos7-front1 ~]# [ $b -le $c ] && echo "True" || echo "False"  
True

        關于字符串的判斷,使用方式如下:

判斷符 解釋
-z 判斷后面的字符串是否為空,是則返回真
-n 判斷后面的字符串是否不為空,不為空則返回真
== 判斷前后字符串是否相等,相等則返回真
!= 判斷前后兩個字符串是否不相等,不相等則返回真
> 前面字符串的ascii碼是否大于后面字符串的ascii碼,大于則返回真
< 前面字符串的ascii碼是否小于后面字符串的ascii碼,小于則返回真
=~ 左側的字符串是否能夠被右側的pattern所匹配,是則返回真

        使用示例如下:

[root@centos7-front1 scripts]# cat execute.sh 
#!/bin/bash -x
ARG=$1
if [[ -f "$ARG" ]] && [[ "$ARG" =~ .sh$ ]]; then
        echo "ok"
else
        echo "fail"
fi
[root@centos7-front1 scripts]# bash execute.sh file 
fail
[root@centos7-front1 scripts]# bash execute.sh 1.sh 
ok
  • 流程控制 
    if語句控制流程,內容如下:
if [ 條件1 ];then
  expression
elif [ 條件2 ];then
  expression
  .....
else
  expression
fi

        多分支case語句控制流程,內容如下:

case $變量名 in
          "value1")
                expression
                ;;
          "value2")
               expression
               ;;
          .......
          *)
              expression
              ;; 
esac  


使用示例如下:
#!/bin/bash
read -t 30 -p "please input yes or no...." VAR
case $VAR in
        yes)
                echo "your input is yes."
        ;;
        no)
                echo "your input is no."
        ;;
        *)
                echo "your input is error..."
        ;;
esac

        for循環控制流程,內容如下:

形式1
for 變量  in  value1 value2 value3.....
do
      expression
done 

示例:
#!/bin/bash
cd /root/test/
ls *.tar.gz  >  ls.log
ls *.tgz    >>ls.log
for i in $(cat ls.log)
do
      tar -zxf $i &> /dev/null  #將執行中顯示的信息丟到黑洞
done
rm -rf ls.log

形式2
for ((初始值;循環控制條件; 變量變化))
do
        expression
done

示例:
#!/bin/bash
#從1加到100
s=0;
for((i=1;i<=100;i=i+1))
do
     s=$(($s+$i))
done
echo "the sum is:$s"    

    while循環控制流程,只要條件為真,便一直執行下去。內容如下:

while [ 條件判斷式 ]
do
   程序
done

示例:
#!/bin/bash
#從1加到100
i=1
s=0
while [ $i -le 100 ]
do
     s=$(($s+$i))
     i=$(($i+1))
done
echo "the sum is:$s"

    until循環控制流程,一直執行,直到條件為真為止。內容如下:

until [ 條件判斷式 ]
do
   程序
done

示例:
i=1
s=0
until [ $i -ge 100 ]
do
     s=$(($s+$i))
     i=$(($i+1))
done
echo "the sum is:$s"

原創文章,作者:jiangche00,如若轉載,請注明出處:http://www.www58058.com/73656

(0)
jiangche00jiangche00
上一篇 2017-04-18
下一篇 2017-04-18

相關推薦

  • RHCE系列之磁盤加密—-LUKS加密

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1436460        LUKS (Linux Unified Key Setup)為 Linux 硬盤…

    Linux干貨 2016-08-15
  • 如何正確安裝一個源碼包

        下周就要考試了,心情挺忐忑不安的,前幾天做了25期的考試題,感覺每個題都是老師上課講過的,但是自己做卻想不起來了。這應該就像學習數學一樣,需要大量練習,做的多了自然就會了。     這周我們學習了如何使用yum,還學習了磁盤管理。針對如何安裝源碼包,以httpd包為例我們…

    2017-08-19
  • 用戶和組

    3A安全介紹 資源分派: Authentication:認證 Authorization:授權 Accouting|Audition:審計 安全上下文 Linux安全上下文 運行中的程序:進程 (process) 以進程發起者的身份運行: root: /bin/cat mage: /bin/cat 進程所能夠訪問資源的權限取決于進程的運行者的身份 用戶use…

    Linux干貨 2016-08-08
  • 第一天心得體會

    初次見面,你好

    2018-03-26
  • 初識mysql:基本原理和使用

    一、 數據庫的出現      1. 數據庫是什么: 數據庫簡單來說,就是存儲數據的地方(廢話),對于用戶認證這個過程來說,當用戶登錄服務器時, 系統需要把用戶的輸入的用戶認證信息和存儲的用戶認證信息進行比對,這一過程就需要事先把所有用戶的信息存儲在一個數據庫中,然后逐條進行比對。早起最傳統的數據庫當然就是文本…

    Linux干貨 2015-06-04
  • M20-1 8月5號作業

    作業:    1、取本機IP地址;    2、取各分區利用率的數值;    3、統計/etc/init.d/functions 文件中每個單詞出現的次數,并按頻率從高到低顯示;    4、/etc/rc.d/init.d/functions或/etc/rc.d/init.d/fu…

    Linux干貨 2016-08-15

評論列表(1條)

  • renjin
    renjin 2017-04-21 10:00

    主要總結了shell編程的基礎用法,內容總結的很詳細,排版也很好,下次需要注意將代碼再注釋詳細一些,尤其是在示例的代碼中

欧美性久久久久