簡單過下bash/sh腳本基本知識吧


1、sh/bash要注意空格的使用

2、

for循環:

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done

while循環和多選擇語句

#!/bin/bash
while :
do
    echo -n "輸入 1 到 5 之間的數字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你輸入的數字為 $aNum!"
        ;;
7|8)
echo 'ok'
;;
*) echo "你輸入的數字不是 1 到 5 之間的!" continue echo "游戲結束" ;; esac done

 

函數定義方法:

pathmunge () {
    case ":${PATH}:" in
        *:"$1":*)
            ;;
        *)
            if [ "$2" = "after" ] ; then
                PATH=$PATH:$1
            else
                PATH=$1:$PATH
            fi
    esac
}

函數參數:在Shell中,調用函數時可以向其傳遞參數。在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數...

帶參數的函數示例:

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

funWithParam(){
    echo "第一個參數為 $1 !"
    echo "第二個參數為 $2 !"
    echo "第十個參數為 $10 !"
    echo "第十個參數為 ${10} !"
    echo "第十一個參數為 ${11} !"
    echo "參數總數有 $# 個!"
    echo "作為一個字符串輸出所有參數 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
輸出結果:

第一個參數為 1 !
第二個參數為 2 !
第十個參數為 10 !
第十個參數為 34 !
第十一個參數為 73 !
參數總數有 11 個!
作為一個字符串輸出所有參數 1 2 3 4 5 6 7 8 9 34 73 !

注意,$10 不能獲取第十個參數,獲取第十個參數需要${10}。當n>=10時,需要使用${n}來獲取參數。另外,還有幾個特殊字符用來處理參數:

$# 傳遞到腳本的參數個數
$* 以一個單字符串顯示所有向腳本傳遞的參數
$$ 腳本運行的當前進程ID號
$! 后台運行的最后一個進程的ID號
$@ 與$*相同,但是使用時加引號,並在引號中返回每個參數。
$- 顯示Shell使用的當前選項,與set命令功能相同。
$? 顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。

 

 

-r 是否可讀

-x 是否可執行

-w 是否可寫

-n str 字符串不為null,長度大於零

-z str 字符串為null,長度為零

-d 存在且是一個目錄

-e 文件存在

-f 存在且是一個常規文件,非目錄,非特殊類型文件

-s 文件存在且不為空

-O own所屬的文件

-G group所屬的文件

  • -N file :在上次讀取后,文件有改動
  • file1 -nt file2 :file1 比 file2 更新,以最后更新時間為准
  • file1 -ot file2 :file1 比 file2 更舊 ,以最后更新時間為准

 

 

 >或者<或者=是用於字符串的比較

整數比較

-gt 大於

-ge 大於等於

-lt 小於

-le 不大於

-eq 等於

-ne 不等於

&& 與

||

 

$1 第一個變量 $2依次類推

$?上次的執行結果

exit 0、exit 1等,表示程序運行完的執行結果

export 把某個變量變為全局變量

source 或者 . 執行,表示立即生效

符號的用法:

1、`cmd`

2、[]:中括號兩邊都要有空格

if [ "$EUID" = "0" ]; then
    pathmunge /sbin
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
else
    pathmunge /usr/local/sbin after
    pathmunge /usr/sbin after
    pathmunge /sbin after
fi

 

3、{} :{ cmd1;cmd2;cmd3;} 在當前shell順序執行命令cmd1,cmd2,cmd3, 各命令之間用分號隔開, 最后一個命令后必須有分號, 第一條命令和左括號之間必須用空格隔開

4、() :(cmd1;cmd2;cmd3) 新開一個子shell順序執行命令cmd1,cmd2,cmd3, 各命令之間用分號隔開, 最后一個命令后可以沒有分號

5、;

6、''  :里面的變量,不取值   a=2;echo 'shen $a'--->shen $a

7、"" :里面的表里取值  a=2;echo "shen $a"--->shen 2

 

shell內建命令:

1、unset 命令用於刪除已定義的shell變量(包括環境變量)和shell函數。unset命令不能夠刪除具有只讀屬性的shell變量和環境變量。-f:僅刪除函數(function); -v:僅刪除變量(variable)。
2、set  命令作用主要是顯示系統中已經存在的shell變量,以及設置shell變量的新變量值。使用set更改shell特性時,符號"+"和"-"的作用分別是打開和關閉指定的模式。set命令不能夠定義新的shell變量。如果要定義新的變量,可以使用declare命令以變量名=值的格式進行定義即可。

 

字符串提取和替換:  ${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}

       第一種模式:${var:num},這種模式時,shell在var中提取第num個字符到末尾的所有字符。若num為正數,從左邊0處開始;若num為負數,從右邊開始提取字串,但必須使用在冒號后面加空格或一個數字或整個num加上括號,如${var: -2}、${var:1-3}或${var:(-2)}。        
      第二種模式:${var:num1:num2},num1是位置,num2是長度。表示從$var字符串的第$num1個位置開始提取長度為$num2的子串。不能為負數。
       第三種模式:${var/pattern/pattern}表示將var字符串的第一個匹配的pattern替換為另一個pattern。
       
       第四種模式:${var//pattern/pattern}表示將var字符串中的所有能匹配的pattern替換為另一個pattern。

 

[root@centos ~]# var=/home/centos
[root@centos ~]# echo $var
/home/centos
[root@centos ~]# echo ${var:5}
/centos
[root@centos ~]# echo ${var: -6}
centos
[root@centos ~]# echo ${var:(-6)}
centos
[root@centos ~]# echo ${var:1:4}
home
[root@centos ~]# echo ${var/o/h}
/hhme/centos
[root@centos ~]# echo ${var//o/h}
/hhme/cenths

 

 

 

 

 

參考:

1、 http://man.linuxde.net/set
2、http://www.runoob.com/linux/linux-shell-func.html

3、http://blog.csdn.net/taiyang1987912/article/details/39551385

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM