shell變量定義
一,變量:
可變化的量,有名稱的內存空間(在內存中要佔據空間)
聲明變量的目的是:讓計算機留出內存空間來儲存某一個確定類型的數據
二,bash中變量的類型
(1)環境變量:對當前shell及其子shell都是生效的,declare -x var=value or export var=value
顯示當前環境變量,export or printenv or env
(2)本地變量(局部變量):僅對當前shell有效,對子shell無效。
(3)特殊變量:通常指shell自身的變量
(4) $?:引用上一條命令狀態的返回值;
0:成功
1-255:失敗1,2,127系統預留的
(5),位置變量:用於引用傳遞過來的參數: $0, $1 ,$2 ....${11}
(6),局部變量:作用範圍可以縮小到只對一段代碼有效)
local name (定義成只對一段代碼有效)
命令別名:alias cmd_alias= ''(有些時候要帶,沒-,/之類就不用帶'') , unlias
三,系統上常用的環境變量:
(1)PATH:定義命令搜索路徑
/usr/local/mysql/bin
export PATH=$PATH:/usr/local/mysql/bin(在原來PATH變量中添加/usr/local/mysql/bin,當運行mysql命令就不需要使用絕對路徑)
hash 系統加速的緩存(shell內置變量)命令執行完會在hash中
(2) LANG:語言變量
/etc/sysconfig/i18n
語言:編碼規則
DISPLAY=
screen
每個變量的生命的週期其關聯進程,shell進程
(3) PS1
export 或declare -x 聲明環境變量,
改變全局在/etc/profile,改變用戶在~/.bashrc
立即生效與永久生效(寫入配置文件才能永久生效)
(4) bash環境配置文件:
全局:
/etc/profile,/etc/profile.d/* ,/etc/bashrc
用戶個人:
~/.bash_profile,~/.bashrc,~/.bash_logout
每一個shell腳本的執行,必然是使用對應的shell程序來實現
/bin/bash, /tmp/test.sh
登錄式shell:(先讀/etc/profile-->/etc/profile.d/*-->~/.bash_profile--->~/.bashrc-->/etc/bashrc)
1,用戶登錄最後創建的shell
2, su - username
非登錄式的shell:(~/.bashrc-->/etc/bashrc--->/etc/profile.d/*)
su username
腳本執行
圖形界面打開的shell
profile類:爲登錄式shell所用的配置文件(source=.)
設置環境變量;
設置命令或腳本
bashrc類,非登錄式shell所用的配置文件
本地變量;
命令別名:
()表示在子shell中執行,()裏的內容表示命令
管道的最後一個命令通常也在最後一個子shell執行
四,在bash中不需要事先聲明,如果沒聲明則默認都當成字符串,但是可以事先聲明,
變量的事先聲明:
(1)declace [ options ] var
-i :整型
-x :環境變量
-a :數組
-r :只讀變量,值不能改變,也不能撤消
(2)變量命名:
1,只能包含字母,數字,下劃線,並且不能以數字開頭;
2,不能與關鍵字衝突
3,見名知義
4,引號:
單引號:''
雙引號:"" 變量替換
反引號:`` 命令替換(把命令執行結果當作別的命令的參數) =$()
5,變量引用:
$var
${var} :如果變量值中有特殊字符或帶後綴時不能省略{}
path="$PATH"與path=${PATH}與path=$PATH(這種方式少用,因爲有時$PATH中含有特殊字符時會出現問題,如含有空格之類的時候)
三種方式效果是一樣的。都是定義path的變量等於PATH的變量
引用命令的結果兩種方式:
(1)MYUID=$(id -u root)
(2)MYUDI=`id -u root`
五,變量賦值
set var_name=value (set 可以省略)
DIR=/tmp/name
DIR='/tmp/name'(一般情況都可以用,但是有空格之類的特殊符號時,剛必須加''或"")
DIR="/tmp/name"(如果/tmp/name中有$則不能使用'')
unset var_name(撤銷變量) 變量名最好有大寫,習慣性用法,當然不一定要
六:變量類型
1,決定存儲類型 2,數據表示範圍
整型:
字符型:
布爾型:
浮點型:
ascii:定義了基本字符,
byte:8bit
七,bash如何實現命令展開;
(1)切開;以space,tab,enter分隔
(2)別名替換,命令行展開,$ ,{} ,()
(3)再切開
(4)實現重定向:>,>> ,< ,<<
(5)執行命令
阻止展開:1,轉義字符\,2,單引號,3 ,雙引號
八,位置變量
./a.sh a b c
$0 $1 $2 $3
bash -x 與set -x(寫在腳本里)調試腳本
set +x 取消調試,set -x 與set +x之間會調試(調試片段)
$#:代表接不接參數的個數,上面表示有四個
$@:代表”$1" "$2" "$3" "$4",每個變量是獨立的(用雙引號括起來)
$*:代表"$1 $2 $3 $4" 中間默認用空格鍵隔開,因IFS默認的第一個變量是空格
變量賦值等號與let (a=1 與let a=1效果一樣,賦值數值,不用加引號)
name="mary smith"(引號的目的是告訴計算機從哪開始到哪結束,引號中間的字符就會被當作字符串處理
如果是隻有單個時,可以不用引號name=mary,賦值字符串,最好加引號)
九,腳本的函數
功能模塊,結構化編程,代碼重用
先定義後調用
14,bash中定義被函數兩種方式:
(1)function func_name {
body
}
(2)fname () {
body
}
函數的返回值:
是函數調用時所執行的函數體中的最後一條語句的狀態返回值
自定義函數返回值
return #
函數還能接受參數
/var/lock/subsys
/etc/rc.d/init.d/functions 定義了系統上常用的函數
(1)daemon
(2)killproc
(3)pidofproc
(4)status
(5)echo
echo_failure
${para#*word} 以word爲分隔符,自左向向,word這個分隔去匹配,找到第一次匹配到的所有內容先移出
${para##*word} 。。。。。。。。。。。。.................,找到最後一次,也就是最長的一個給移出
${para%word*}................ 自右向左
${para%%word*} 自右向左
取得目錄路徑的時候可以用上