bash腳本變量的使用

bash腳本的變量使用詳解

變量的類型包括整數、字符串和數組,但在bash腳本編程中不需要指定類型就可以直接賦值,默認均為字符型,其參與運算會自動進行隱式類型轉換。

變量的賦值方式為:name='value',其中“=”兩邊一定不能有空格,如果變量值中包含有空格則需要使用引號引起來,需要注意的是強引用和弱引用的區分。此外變量的賦值也可以引用變量和命令,如果引用變量賦值需要使用雙引號,如果引用命令賦值需要使用反向單引號。變量的引用需要使用"$"符號,如引用變量PATH:$PATH 或 ${PATH}。

示例1:

[root@fengl /]# a=hello        #給變量a賦值hello
[root@fengl /]# b="hello world"    #給變量b賦值hello world
[root@fengl /]# c="$a world"        #給變量c賦值并引用變量a的值,需要使用雙引號
[root@fengl /]# echo $c
hello world
[root@fengl /]# c='$a world'   #引用變量a的值給變量c賦值時,如果使用單引號則表示強引用
[root@fengl /]# echo $c
$a world
[root@fengl /]# d="hello `hostname`"     #引用命令賦值時需要在命令上使用反向單引號
[root@fengl /]# echo $d
hello fengl
[root@fengl /]# d="hello $(hostname)"     #引用命令賦值時也可以使用“$()”的方式
[root@fengl /]# echo $d
hello fengl
[root@fengl /]# d='hello `hostname`'      #引用命令賦值時如果使用單引號則會將其當成字符串處理
[root@fengl /]# echo $d
hello `hostname`

bash腳本編程的變量根據生效范圍的不同可以分為多種,以下將對每種變量做詳細介紹。

1、局部變量(本地變量)

局部變量也叫本地變量,局部變量的生效范圍僅限當前shell進程,對當前shell之外的其他進程以及當前shell的子進程均無效,即局部變量只能在進程內自己使用,不能被別的進程使用,包括子進程。

示例2:

 #查看已編好的測試腳本,該腳本中定義了局部變量testvar
[root@fengl bin]# cat test.sh   
#!/bin/bash
#author:liang
#Version:1.0
#Test script

testvar="hello world"
echo "This is my first script,the testvar value is $testvar"
 
 #直接執行test.sh腳本可以正常調用腳本中的變量
[root@fengl bin]# test.sh    
This is my first script,the testvar value is hello world

 #使用echo命令調用test.sh腳本中的變量testvar,發現無法輸出變量結果,即局部變量在當前shell的其他進程中無效
[root@fengl bin]# echo "testvar value is $testvar"    
testvar value is
 
 #再編輯一個腳本test1.sh,在該腳本中重新定義一個變量testvar2,并調用這個變量testvar2和test.sh腳本中的變量testvar,
 #同時也對test.sh腳本進行修改,在test.sh腳本中執行test1.sh,實現變量testvar在子進程中被調用,并觀察結果
 
[root@fengl bin]# cat test1.sh    #查看test1.sh腳本
#!/bin/bash

testvar2="hello chain"
echo "testvar:$testvar"
echo "testvar2:$testvar2"
[root@fengl bin]# cat test.sh    #查看test.sh腳本
#!/bin/bash
#author:liang
#Version:1.0
#Test script

testvar="hello world"
echo "This is my first script,the testvar value is $testvar"
test1.sh 

[root@fengl bin]# test.sh   #執行test.sh腳本,并觀察結果
This is my first script,the testvar value is hello world
testvar:                    #發現test.sh的子進程test1.sh無法調用test.sh中的變量
testvar2:hello chain        
[root@fengl bin]# test1.sh               #執行test1.sh腳本,并觀察結果
testvar:                #發現test.sh中的變量無法被其他進程調用
testvar2:hello chain

2、環境變量

環境變量與局部變量的最大的區別是環境變量可以在當前shell的其他進程中被調用,也可以在當前shell的子進程中被調用,但在其他shell中無法被調用,系統中常用的變量大多數都是環境變量,并且系統中的環境變量全部為大寫字母,如PATH、LANG、SHELL等。環境變量的定義方式也與本地變量不同,環境變量定義時需要聲明該變量是環境變量,聲明方式為:

export name=VALUE   或       declare -x name=VALUE

查看環境變量的命令也有多個,分別為:

export   或   env   或   printenv

3、只讀變量

只讀變量也叫常量,一旦聲明了只讀變量后,則該變量無法修改和刪除,常用于固定的值,如圓周率π。只讀變量和局部變量類似,只讀變量也只能在自己的進程中使用,不能被當前shell的其他進程調用,包括子進程。只讀變量和局部變量在退出當前的進程時將被自動刪除。

聲明只讀變量的方式為:

readonly name       或      declare -r name

一個變量既可以同時被申明為只讀變量和環境變量,聲明方式為  declare -r -x name

4、位置變量

位置變量是系統中定義好的一種特殊變量,其作用是在腳本代碼中調用通過命令行傳遞給腳本的參數,比如當執行某個腳本時可以跟上幾個參數,通過調用位置變量來給腳本傳遞參數。位置變量的應用方式如下:

(1)使用位置變量直接調用命令行中的參數,使用方式為$直接跟數字,表示命令行中對應的參數,如$1表示命令行中的第1個參數,$2表示命令行中的第2個參數。這里需要強調的是$0表示調用命令本身

[root@fengl bin]# cat test    #查看一個寫好并調用了位置變量的腳本
cat: test: No such file or directory
[root@fengl bin]# cat test.sh 
#!/bin/bash
#author:liang
#Version:1.0
#Test script

echo "輸入的第1個參數為:$1"
echo "輸入的第2個參數為:$2"
echo "輸入的命令為:$0"

[root@fengl bin]# test.sh aaaa bbbb    #執行腳本時跟上兩個參數
輸入的第1個參數為:aaaa
輸入的第2個參數為:bbbb
輸入的命令為:/root/bin/test.sh

(2)使用位置變量傳遞命令行中的所有參數,使用方式為$*或$@,雖然這兩種方式都能將命令行中的所有參數傳遞過來,但是$*和$@傳遞的參數是由區別的,$*傳遞的參數為一個整合過的字符創,而$@傳遞的參數為一個多個獨立的字符串,需要注意的是$*和$@只是在引號引起來的時候才存在差異

[root@fengl bin]# cat test.sh   #查看編輯好并條用位置變量的腳本
#!/bin/bash
#author:liang
#Version:1.0
#Test script

echo -e "使用\$*傳遞的參數為:$*"
echo -e "使用\$@傳遞的參數為:$@"

echo -e "用\$*的值在./aa下創建目錄"
mkdir ./aa/"$*"
echo ======================================
echo -e "用\$@的值在./bb下創建目錄"
mkdir ./bb/"$@"

[root@fengl bin]# bash -x test.sh x y       #執行腳本并顯示腳本執行過程
+ echo -e '使用$*傳遞的參數為:x y'
使用$*傳遞的參數為:x y
+ echo -e '使用$@傳遞的參數為:x' y
使用$@傳遞的參數為:x y
+ echo -e '用$*的值在./aa下創建目錄'
用$*的值在./aa下創建目錄
+ mkdir './aa/x y'                 #從這可以看出使用$*創建的是一個“x y”的目錄,并且該目錄在./aa目錄下
+ echo ======================================
======================================
+ echo -e '用$@的值在./bb下創建目錄'
用$@的值在./bb下創建目錄
+ mkdir ./bb/x y             #從這可以看出使用$@創建的是兩個目錄,分別為./bb下的x目錄和./下的y目錄


[root@fengl bin]# ll aa/    #查看使用$*創建的目錄
total 4
drwxr-xr-x. 2 root root 4096 Aug 15 02:53 x y

[root@fengl bin]# ll bb/ ./       #查看使用$@創建的目錄
./:
total 80
...
drwxr-xr-x. 2 root root 4096 Aug 15 02:53 y
bb/:
total 4
drwxr-xr-x. 2 root root 4096 Aug 15 02:53 x

(3)使用位置變量傳遞參數個數,用法為$#

[root@fengl bin]# cat test1.sh   #查看編輯好并調用位置變量的腳本
#!/bin/bash

echo  "使用的參數個數為:$#"

[root@fengl bin]# test1.sh a b c  #執行腳本,并跟上參數
使用的參數個數為:3

原創文章,作者:苦澀咖啡,如若轉載,請注明出處:http://www.www58058.com/33916

(0)
苦澀咖啡苦澀咖啡
上一篇 2016-08-15
下一篇 2016-08-15

相關推薦

  • 正則表達式及grep使用

    正則表達式分為:“基本正則表達式 BRE”跟“擴展正則表達式 ERE” 基本正則表達式:     (1)字符匹配               "."任意單個字符 &nbs…

    Linux干貨 2016-07-10
  • Linux高級文件系統管理

                                          &n…

    系統運維 2016-09-06
  • Basic認證

    basic認證: (1) 定義安全域 [root@bluee htdocs]# mkdir admin [root@bluee htdocs]# vim admin/index.html 刷新瀏覽器,可以看到admin/index.html文件內容“Page FOR Adminstration” 編輯配置文件: 找個位置增加一個Directoty: <…

    Linux干貨 2016-08-05
  • 用shell腳本實現每天定時收集全網日志到一臺服務器

    需求 現在公司有這樣一個需求,需要收集每天全網運行業務的設備上的某個特定目錄底下的日志到一臺服務器(這臺服務器我們簡稱logserver),這并在這臺logserver上生成以日期為名字的目錄 解決思路: 在logserver的crontab里設置兩個腳本,在當日晚上23:30執行腳本1收集當日即將被刪除的全網腳本;在并在早上8:30執行腳本2,收集昨日全網…

    Linux干貨 2015-07-27
  • linux進程管理相關工具

    linux進程管理相關工具: pstree ,ps ,pidof ,pgrep ,top ,htop ,glances ,pmap ,vmstat ,kill ,killall ,job ,bg ,fg ,nohup ,nice ,renice ,pkill…… 1、pstree:查看進程樹 2、ps:顯示執行命令時間的進程狀態信息 /proc 目錄下存放內…

    Linux干貨 2016-09-11
  • CentOS多網卡單個ip和單個網卡多個ip的設置

    一、單個網卡設置一個IP地址     1.初始狀態已添加一個網卡eth0,并設置的均為自動獲取IP地址,如下圖所示:網卡為eth0,ip地址為10.1.249.36;為了后續實驗的順利進行,我們把NetworkManager服務關閉     chkconfig NetworkMa…

    Linux干貨 2016-09-06

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-15 17:17

    理論與實踐結合,注意下次聯系跟總結寫在一起哦。

欧美性久久久久