歡迎您光臨本站 註冊首頁

linux shell 變數和運算符<變數詳解>

←手機掃碼閱讀     火星人 @ 2014-03-24 , reply:0

作者:楓

第一節:變數
大綱:
2.1.1 本地變數
2.1.2 環境變數
2.1.3 變數替換
2.1.4 位置變數
2.1.5 標準shell變數
2.1.6 特殊變數
2.1.7 影響變數的命令
2.1.8 引號
2.1.9 運算符
2.1.10 表達式替換
2.1.11 運算符的優先順序
在進行講解前,我們要知道什麼是shell變數?
其實linux下面的變數,linx下的shell變數和其它高級語言中的定義是一樣的,都是放在內存中一定的存儲單元,而這個存儲單元裡面存放這個變數的值,而這個值是可以改變的,我們就稱它為變數.
2.1.1 本地變數
定義:是在用戶現在的shell生命期的腳本中使用;
例:[redhat@server redhat]$name="Red Hat Linux" #把變數設置為Red Hat Linux
[redhat@server redhat]$echo ${name} or #顯示變數內容
=[redhat@server redhat]$echo $name #等同上面的語意
Red Hat Linux #顯示其設定內容,
[redhat@server redhat]$set | grep "name" #查看剛才所設定的內容,或不加'grep "name"'查看用戶自己所有的本地變數,
[redhat@server redhat]$readonly name #把name這個變數設置為只讀變數,不允許再次設置,這可參考變數定義;-_-!
[redhat@server redhat]$name="He SenLin" #重新賦值
bash:name:readonly variable #只讀文件系統
[redhat@server redhat]$readonly #查看系統存在的只讀文件
附:重新登錄一下系統,再次用
[redhat@server redhat]$echo ${name}
#本地變數就不存在了,
說明本地變數只能存活在用戶shell的生命周期中,重登錄就不在了,
2.1.2 環境變數
定義:環境變數用於所有用戶進程<通稱為子進程>,包括編輯器,腳本和應用,登錄進程為父進程,shell中執行的用戶進程均為子進程,不像本地變數只用於現在的shell.
存在目錄在所有用戶的主目錄下<即/home>/.bash_profile或
如何設置環境變數?第一種方法就是編輯上面的二個文件,還可以用"export"進行設定或更改;這可不像本地變數只需 name="Red Hat Linux"那樣簡單,但卻可以把本地變數更改為環境變數;只須在本地變數結束后,輸入:export <變數名>;例,我們把name由本地變數修改為環境變數,我們可以這樣做;
[root@server root]#name="Red Hat Linux" #本地變數
[root@server root]#export name #變數name由本地升為環境
當然也可以用下面這種方法;
[root@server root]#export name="Red Hat Linux" #直接定義name為環境變數;
定義后,可通過env進行查看,不知道上面的本地環境變數由哪個命令進行查看你記住了沒有?,演示一下查看現在定義的環境變數;
[root@server root]#env | grep "name"
Red Hat Linux
同樣不加後面grep "name",這個參數也是查看所有的環境變數;更同樣的是我們也可以運行readonly這個參數給name以只讀屬性;
Tips:環境變數就是全部包含在本地變數中<因為它即可運行中父進程中也可運行於子進程中>,注意一點,本地變數不能運行在全部進程中,只有環境變數可以,再不懂就聯想一下人與自然吧;-_-!還是不會?用絕招:
[root@server root]#you=myfriend #設置本地變數name為myfriend
[root@server root]#echo ${you} #查看一下是否成功
myfriend #成功
[root@server root]#sh #更換shell環境等同重登錄,這相當一個
sh-2.05b#echo $you #用戶子進程
#沒顯示,說明不存在,真的不存在?
sh-2.05b#exit #返回bash環境
[root@server root]#echo $you #再次查看;
myfriend #又出來了,怎麼回事?
[root@server root]#export you #把變數you設為環境變數;
[root@server root]#sh #再試一次;
sh-2.05b#echo $you
myfriend #ok,you see?
再不懂,,你就把我殺了吧,,什麼,你不知道我住在哪?汗-_-!
再補充一點,就是在sh進程中設置環境變數是可以寫回bash環境中,因為bash是父進程,只有老的才有小的,小的怎麼才能有老的哩?<長大了就有老的嘍,哦,也對!..亂語>
2.1.3 變數替換
定義:用變數的值替換它的名字.
查看方式:echo <通用本地,環境...>
可以用echo顯示可以單個變數的取值;
[root@server root]#str="this is example" #設置本地變數
[root@server root]#echo "can you see `echo $str`" #顯示
cat you see this is example #替換就到這了,不明白明再來
變數替換續
除了上面的這個方式以外還有五種哦;別急,一個一個來;-_-!<先說好,偶不是皮條>
格式 定義
${variable name} 顯示實際值到variable name 1

${variable name :+value} 如果設置了variable name,就把value顯示,
未設置則為空; 2
${variable name:-value} 如果設置了variable name,就顯示它,未設置就顯示
value<僅顯不存本地中>>; 3
${variable name:?value} 未設置提示用戶錯誤信息value; 4
${variable name:=value} 如未設置就把value設置並顯示<寫入本地中>, 5
變數清除:
unset <變數name>
[root@server root]#echo $name #變數 name是否存在?
Red Hat Linux #存在
[root@server root]#unset name #清除name變數
[root@server root]#echo $name #是否成功
#成功
注意:如果用readonly限制了只讀屬性就會失敗,還有怎麼從環境變數中去掉那個變數呢?還記的用哪個設定環境變數的嗎?對.export,只須在它後面加"-n"參數即可
2.1.4 位置變數
定義:位置變數表示$0,$1,$2,....$9
$0 $1 $2 $3 $4
腳本名 A B C D
向腳本中使用位置參數;
向系統命令傳遞參數;
例:./test<在程序中進行替換>
[root@server root]#vi /test #創建並編輯/test文件
#!/bin/bash
#test
echo "這是腳本的第一個名稱: $0"
echo "這是腳本的第二個位置參數: $1"
echo "這是腳本的第三個位置參數: $2"
echo "這是腳本的第四個位置參數: $3"
echo "這是腳本的第五個位置參數: $4"
[root@server root]#chmod u+x ./test #加執行許可權;
[root@server root]#./test A B C #加參數證驗
echo "這是腳本的第一個名稱: ./test
echo "這是腳本的第二個位置參數: A
echo "這是腳本的第三個位置參數: B
echo "這是腳本的第四個位置參數: C
echo "這是腳本的第五個位置參數:
<向系統命令中傳遞位置參數>
[root@server root]#vi test1.sh #新建一個腳本文件
#!/bin/bash
#name:test1.sh
#to call: test1.sh 755 #使用方式
find ~ -perm $1 -print
$2 #系統命令
[root@server root]#chmod u+c test1.sh
[root@server root]#./test1.sh 755 date #位置一為755,2位date
/dev/ip
/dev/iput
.
.
.
Fri May 13 2:31:54 CST 2006

2.1.5 標準變數:
bash默認建立一些環境變數就是標準變數,可以通俗的說就是不是你加的而是裝好機子帶的那些環境變數, 可在/etc/profile中進行定義,
命令 意義
HOME 用戶主目錄
IFS 默認分隔符
MAIL 郵箱地址
MAILCHECK 郵箱檢查間隔
PWD 用戶當前工作目錄
LOGNAME 當前用戶登錄名
2.1.6 特殊變數
命令 意義
$# 傳遞到腳本的參數列表
$? 前個命令執行情況,0成功,其它值失敗
$$ 腳本運行的當前進程號
$! 運行腳本最後一個命令
$* 顯示腳本全部參數
2.1.7 影響變數的命令
declare 設置或顯示變數
-f 只顯示函數名
-r 創建只讀變數
-x 創建轉出變數
-i 創建整數變數
使用"+"代替"-",可以顛倒選項的意思,-r除外,
export 用於傳遞給子shell的變數
-- 表明選項結束,所有後續參數都是實參,
-f 表明在"名-值"對中的名字是函數名,
-n 把全局變數轉換成局部變數,換句話就是不再傳給shell
-p 顯示全局變數列表,
shift
用於移動位置變數,調整位置變數,使$3的值賦給$2.$2的值賦予$1.

[root@server root]#vi /test
#!/bin/bash
#test
echo "這是腳本的第一個名稱: $0"
echo "這是腳本的第二個位置參數: $1"
echo "這是腳本的第三個位置參數: $2"
echo "這是腳本的第四個位置參數: $3"
echo "這是腳本的第五個位置參數: $4"
shift
echo "這是腳本的第二個位置參數: $1"
echo "這是腳本的第三個位置參數: $2"
[root@server root]#chmod u+x ./test
[root@server root]#./test A B C
echo "這是腳本的第一個名稱: ./test
echo "這是腳本的第二個位置參數: A
echo "這是腳本的第三個位置參數: B
echo "這是腳本的第四個位置參數: C
echo "這是腳本的第五個位置參數: $4"
shit #顯示的時候並沒有,加在此只會明了
echo "這是腳本的第二個位置參數: B
echo "這是腳本的第三個位置參數: C
給shfit加一個數試一下:
[root@server root]#vi ./test
#!/bin/bash
#test
echo "這是腳本的第一個名稱: $0"
echo "這是腳本的第二個位置參數: $1"
echo "這是腳本的第三個位置參數: $2"
echo "這是腳本的第四個位置參數: $3"
echo "這是腳本的第五個位置參數: $4"
shift 2
echo "這是腳本的第二個位置參數: $1"
echo "這是腳本的第三個位置參數: $2"
[root@server root]#./test A B C D
echo "這是腳本的第一個名稱: ./test
echo "這是腳本的第二個位置參數: A
echo "這是腳本的第三個位置參數: B
echo "這是腳本的第四個位置參數: C
echo "這是腳本的第五個位置參數: D
shit 2 #顯示的時候並沒有,加在此只會明了
echo "這是腳本的第二個位置參數: C
echo "這是腳本的第三個位置參數: D

第二節 引號
2.1 引號的必要性
2.2 雙引號有什麼作用
2.3 單引號的作用
2.4 反引號的作用
2.5 反斜杠的作用
2.1 引號的必要性?
變數和替換操作,在腳本中執行變數替換時最容易犯的一個錯誤就是引用錯誤,為什麼會出現這樣的錯誤呢,這就是因為對上面這些號,杠運用的錯誤?你想不錯嗎?那就follow me吧!
2.2 這章節我不多講,只給一個例子,不懂可以聯繫我:hesenlin521@163.com
以下引用"網中人<大俠>"的一篇例子;
# TOPIC='Q & A'
# 用?我??保留特殊符?和空白

 

# Q1=What\'s\ your\ \"topic\"\?

# echo $Q1
What's your "topic"?
 

# 用 \ ?⑻厥夥??(含引?)和空白跳?出?

#

# 跳?後?特殊符?和空白都保留下?懟

 

# ANS="It is $TOPIC."

# echo $ANS
It is Q & A.
 

# 用?引?保留??抵?$)

#

# 用?引???示出??抵怠

 

# WRONG_ANS='It is "$TOPIC".'

# echo $WRONG_ANS
It is "$TOPIC".

 
 

# 用?我??保留特殊符?和空白(同第一行)

#
# 用?我???全部保留?同?r?

# $ 也?成一般符?保留?而非??抵怠

 

# ALT_ANS='the $TOPIC'\ is\ "'$TOPIC'"\.

# echo $ALT_ANS
The $TOPIC is 'Q & A'.

 
# 同?r混合?我????引??和跳?字元 \

#

# ?我??保留全部??引?保留??抵旦r
# \ ?⑻厥夥??跳?出?懟?br />

在此,我講解一下各個引號的作用吧;雙引主要是轉意$,\,``<反引號>三個特殊字元的意義,其它的全部當普通字元進行顯示,
單引號,是很冷酷的那種,就是把所有的字元都當一個普通字元來顯示,
[redhat@server redhat]$echo '$PWD,\n is your \n work directory'
$PWD,\n is your \n work directory
那個杠就是屏蔽特殊字元的特殊含義,例
[redhat@server redhat]$echo *
myfiel bash tehce desktop ....
[redhat@server redhat]$echo \*
*
ok,,就講這麼多了,
第三節 運算符
顧名思義就是告訴計算機哪些數值應該用哪種運算符進行運算,+,-,*,\,通過表達式對變數,數字,字元用的運算的符號就叫運算符;
通常表達式:是運算符和數字,變數,字元對象的集合體;
3.1 運算符類型;
按位運算符;在其它語言中經常見到哦,
~,<<,>>,|,^
$[]表示形式告訴shell求中括弧中的表達式的值;
$[ 2+8 ]
運算符 說明
~var 反運算符,把var中所有的二進位為1的變為0,為0的變為1
var< 出的各位,最右端的各位上補上0值,每做一次按位左移就有實
var乘2;
var>>str 右移運算符,把var中所有的二進位位向右移動str位,忽略最右
移出的各位,最左的各位上補0,每次做一次右移就有實現var除以2,
var&str 與比較運算符,var和str對應位,對於每個二進位來
說,如果二都為1,結果為1.否則為0;
var^str 異域運算符,比較var和str對應位,對於二進位來說
如果二者互補,結果為1,否則為0;
var | str 或運算符,比較var和str的對應位,對於每個二進位來
說,如二都該位有一個1或都是1,結果為1,否則為0;
邏輯運算符
&& 1 1才為1
|| 有一個1即為1
賦值運算符.+=,==,^=.|=
let count =$count +=$change
第三節.表達式替換
也就是剛才用的$[]等同於$(())
運算符的優先順序
級別 運算符 說明
1 =,+=,-=,/=,
%=,*=,&=,^=, 賦值運算符
|=,<<=,>>==
2 || 邏輯或
3 && 邏輯與
4 | 按位或
5 ^ 按異位與
6 & 按位與
7 ==,!= 等於/不等於
8 <=,>=,<,> 大於或等於/小於或等於/大於/小於
9 <<,>> 按位左移/按位右移
10 +,- 加減
11 *,/,% 乘,除,取模
12 ! ,~ 邏輯非,按位取反或補碼
13 -,+ 正負

[火星人 ] linux shell 變數和運算符<變數詳解>已經有1256次圍觀

http://coctec.com/docs/linux/show-post-135989.html