1. 程式人生 > >二、Shell中的變量

二、Shell中的變量

shell變量、引用、重定向

變量是任何程序或腳本的重要組成部分。變量為程序或腳本訪問內存中的可被修改的一塊數據提供了簡單的方式。Linux Shell中的變量可以被指定為任意的數據類型。Shell中有兩種變量的類型:系統變量(環境變量)和用戶自定義的變量(本地變量或Shell變量)。

環境變量:作用域為當前shell進程及其子進程;環境變量一般均為大寫。常用的環境變量有:

系統變量含義
BASH_VERSION保存bash實例的版本
DISPLAY設置X display名字
EDITOR設置默認的文本編輯器
HISTFILE保存命令歷史的文件名
HISTFILESIZE命令歷史文件所能包含的最大行數
HISTSIZE
記錄在命令歷史中的命令數
HOME
當前用戶的主目錄
HOSTNAME計算機主機名
IFS
定義shell的內部字段分隔符
PATH
搜索命令的路徑
PS1
提示符設定
PWD
當前工作目錄
SHELL
登錄shell路徑
TERM
登陸終端類型
TMOUNT設置shell內建命令read默認超時時間,單位為秒。

設置:export VARNAME=VALUE (VARNAME=VALUE ; export VARNAME)

撤消:unset VARNAME

查看當前shell中變量:set

查看當前shell中的環境變量:printenv env export

[[email protected] ~]# env
HOSTNAME=mylinux
TERM=linux
SHELL=/bin/bash
HISTSIZE=3000
SSH_CLIENT=211.103.109.22 10164 22
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
SSH_TTY=/dev/pts/0
HISTFILESIZE=50
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: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:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=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=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=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;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:*.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:
MAIL=/var/spool/mail/root
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=zh_CN.UTF-8
PYTHONSTARTUP=/root/.pythonstartup.py
SHLVL=1
HOME=/root
LOGNAME=root
QTLIB=/usr/lib64/qt-3.3/lib
CVS_RSH=ssh
SSH_CONNECTION=211.103.109.22 10164 10.104.160.241 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
PROMPT_COMMAND=history -a
HISTTIMEFORMAT=%F %T 
G_BROKEN_FILENAMES=1
_=/bin/env

本地變量:set VARNAME=VALUE: 作用域為當前bash進程,對子shell無效;

局部變量:local VARNAME=VALUE:作用域為當前代碼段;

位置變量:

$0 獲取當前執行的shell腳本文件名,包括腳本路徑

$n 當前腳本的第n個參數,如果n大於9,要用大括號括起來${n}。

$?: 上一個命令的執行狀態返回值.

$#:命令行參數的個數

$*: 參數列表 所有的參數,被當作一個字符串

$@:參數列表 所有的參數,每個參數都是一個獨立的字符串

Shift [n] :移去位置變量

basename $0: 執行腳本的基名

dirname $0:執行腳本的路徑

$PS1: 主提示符

$PS2:第二提示符,補充完全命令輸入時的提示符

$PS3: 第三提示符,用於select命令中

$PS4:第四提示符,當使用-x選項調用腳本時,顯示的提示符,默認為+號

$SECONDS: 當前腳本已經運行的時長

$$:當前腳本進程PID

程序執行,可能有兩類返回值:

程序執行結果

程序狀態返回代碼(0-255)0: 正確執行 1-255:錯誤執行1,2,127系統預留。

內置變量:

echo args-------將echo命令後面指定的字符串即變量等顯示在標準輸出

參數說明
-n不換行輸出內容
-e解析轉義字符
\n換行
\r回車
\t制表符
\b
退格
\v
縱向制表符

eval args--------當shell程序執行到eval語句時,shell讀入參數args,並將它們組合成一個新命令執行

exec-------------能夠在不創建新的子進程的前提下,轉去執行指定的命令,當指定命令執行完畢,還進程終止

read-------------從標準輸入讀取字符串等信息,傳給shell程序內部定義的變量


BASH的引號引用

` `或$(command): 命令替換,內層``使用要用\轉義

" ": 弱引用,可以實現變量替換;

‘ ‘: 強引用,不完成變量替換

“引用”命令的執行結果,要使用命令引用;

[[email protected] ~]# wc -l  /etc/passwd | cut -d: -f1
31 /etc/passwd
[[email protected] ~]# RESAULTS=`wc -l  /etc/passwd | cut -d: -f1`
[[email protected] ~]# echo $RESAULTS
31 /etc/passwd

命令的執行結果賦值給某變量,要使用命令引用.

如USERID=`id -u user1`; (等號兩邊無空格)

命令的執行狀態結果,要直接執行此命令,一定不能引用;

如: if id user1一句中的id命令就一定不能加引號;

參數替換

不含有“:”的,只要定義了就生效,不管是否為空;含有“:”的,即使定義了,但是為空就不生效,用來替換的內容可以是字符串、變量、命令的輸出;被替換的內容是變量,如$a、$1

${par:-word}:若par不空則返回par的值,否則返回word.但不會賦值給par

${par:+word}:若par不空則返回word的值,否則返回空.

${par:=word}:若par不空則返回par的值,否則返回word,並賦值給par.

${par:?message}:若par為空或已被刪除,那麽將消息message送到標準錯誤輸出;


字符串匹配處理

1)字符串長度:

${#var}表示$var的長度

${#n}表示腳本的第n個參數的長度

${#@}表示腳本的所有參數的個數,等效於$#

另外,數組中某個元素的長度 ${#array[n]}

2)字符串的前後截取,pattern一般是個命令行glob,匹配的即為被去掉的字符:

${var#pattern} 最短頭匹配截取

${var##Pattern}最大頭匹配截取

${var%Pattern} 最短尾匹配截取

${var%%Pattern}最大尾匹配截取

3)字符串位置,postion為第幾個位置,此位置前面的字符為被匹配的(被刪除的),length表示剩下的字符的長度:

${var:postion}# 從左往右,匹配postion之左的,留下之後的

${var:(-postion)} # 從右往左,匹配postion之左的,()是為了避免和${var-default}沖突

${var:postion:length} # 匹配postion位置之前的同時,顯示之後的長度為length

4)字符串替換,分第一個替換和全局替換,前綴替換後綴替換,同樣支持glob:

${var/Pattern/Replacement} # 第一次匹配的被替換,類似:sed ‘s/Pattern/Replacement/‘

${var//Pattern/Replacement} # 全局的匹配被替換,類似:sed ‘s/Pattern/Replacement/g‘

${var#/prefix/Replacement} # 前綴替換

${var%/suffix/Replacement} # 後綴替換

5)得到變量名,輸出所有前綴一樣的變量名,不支持glob(通配符)

${!var_prefix*} 或 ${!var_prefix@}


shell腳本變量輸入

Shell變量除了可以直接賦值或腳本傳參外,還可以使用read命令從標準輸入獲得參數。

read [參數] [變量名]

常用參數:

-p:設置提示信息

-t:設置超時時間

[[email protected] ~]# read -p "please input two number :" a1 a2
please input two number :15 69
[[email protected] ~]# echo $a1 $a2
15 69


變量的數值計算

1、let算術運算表達式

let C=A+B (算術表達式中不能有空格)

[[email protected] ~]# let a=5*8
[[email protected] ~]# echo $a
40
[[email protected] ~]# a=5
[[email protected] ~]# b=6
[[email protected] ~]# let c=a*b
[[email protected] ~]# echo $c
30

2、let I+=1 相當於 let I++

let I-=1 相當於 let I--

[[email protected] ~]# echo $c
30
[[email protected] ~]# let c-=1
[[email protected] ~]# echo $c 
29
[[email protected] ~]# let c+=1
[[email protected] ~]# echo $c 
30

3、$[算術運算表達式]

C=$[A+B]

[[email protected] ~]# c=$[1+2]
[[email protected] ~]# echo $c
3
[[email protected] ~]# a=2
[[email protected] ~]# b=3
[[email protected] ~]# c=$[a+b]
[[email protected] ~]# echo $c 
5

4、$((算術運算表達式))

C=$((A+B)) (只能進行整數運算)

[[email protected] ~]# c=$((1+2))
[[email protected] ~]# echo $c
3
[[email protected] ~]# a=2
[[email protected] ~]# b=3
[[email protected] ~]# c=$((a+b))
[[email protected] ~]# echo $c
5

5、expr 算術運算表達式

表達式中各操作數及運算符之間要有空格,乘號要轉義

計算結果要使用命令引用 C=`expr $A + $B` (可用於判斷是否為整數)

[[email protected] ~]# expr 6 + 8
14
[[email protected] ~]# a=4
[[email protected] ~]# b=6
[[email protected] ~]# expr $a + $b
10
[[email protected] ~]# expr 6 * 8
expr: 語法錯誤
[[email protected] ~]# expr 6 \* 8
48

expr length STRING 計算字符STRING串長度

[[email protected] ~]# expr length "1234225234234"
13

expr 字符串: 表達式 字符串匹配(可用於判斷文件擴展名)

[[email protected] ~]# expr "abc" : ".*\.log" &>/dev/null       
[[email protected] ~]# echo $?
1
[[email protected] ~]# expr "abc.log" : ".*\.log" &>/dev/null 
[[email protected] ~]# echo $?
0

6、bc linux下的計算器(支持小數運算)

條件測試(整數,字符,文件,邏輯)

通常,在bash的各種條件結構和流程控制結構中都要進行各種測試,然後根據測試結果執行不同的操作,有時也會與if條件語句相結合,來完成判斷,以減少程序的運行錯誤。

條件測試常用的語法形式有:

格式一: test 測試表達式

格式二: [ 測試表達式 ] (中括號兩端有空格)

格式三: [[<測試表達式>]](內中括號兩端有空格)

格式四: ((測試表達式))

整數比較操作:

在[]以及test中使用的比較符號在(())和[[]]中使用的比較符號說明
-eq==或=相等
-ne!=不相等
-gt
>大於
-ge
>=大於等於
-lt
<小於
-le
<=小於等於

說明:

‘=‘和‘!=‘也可以在[]中做比較使用,但是在[]中使用包含‘>‘和‘<‘的符號時,需要用反斜線轉義。

字符串測試:

字符串測試操作符的作用包括:比較兩個字符串是否相同、測試字符串的長度是否為零、字符串是否為NULL等。

常用字符串測試符說明
-n "字符串"若字符串的長度不為0,則為真,即測試表達式成立
-z "字符串"若字符串的長度為0,則為真,即測試表達式成立
"字符串1" = "字符串2"若字符串1等於字符串2,則為真,即測試表達式成立
"字符串1" != "字符串2"若字符串1不等於字符串2,則為真,即測試表達式成立
"字符串" =~ 模式左側是字符串,右側是一個模式,判定左側的字符串能否被右側的模式所匹配;通常只在[[]]中使用;模式中可以使用行首、行尾錨定符;但模式不要加引號;

說明:

對於字符串的測試,一定要將字符串加雙引號之後再進行比較

比較符號(如=和!=)的兩端一定要有空格

文件測試操作:

常用文件測試操作符說明
-d 文件文件存在且為目錄則為真
-f 文件文件存在且為普通文件則為真
-e 文件文件存在則為真
-r 文件文件存在且可讀則為真
-s 文件文件存在且文件大小不為0則為真
-w 文件文件存在且可寫則為真
-x 文件文件存在且可執行則為真
-L 文件文件存在且為鏈接文件則為真
f1 -nt f2文件f1比文件f2新則為真,根據文件的修改時間來計算
f1 -ot f2文件f1比文件f2舊則為真,根據文件的修改時間來計算

邏輯測試:

在[]和test中使用的操作符在(())和[[]]中使用的操作符說明
-a&&
-o||
!!

說明:

在連接兩個含[]、test或[[]]的表達式時可用&&或||


管道和重定向

幾乎所有的命令都會產生到屏幕的輸出和從鍵盤獲取輸入,而在Linux系統中可以將輸出發送到指定的文件,或從文件中讀取輸入。在Linux中一切皆文件,所以硬件在Linux系統中同樣的表示為文件:

默認輸入設備:標準輸入, STDIN, 0

默認輸出設備:標準輸出,STDOUT, 1

標準錯誤輸出:STDERR, 2

輸入重定向:

<:輸入重定向

<<:此處創建文件,常用於在腳本中創建文件或生成菜單(如:cat <<EOF)

輸出重定向:

>: 覆蓋標準輸出

>>:追加標準輸出

錯誤重定向:

2>: 重定向錯誤輸出

2>>: 追加方式

&>: 重定向標準輸出或錯誤輸出至同一個文件

>&fd:輸出到定義的文件描述符 (如: 2>&1)

exec fd <>file (打開file,關聯到文件描述符fd,可讀寫)

exec fd &- 關閉文件描述符

set -C:禁止對已經存在文件使用覆蓋重定向;強制覆蓋輸出,則使用 >|

set +C:關閉上述功能


管道:前一個命令的輸出,作為後一個命令的輸入

命令1 | 命令2 | 命令3 | ...

註:最後一個命令會在當前shell進程的子shell進程中執行

tee:將輸入復制給每一個指定的文件和標準輸出



本文出自 “隨風而飄” 博客,請務必保留此出處http://yinsuifeng.blog.51cto.com/10173491/1942503

二、Shell中的變量