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 09:24
下一篇 2016-08-15 09:24

相關推薦

  • Puppet學習之puppet的安裝和配置

    一、Puppet簡介 Puppet基于ruby語言開發的自動化系統配置工具,可以C/S模式或獨立運行,支持對所有UNIX及類UNIX系統的配置管理,最新版本也開始支持對Windows操作系統有限的一些管理。Puppet適用于服務器管的整個過程 ,比如初始安裝、配置更新以及系統下線。 二、Puppet的安裝 Puppet的安裝方式支持源碼安裝、yum安裝以及r…

    2017-09-25
  • 安裝CentOS 6.9與CentOS7.3

    今天學習了如何安裝CentOS6.9與CentOS7.3. 安裝CentOS6.9 首先打開虛擬機如下如所示: 然后點擊創建新的虛擬機: 選擇典型,然后點擊下一步: 一般會選擇稍后安裝操作系統,然后點擊下一步 客戶機操作系統有很多,因為今天只安裝CentOS 所以選擇Linux 版本則選擇CentOS 64 位 (因為CentOS7以上沒有32位版本,只有C…

    2017-07-14
  • Javascript 裝載和執行

    一兩個月前在淘寶內網里看到一個優化Javascript代碼的競賽,發現有不少的人對Javascript的執行和裝載的基礎并不懂,所以,從那天起我就想寫一篇文章,但一直耽擱了。自上篇《瀏覽器渲染原理簡介》,正好也可以承前啟后。 首先,我想說一下Javascript的裝載和執行。通常來說,瀏覽器對于Javascript的運行有兩大特性:1)載入后馬上執行,2)執…

    Linux干貨 2016-08-15
  • 正則表達式和grep用法,及文本查看、處理工具

    概念 正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),是計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些匹配某個模式的文本。(維基百科) 通俗…

    2017-10-21
  • N25期第二周作業

    1.Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示 ls 列出文件和目錄命令 -a:顯示所有檔案及目錄 -A:顯示除隱藏文件”.”和”..”以外的所有文件 -C:多列顯示結果,默認選項 -l:單列顯示結果,以長格式顯示目錄下的內容列表 -F:在每個輸出項后追加文件的類型標識符 &#822…

    Linux干貨 2016-12-11
  • 二、(1)Linux常用文件管理類命令詳解

    Linux 文件管理 命令 cp mv rm

    2018-01-08

評論列表(1條)

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

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

欧美性久久久久