shell編程1:變量的使用與例子


一、Shell腳本的執行通常可以采用以下幾種方式:

1):bash script-name或sh script-name(推薦使用)
2):path/script-name 或./script-name(當前路徑下執行腳本)
3):source script-name或 . script-name #→注意”.”點號。
4):sh<script-name或cat scripts-name|sh(同樣適合bash)

二、普通變量:

1:環境變量:變量必須是大寫

1):配置永久性的環境變量,全局變量的配置文件:/etc/profile 、/etc/bashrc 基本上使用 /etc/profile
2):配置用戶的環境變量的配置文件,分別是:用戶的主目錄下的隱藏文件:~/.bash_profile 、 ~/.bash_bashrc
3):臨時設置 # export ZSY=1
4):設置所有用戶生效的目錄 :/etc/profile.d/ :目錄下必須是腳本否則無法使用
5):如果寫一個JAVA的腳本,要把JAVA環境變量放入腳本內,特別是定時任務執行的時候
6):顯示環境變量:
    (1):# env //* 顯示的環境變量 
    (2):# set //* 顯示的環境變量跟多
7):取消環境變量 
    (1):# unset <環境變量名> //* 臨時取消變量
    (2):進入文件刪除變量

2:環境變量的意義:

1):UID :當前用戶的UID
2):USER :當前登錄的用戶
3):HOME :當前的用戶主目錄
4): _= :上一條命令的最后一個參數
5):BASH :調用實例時使用的全路徑
6):PS1 :當前的終端
7):PATH :命令所在路徑

3:局部變量:

1):一般連續的字符串,數字,路徑等可以不加任何引號,不過無引號的情況最好用雙引號替代之。
2):如果變量中使用其他變量時,則不可以使用單引號否則無法使用:如下:
    [root@centos6 ~]# a='$USER'
    [root@centos6 ~]# echo $a
    $USER

3):如果變量中有空格的話,就必須使用雙引號否則無法輸出:如下:
    [root@centos6 ~]# a=1 2 3
    -bash: 2: command not found
    [root@centos6 ~]# a="1 2 3"
    [root@centos6 ~]# echo $a
    1 2 3

4:引號的意義

1):無引號:把內容輸出出來,會將未含有空格的字符串視為一個整體輸出; 如果有命令(要在反引號中的)、變量、特殊轉義符解析出結果然后子在輸出最終內容來,如果字符串中有空格等特殊字符則則不能完整輸出,需要加雙引號,一般連續的字符串,數字,路徑等可以不加任何引號, 不過無引號的情況最好用雙引號替代之。
2):單引號:可以說是所見即所得:即將單引號內的所有內容都原樣輸出,或者描述為里面看到的是什么就會輸出什么
3):雙引號:把雙引號內的所有內容都輸出出來;如果有命令(要在反引號中的)、變量、特殊轉義符解析出結果然后子在輸出最終內容來。
4):反引號:一般用於執行命令,執行的時候命令會執行,同理可以使用 a=$(ls):結果相同

5:變量定義小結:

5.1. 普通變量:

a=1     # 連續的數字字符串
a="/etc/rc.local $USER"   # 解析結果后輸出
a='$USER'      # 原樣輸出

5.2. 命令內容定義:

a=`ls`   #反引號, 將反引號中字符當做命令輸出 
a=$(ls)

5.3. 特殊變量:位置變量

 

1):$n :獲取當前執行的shell腳本的第n個參數值(參數值默認以空格區分,如果參數加了雙引號,則將雙引號的整個作為一個參數, 不管其中是否有空格,如 例3 ),n=1..9 ,當 n 為0時表示腳本的文件名,如果n大於9,用大括號括起來${10},參數以空格隔開。如下:

例1:
    [root@centos6 ~]# echo $1 a
    a
    [root@centos6 ~]# echo $1 $2 a b
    a b

例2:
    [root@centos6 ~]# cat p.sh 
    echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}
    [root@centos6 ~]# sh p.sh {a..z} 
    a b c d e f g h i j k l m n o

例3:
    [root@centos6 ~]# cat p.sh 
    echo $2
    [root@centos6 ~]# sh p.sh "1 2" "3 4"
    3 4

    # 注意當整數超過9 時,數字要使用 “{}” 擴起來否則會出現 以下結果
    [root@centos6 ~]# cat p.sh 
    echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
    [root@centos6 ~]# sh p.sh {a..z}
    a b c d e f g h i a0 a1 a2 a3 a4 a5

2):$0 獲取當前腳本本身的名字

$1    # 獲取當前傳遞給該shell腳本的第一個參數
$2    # 獲取當前傳遞給該shell腳本的第二個參數
$#    # 獲取當前傳給腳本的參數個數
$$    # 獲取當前腳本運行的當前進程 PID 號
$@    # 獲取當前傳給腳本的所有參數的列表
$*    # 獲取當前以一個單字符串顯示所有向腳本傳遞的參數,與位置變量不同,參數可超過9個
$?    # 是顯示最后命令的退出狀態,0表示沒有錯誤,其他表示有錯誤

3):$1 是傳遞給該shell腳本的第一個參數,一般系統啟動文件最后都有這個,作為接收輸入的命令如

# /etc/init.d/sshd start   # 是將 start 賦值給 $1,然后腳本根據這個參數執行這個參數下的命令:如下腳本:
    [root@centos6 ~]# cat p.sh 
    case "$1" in
      start)
        echo "123" && exit 0
        ;;
      stop)
        echo "234" && exit 0
        ;;
    esac
    exit
    [root@centos6 ~]# /etp.sh start
    123
    [root@centos6 ~]# sh p.sh stop
    234

4):$0 是用來取腳本本身的名字,就是你命令之后跟的內個名字,如下圖的 sh a.sh 中的 a.sh

    [root@centos6 ~]# cat a.sh 
    echo $0
    [root@centos6 ~]# sh a.sh 
    a.sh

例1:在啟動腳本中也有 $0 ,當啟動腳本的時候輸入的不正確時就會出現
    [root@centos6 ~]# tail -4 /etc/init.d/sshd |head -1
    echo $"Usage: $0 {start|stop|restart|reload|force-reload|condrestart|try-restart|status}"
    [root@centos6 ~]# /etc/init.d/sshd *
    用法: /etc/init.d/sshd {start|stop|restart|reload|force-reload|condrestart|try-restart|status}

例2:將文件與名字分離
    [root@centos6 etc]# cat ~/a.sh
    dirname $0 
    basename $0 
    [root@centos6 etc]# sh ~/a.sh 
    /root
    a.sh

    # dirname $0 取得是路徑
    # bashname $0 取得是名字

5):$# :獲取當前傳給腳本的所有參數的個數,一般用於控制參數個數,如例1.

    [root@centos6 ~]# cat a.sh 
    echo $#
    [root@centos6 ~]# sh a.sh 1 2 3 4 5 6 
    6

例1:判斷參數少於兩個,就告訴報 腳本名加 "ARG1 ARG2" ,等於或大於兩個參數時,顯示錢兩個參數
    [root@centos6 ~]# cat a.sh 
    #!/bin/bash
    [ $# -ne 2 ] && {
    echo "$0 ARG1 ARG2"
    exit 1
    }
    echo $1 $2
    [root@centos6 ~]# sh a.sh 
    a.sh ARG1 ARG2
    [root@centos6 ~]# sh a.sh 1 2
    1 2

    # 腳本中的 exit 1 指的是返回值:如下例2

例2:
    [root@centos6 ~]# cat p.sh 
    echo "123456789"
    exit 28
    [root@centos6 ~]# sh p.sh 
    123456789
    [root@centos6 ~]# sh p.sh ;echo $?
    123456789
    28

6):$? 命令執行的返回值,0表示沒有錯誤,其他表示有錯誤

[root@centos6 ~]# ls ; echo $?
a.sh iptables.sh p.sh
0
[root@centos6 ~]# 123 ; echo $?
-bash: 123: command not found
127

# 分號就是間隔符,表示前面和后面是兩個命令的意思,執行完前一個,再執行后一個,兩個命令沒有任何依賴關系

5.4. 返回值代表意義:

0 :成功
1 或 2 :權限拒接,表示權限不足
1~125 :表示運行失敗,腳本命令、系統命令錯誤或參數傳遞錯誤;
126 :找到命令了,但是無法執行
127 :命令找不到,
大於128的 :命令執行中退出


免責聲明!

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



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