bash變量類型及區別之淺談

變量類型,區別

位置變量$0 $1,$2,$# $@ $*

變量的類型:本地變量、環境變量、位置變量

本地變量:生效范圍為當前shell進程,對當前shell之外的其他shell進程包括當前shell的子進程均無效

環境變量:生效范圍為當前shell進程及子進程

位置變量:$1,…..$n,${10}來表示,用于放腳本在腳本代碼中調用通過命令行傳遞給它的參數



本地變量

變量賦值:name=‘value’,

可以使用引用value:

(1) 可以是直接字串; name=“root"

(2) 變量引用:name="$USER"

(3) 命令引用:name=`COMMAND`, name=$(COMMAND)

變量引用:${name}, $name

"":弱引用,其中的變量引用會被替換為變量值

'':強引用,其中的變量引用不會被替換為變量值,而保持原字符串

顯示已定義的所有變量:set

刪除變量:unset name

生效范圍為當前shell進程,對當前shell之外的其他shell進程包括當前shell的子進程均無效

如下圖:

blob.png

編輯一個本地變量:name=mage

echo $mage 可查詢變量

 

 blob.png

新開一個窗口再次查詢就不顯示了,這就是本地變量


blob.png

這里我們寫一個小腳本驗證一下,

第一行是:shell程序開頭的環境指定,這里我們用的是bash

第二行是:一些描述信息;本地變量測試腳本

然后定義var1=success

最后這行是為了方便我們下一步測試,讓它把這個變量輸出到屏幕上

blob.png

給它執行權限,然后用相對路徑運行,然后顯示出我們腳本里echo打印的信息;但是用echo $var1卻沒有。

So:本地變量只針對當前環境有效!




blob.png

我們再建立一個var2的腳本,將var1的變量也寫進去

blob.png

沒有顯示var1的變量。

So:本地變量只對當前環境有效


 

【環境變量】

生效范圍為當前shell進程及子進程

顯示所有環境變量:

export

env

printenv

?刪除:unset name

上面我們說過:本地變量只能在當前環境(shell)下使用,

環境變量就是在變量前聲明、賦值。加一個字符串:export

blob.png

用之前聲明就行

還有一種寫法:declare –x 等價于export

練習題:

編寫腳本/root/bin/backup.sh,可實現將/etc/目錄備份到/root/下生成etcYYYY-mm-dd

20160811 015.jpg

中間的是正文,其他為描述信息

blob.png

有了上下倆行輸出信息提示,我們再運行腳本的時候就明白這個腳本是否已經開始和結束了。



位置變量


位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數

$1, $2, …:對應第1、第2等參數,shift [n]換位置

$0: 命令本身

$*: 傳遞給腳本的所有參數,全部參數合為一個字符串

$@: 傳遞給腳本的所有參數,每個參數為獨立字符串

$#: 傳遞給腳本的參數的個數

$@ $* 只在被雙引號包起來的時候才會有差異


上題,如備份,用起來不靈活,如果我想要備份別的目錄呢?或者備份到別的地方呢?

 想要靈活就需要參數

blob.png

 

blob.png

新建f1腳本。 f1的參數作為f2的參數 一個用$*一個用$@。 當我們執行f1.sh腳本的時,f2.sh腳本會調用f1.sh后跟的參數。簡單講就是上一個腳本參數的調用。

結果如下圖:

 

 

blob.png

$1(引用第一個參數)打印出來的是全部

$2(引用第二個參數)打印出來的是空

因為$*調用的參數是一個整體(多個字符)

  所以第一個參數就是“a b c d”第二個參數自然就沒有了

 

$@調用的參數是單個參數(字符)

 

blob.png

當我們把$*$@的雙引號去掉后就沒區別了

為被雙引號引用時,所有的參數被認為是各個獨立的單詞

 

第十個參數怎么寫?

${10}如果寫成$10,系統會認為是$10的組合

blob.png

第十個參數是$10,然后結果是:a0

blob.png

 

blob.png

 

 blob.png

當加上大括號的時候就顯示正確了

原創文章,作者:cszdz123,如若轉載,請注明出處:http://www.www58058.com/33291

(0)
cszdz123cszdz123
上一篇 2016-08-12 09:02
下一篇 2016-08-12 09:02

相關推薦

  • N26-第七周

    1、創建一個10G分區,并格式為ext4文件系統;   (1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl;    (2) 掛載至/data/mydata目錄,要求掛載時禁止程序自動運行,且不更新文件的訪問時間戳; [root@localhost ~]# fdi…

    Linux干貨 2017-03-05
  • 18-系統啟動故障修復-實踐

    說明:重啟時可以選擇性在vmlinuz所在行末尾添加 selinux=0;或者直接編輯/etc/selinus/config文件,更改 SELINUX=disabled 關閉SELINUX??梢员苊獯驑撕?,節省啟動時間 以下操作都需要進入bootloader引導加載項修改內核啟動參數,在vmlinuz所在行末尾添加一個啟動選項 如何進入bootloader引…

    2017-04-02
  • net25 第15周作業

    1、總結sed和awk的詳細用法; SED sed模式空間 默認不編輯源文件,僅對模式空間中的數據做處理:而后,處理結束后,將模式空間打印屏幕 sed [options]’address+command’ file… -n:靜默模式,不再默認顯示模式空間的內容 -i:直接修改原文件 -e script -e script 同時執行多個腳本 -f /pat…

    Linux干貨 2017-05-15
  • M22 使用非對稱密鑰實現ssh自動登陸

    一 實驗目的 一般在用戶使用ssh客戶端登陸ssh服務器時需要使用用戶名和密碼,本實驗使用非對稱加密的方式實現了無密碼登陸ssh服務器。 二 實驗流程  、 1 在客戶端生成非對稱密鑰對 2 將非對稱密鑰中的公鑰發送給ssh服務器端相應的帳號 3 當客戶端通過ssh協議與服務器端發起連接時,客戶端將私鑰加密過的簽名發送給服務器端,服務器端使用客戶端…

    2017-04-13
  • 初識selinux

    一、selinux介紹     1.selinux歷史     SELinux: Secure Enhanced Linux,是美國國家安全局「NSA=The National Security Agency」和SCC(Secure Computing Corporation)開…

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

    Linux 文件管理 命令 cp mv rm

    2018-01-08

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-12 13:31

    有理論有實踐,圖文并貌,可以算是不錯的筆記,但是,我們寫博客是為了給別人看的,可以講解變量是什么,有哪幾類,各類變量的應用場景等。

欧美性久久久久