1. 程式人生 > >shell中的變數及函式

shell中的變數及函式

############################1.變數###########################################

########簡介:

   (1)什麼是變數?

        變數即在程式執行過程中它的值是允許改變的量,變數是用一串固定的字元來標誌不固定的值的一種方法,變數是一種使用方便的佔位符,用於引用計算機記憶體地址,該地址可以儲存scripts執行時可更改的程式資訊。在shell 中變數是不可能永久儲存在系統中的,必須在檔案中宣告。

                     

    (2)都有哪些變數?

        在shell中變數分為環境級變數,使用者級變數,系統級變數, 環境級變數只在當前shell中生效,shell關閉變數丟失, 使用者級變數寫在使用者的骨檔案中,只針對當前使用者有效, 系統級變數被寫在系統的配置檔案/etc/profile中 ,變數即在程式執行時儲存在記憶體中。 硬碟永久,記憶體臨時的。

       使用者級的變數(相對於系統級檔案後被載入) 在./profile中定義 
       系統級的變數 在/etc/profile中定義 

       環境級的變數 a=1 export a=1 

       變數名稱的規範:

                    

########各種級別下的變數

(1)環境級:     export A=1 

      

(2)使用者級:     vim ~/.bash_profile 

                                 新增:export A=1

                                  

                                  

                                   //檢視不到變數的值是因為在不同的shell環境,新的shell會載入不同的配置檔案覆蓋原來的

(3)系統級:       vim /etc/profile 

                                  新增:export A=1                                               

                                  

                                  

                                        所有使用者都可以共享變數資源。

實戰演練

eg:實現用相對路徑執行指令碼(這是臨時的,如果重啟,設定會失效)

[root@desktop ~]# echo $PATH   //檢視環境變數
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@desktop ~]# ls /mnt/*
/mnt/file  /mnt/install_apache.sh  /mnt/passwd
[root@desktop ~]# chmod +x /mnt/*
[root@desktop ~]# install_apache.sh  11 //不能執行
bash: install_apache.sh: command not found...
[root@desktop ~]# PATH=$PATH:/mnt  //修改路徑
[root@desktop ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/mnt
[root@desktop ~]# install_apache.sh  12  //可以執行
the Listen is changed 
[root@desktop ~]# exit  //退出連線
logout
Connection to 172.25.254.169 closed.
[kiosk@foundation69 Desktop]$ ssh [email protected]172.25.254.169 -X  //重新連線
[email protected]172.25.254.169's password: 
Last login: Sun Jun 17 04:52:04 2018 from 172.25.254.69
[[email protected] ~]# chmod +x /mnt/*
[[email protected] ~]# install_apache.sh  //不能執行
bash: install_apache.sh: command not found...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

########環境變數的設定方式

“”是弱引用,批量轉譯,不能轉義”!”,”\”,”`”,”$” 

\代表單個字元,相當於” 
”是強引用,批量轉譯 
$()變數宣告,和“沒有區別 
$[]等同於(()) 
${}系統宣告 
echo 1+1 顯示結果為1+1,其中1+1是可變長字元 
echo $[1+1] 顯示結果為2,是整形字元

                      

                     

                      

                      

                      

###########變數值傳遞

    $0       指令碼的名字
    $1       指令碼後的第一串字串
    $2       指令碼後的第二串字串
    $3       指令碼後的第三串字串
    $#       指令碼後所跟字元的個數
    $*       指令碼後跟的所有字串,模式如“1 2 3 ……”
    [email protected]       指令碼後跟的所有字串,模式如“1” “2” “3” ……
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

eg:vim  file.sh

                                   這裡寫圖片描述 

                        

                         

eg:      $*和[email protected]的區別(指令碼示例):

[[email protected] ~]# vim for.sh
    #!/bin/bash
    for name in "[email protected]"
    do
        echo "$name"
    done
[[email protected] ~]# sh -x for.sh 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

                     

[[email protected] ~]# vim for.sh
    #!/bin/bash
    for name in "$*"
    do
        echo "$name"
    done
[[email protected] ~]# sh -x for.sh 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

                     

##########read互動式傳參

read -s NAME                                  //-s 表示加密,輸入的時候看不到輸入的字元 
read -p “input:” NAME                     //-p 列印

                         

                         

                          

    #!/bin/bash
    read -p "please input a number:" -s IP(-p 後跟提示內容  -s 表示不顯示輸入的內容)
    echo " "
    ping -c1 -w1 $IP &> /dev/null && echo $IP is up || echo $IP is down

                         

                          

         eg:互動式設定使用者檔案和密碼檔案建立使用者。

vim /mnt/create_user.sh
    #!/bin/bash
    read -p "please input userfile:" USERFILE
    [ ! -e $USERFILE ]&&{
    echo "\033[32mERROR:$USERFILE is not exist!!\033[0m"
    exit 1
    }
    read -p "please input passfile:" PASSFILE
    [ ! -e $PASSFILE ]&&{
    echo "\033[32mERROR:$PASSFILE is not exist!!\033[0m"
    exit 1
    }

    MAX_LINE=`awk 'BEGIN{N=0}{N++}{print N}' $USERFILE`       //利用資料報告生成器計算userfile的行數;
    for NUM in `seq 1 $MAX_Line`  //變數NUM從1迴圈到最大值
    do
        USERNAME=`sed -n ${NUM}p $USERFILE`  //利用sed對檔案userfle進行逐行提取
        PASSWORD=`sed -n ${NUM}p $PASSFILE`   
        useradd $USERNAME  //建立使用者
        echo $PASSWORD | passwd --stdin $USERNAME  //修改密碼
    done 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

                           

                           

###########命令別名的設定

   alias xie='vim'       shell 環境變數
   vim .bashrc
    alias xie='vim'      使用者變數
   source .bashrc
   vim /etc/bashrc
    alias xie='vim'      系統變數
   source /etc/bashrc
   刪除檔案中寫的內容
   unalias xie           撤銷別名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

1)臨時設定: 
alias xie=’vim’ //設定vim的別名,即輸入xie即可開啟vim的功能 

如果exit斷開連線,那麼臨時設定失效,下次登陸,xie命令不能識別; 



       
2)永久生效: 
(使用者級) 
vim ~/.bashrc 
alias xie=’vim’ 
source ~/.bashrc //重新整理 
alias //檢視,是否有設定的別名; 
但是,這種是在root的家目錄下設定的,只對root使用者生效;如果切換至student使用者,那麼xie命令不能識別; 


(系統級)
vim /etc/bashrc
     alias xie='vim'
source /etc/bashrc
alias       
  • 1
  • 2
  • 3
  • 4

這種方式,是在系統的配置檔案修改的,對所有可以登陸系統的使用者都生效;如,切換至student使用者,xie命令也是生效的;

3)unalias xie; //撤銷命令的別名: 

因為雖然把檔案資訊刪除之後,記憶體中還會存在別名設定的資訊,所以重新整理之後還會有alias xie存在;

#######利用命令執行結果設定變數

$? 是命令在執行完之後產生的退出值,範圍為[0-255] 
當$0=0,時表示命令執行沒有錯誤輸出,這個值可以用ecit 命令執行。

echo $? //檢視退出值(0-255) 
0 正確 
1 命令執行的錯誤 
2 方法不正確

示例 1: 
利用echo $?返回退出值來判斷是否ip 可以ping通;

[[email protected] mnt]# vim /mnt/ip_check.sh
    #!/bin/bash
    ping -c1 -w1 $1 &> /dev/dull
    NUM=`echo $?`
    [ "$NUM" == "0" ]&&{
        echo " $1 is up! "
        exit 1
    }||{
        echo " $1 is down!"
        exit 1
    }
[[email protected] mnt]# sh /mnt/ip_check.sh 172.25.254.74
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 112
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

######################2.函式##########################################

函式的優點: 
1)迴圈執行; 
2)簡化指令碼內容; 
3)可讀性更高;

示例 1: 
要求:執行腳本回車,提示動作,輸入add,建立使用者,回車,輸入密碼;輸入del,刪除使用者;如果輸入exit;退出;

vim /mnt/create_user.sh
    #!/bin/bash
    ACTION_ADD()
    {
            [ "$1" == add ] && {
                    read -p "please input a username: " USERNAME
                    read -p "please input a password: " -s PASSWORD
                    useradd $USERNAME
                    echo  -e "\033[31mthe users has created successfully!\033[0m"
                    echo $PASSWORD | passwd --stdin $USERNAME
            }
    }
    ACTION_DEL()
    {
            [ "$1" == del ] && {
                    read -p "please input a username: " USERNAME
                    userdel -r $USERNAME
                    echo -e "\033[31m the user has deleted!\033[0m"
            }
    }
    USER_CTL()
    {
            read -p "please input action(add or del): " ACTION
            [ "$ACTION" == exit ] && {
                    echo -e "\033[31mbye\033[0m"
                    exit 0
            }
            ACTION_ADD $ACTION
            ACTION_DEL $ACTION
            USER_CTL
    }
    USER_CTL
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32


示例 2: 
實現對主機ip的網路ping檢測迴圈不間斷,直至輸入exit才會退出;