Shell變數與特殊變數(Shell篇)

一、Shell變數

Shell支持自定義變數。

定義變數

定義變數時,變數名不加美元符號($),如:

variableName="value"

注意,變數名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時,變數名的命名須遵循如下規則:

  • 首個字元必須為字母(a-z,A-Z)。

  • 中間不能有空格,可以使用下劃線(_)。

  • 不能使用標點符號。

  • 不能使用bash里的關鍵字(可用help命令查看保留關鍵字)。

變數定義舉例:

myUrl="http://see.xidian.edu.cn/cpp/linux/"myNum=100

使用變數

使用一個定義過的變數,只要在變數名前面加美元符號($)即可,如:

your_name="mozhiyan"echo $your_nameecho ${your_name}

變數名外面的花括弧是可選的,加不加都行,加花括弧是為了幫助解釋器識別變數的邊界,比如下面這種情況:

Advertisements

for skill in Ada Coffe Action Javadoecho "I am good at ${skill}Script"done

如果不給skill變數加花括弧,寫成echo "I am good at $skillScript",解釋器就會把$skillScript當成一個變數(其值為空),代碼執行結果就不是我們期望的樣子了。

推薦給所有變數加上花括弧,這是個好的編程習慣。

重新定義變數

已定義的變數,可以被重新定義,如:

myUrl="http://see.xidian.edu.cn/cpp/linux/"echo ${myUrl}myUrl="http://see.xidian.edu.cn/cpp/shell/"echo ${myUrl}

這樣寫是合法的,但注意,第二次賦值的時候不能寫 $myUrl="http://see.xidian.edu.cn/cpp/shell/",使用變數的時候才加美元符($)。

Advertisements

只讀變數

使用 readonly 命令可以將變數定義為只讀變數,只讀變數的值不能被改變。

下面的例子嘗試更改只讀變數,結果報錯:

#!/bin/bashmyUrl="http://see.xidian.edu.cn/cpp/shell/"readonly myUrlmyUrl="http://see.xidian.edu.cn/cpp/danpianji/"

運行腳本,結果如下:

/bin/sh: NAME: This variable is read only.

刪除變數

使用 unset 命令可以刪除變數。語法:

unset variable_name

變數被刪除后不能再次使用;unset 命令不能刪除只讀變數。

舉個例子:

#!/bin/shmyUrl="http://see.xidian.edu.cn/cpp/u/xitong/"unset myUrlecho $myUrl

上面的腳本沒有任何輸出。

變數類型

運行shell時,會同時存在三種變數:

1) 局部變數

局部變數在腳本或命令中定義,僅在當前shell實例中有效,其他shell啟動的程序不能訪問局部變數。

2) 環境變數

所有的程序,包括shell啟動的程序,都能訪問環境變數,有些程序需要環境變數來保證其正常運行。必要的時候shell腳本也可以定義環境變數。

3) shell變數

shell變數是由shell程序設置的特殊變數。shell變數中有一部分是環境變數,有一部分是局部變數,這些變數保證了shell的正常運行

環境變數(查看命令) env export

  • XDG_SESSION_ID=4

  • TERM=xterm

  • SHELL=/bin/bash

  • SSH_CLIENT=113.128.86.165 9935 22

  • SSH_TTY=/dev/pts/3

  • USER=root

  • LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su0;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=a=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=011;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.eaar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;355:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiffg=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;335:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmsf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:**.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.waxa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:

  • MAIL=/var/mail/root

  • PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

  • PWD=/home

  • LANG=en_US.UTF-8

  • SHLVL=1

  • HOME=/root

  • LANGUAGE=en_US:

  • LOGNAME=root

  • SSH_CONNECTION=113.128.86.165 9935 120.27.42.80 22

  • LESSOPEN=| /usr/bin/lesspipe %s

  • XDG_RUNTIME_DIR=/run/user/0

  • DISPLAY=localhost:12.0

  • LESSCLOSE=/usr/bin/lesspipe %s %s

  • _=/usr/bin/env

  • OLDPWD=/root

常用的環境變數

PATH 決定了shell將到哪些目錄中尋找命令或程序

HOME 當前用戶主目錄

HISTSIZE 歷史記錄數

LOGNAME 當前用戶的登錄名

HOSTNAME 指主機的名稱

SHELL   當前用戶Shell類型

LANGUGE  語言相關的環境變數,多語言可以修改此環境變數

MAIL   當前用戶的郵件存放目錄

PS1   基本提示符,對於root用戶是#,對於普通用戶是$

二、Shell特殊變數

前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。

例如,$ 表示當前Shell進程的ID,即pid,看下面的代碼:

$echo$$

運行結果

29949

特殊變數列表

變數含義
$0當前腳本的文件名
$n傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
$#傳遞給腳本或函數的參數個數。
$*傳遞給腳本或函數的所有參數。
$@傳遞給腳本或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同,下面將會講到。
$?上個命令的退出狀態,或函數的返回值。
$$當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。

命令行參數

運行腳本時傳遞給腳本的參數稱為命令行參數。命令行參數用 $n 表示,例如,$1 表示第一個參數,$2 表示第二個參數,依次類推。

請看下面的腳本:

#!/bin/bashecho "File Name: $0"echo "First Parameter : $1"echo "First Parameter : $2"echo "Quoted Values: $@"echo "Quoted Values: $*"echo "Total Number of Parameters : $#"

運行結果:

$./test.sh Zara Ali

$* 和 $@ 的區別

$* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出所有參數。

但是當它們被雙引號(" ")包含時,"$*" 會將所有的參數作為一個整體,以"$1 $2 … $n"的形式輸出所有參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出所有參數。

下面的例子可以清楚的看到 $* 和 $@ 的區別:

#!/bin/bashecho "\$*="$*echo "\"\$*\"=""$*"echo "\$@="$@echo "\"\$@\"=""$@"echo "print each param from \$*"for var in$*doecho "$var"doneecho "print each param from \$@"for var in$@doecho "$var"doneecho "print each param from \"\$*\""for var in"$*"doecho "$var"doneecho "print each param from \"\$@\""for var in"$@"doecho "$var"done

執行 ./test.sh "a" "b" "c" "d",看到下面的結果:

$*= a b c d

退出狀態

$? 可以獲取上一個命令的退出狀態。所謂退出狀態,就是上一個命令執行后的返回結果。

退出狀態是一個數字,一般情況下,大部分命令執行成功會返回 0,失敗返回 1。

不過,也有一些命令返回其他值,表示不同類型的錯誤。

下面例子中,命令成功執行:

$./test.sh Zara Ali

$? 也可以表示函數的返回值,後續將會講解。

願這篇文章能給您帶來幫助,錯誤之處還希望大家多多指正,小編一定及時改正!願老司機勿噴!願世界和平!如果您覺得還行,就動手點個贊關注我們吧!

Advertisements

你可能會喜歡