1. 程式人生 > 實用技巧 >shell的變數功能

shell的變數功能

什麼是變數

變數就是以一組文字或符號等,來替代一些設定或者是一串保留的資料。

有一些特定的變數會影響到bash的環境,例如,我們能不能在任何目錄下執行某個命令與PATH這個變數密切相關,在我們執行一個命令時,系統會通過PATH這個變數中所記錄的路徑順序來查詢命令。

變數的顯示與設定

變數的顯示

[root@shadow ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@shadow ~]# echo ${PATH}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

通過echo這個命令可以顯示變數,在變數被顯示時,前面必須加上字元“\(”,可以以“\)variable”或“${variable}”的形式顯示。

變數的設定

使用“=”連線變數與其內容可以設定變數,例如:

[root@shadow ~]# echo $myvar
			# <== 這裡是空行,因為這個變數未被設定,其為空。
[root@shadow ~]# myvar=Hello
[root@shadow ~]# echo $myvar
Hello

變數設定的規則:

  1. 變數與變數的內容以一個等號“=”來連線;

  2. 等號兩邊不能直接接空格符;

  3. 變數名稱只能是英文字母與數字,但開頭字元不能是數字;

  4. 變數內容若有空格符可以使用雙引號“"”或單引號“''”將變數的內容結合起來;

    需要注意的是,雙引號內的特殊字元如$可以保持原本的特性,例如:

    [root@shadow ~]# var="lang is $LANG"
    [root@shadow ~]# echo $var
    lang is en_US.UTF-8
    

    單引號內的特殊字元則為純文字,例如:

    [root@shadow ~]# var='lang is $LANG'
    [root@shadow ~]# echo $var 
    lang is $LANG
    
  5. 可以使用轉義字元“\”將特殊符號(如$、\、空格符等)程式設計一般字元;

  6. 在一串命令中,如果還需要通過其他的命令提供資訊,可以使用反單引號“`命令`”或者“$(命令)”;例如:

    [root@shadow ~]# list=`ls /`
    
    [root@shadow ~]# echo $list 
    bin boot dev etc home lib lib64 lost+found media mnt mydata opt proc root run sbin srv sys tmp usr var
    [root@shadow ~]# list=$(ls /)
    [root@shadow ~]# echo $list 
    bin boot dev etc home lib lib64 lost+found media mnt mydata opt proc root run sbin srv sys tmp usr var
    
  7. 若變數為了增加變數內容,可以使用"\(變數名稱"或\){變數}累加內容;

  8. 若變數需要在其他子程序執行,則需要使用expor將變數變為環境變數;

  9. 通常大寫字元為系統預設變數,自行設定變數可以使用小寫字元;

  10. 取消變數的方法為“unset 變數名稱”。例如:

    [root@shadow ~]# var=sonmecontent
    [root@shadow ~]# echo $var 
    sonmecontent
    [root@shadow ~]# unset var
    [root@shadow ~]# echo $var 
    			# <==變數內容為空
    

環境變數的功能

常見的環境變數

使用env(environment的簡寫)可以顯示出所有的環境變數,export同樣也可以顯示出所有的環境變數,不過export功能更多。

下面介紹常見的環境變數:

  • HOME

    代表使用者的主資料夾目錄。

  • SHELL

    表示我們目前這個環境使用的shell是哪個程式。

  • HISTSIZE

    表示系統可以記錄的歷史命令的條數。

  • MAIL

    在收信時系統去讀取的郵件信箱檔案。

  • PATH

    執行檔案的查詢路徑,目錄與目錄中間以冒號“:”分隔,檔案的查詢是按照PATH的變數裡面目錄的順序查詢的。

  • LANG

    語系資料,系統按照這個的設定值去分析語系資料檔案。

  • RANDOM

    “隨機數”的變數,可以通過隨機數檔案相關的變數($RANDOM)來隨機取得隨機數值。在bash環境下,只要使用echo $RANDOM這個語句,系統會自動隨機選取一個介於0~32767之間的數輸出。

set命令

使用set可以顯示出所有的變數,包括環境變數與自定義變數,例如:

[root@shadow ~]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
COLUMNS=210
DIRSTACK=()
EUID=0
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=shadow
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
JAVA_HOME=/usr/java/jdk-14.0.2
LANG=en_US.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=46
LOGNAME=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:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;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:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=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;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=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:*.xcf=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=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=8393
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/root
SHELL=/bin/bash

PS1命令提示符

PS1這個變數值規定了顯示的提示符內容與格式,主要有以下常用的符號:

  • \d:顯示出“星期月日”的日期格式,如“Mon Feb 2”。
  • \H:完整的主機名。
  • \h:僅取主機名在第一個小數點之前的名字。
  • \t:顯示時間,為24小時格式的“HH:MM:SS”。
  • \T:顯示時間,為12小時格式的“HH:MM:SS”。
  • \A:顯示時間,為24小時格式的“HH:MM”。
  • @:顯示時間,為12小時格式的“am/pm”。
  • \u:目前使用者的賬號名稱。
  • \v:Bash的版本資訊。
  • \w:完整的工作目錄名稱。
  • \W:利用basename函式取得的工作目錄名稱,所以僅會李處最後一個目錄名。
  • \#:執行的第幾個命令。
  • \\(:提示符,如果是root,提示符為#,否則為\)

例如:

[root@shadow ~]#PS1='[\u@\h \w \A #\#]\$'
[root@shadow ~ 18:59 #41]#

shell的PID

“$”本身就是一個變數,代表當前這個Shell的執行緒代號,即PID(Process ID)。

上一個執行命令的回傳碼

“?”也是一個特殊變數,其含義是上一個執行的命令所回傳的值,一般來說,如果成功執行該命令,則會回傳一個0值;否則則會回傳錯誤程式碼,即非零值。例如:

[root@shadow ~]#echo $SHELL
/bin/bash
[root@shadow ~]#echo $?
0			# <== 執行正確
[root@shadow ~]#12name=test
-bash: 12name=test: command not found
[root@shadow ~]#echo $?
127			# <== 執行出錯

將自定義變數轉換為環境變數

環境變數與自定義變數之間的主要區別是該變數是否能夠被子程序所繼續呼叫。子程序只會繼承父程序的環境變數,不會繼承父程序的自定義變數,所以原本bash中的自定義變數在進入子程序後會消失不見,直到重新返回父程序的時候,這些變數才會再出現。

如果想要將自定義變數轉換為環境變數,則可以使用“export 變數名稱”。

export的另一個功能就是顯示所有的環境變數,直接使用“export”就可以。