shell腳本編程

1.變量

程序:指令+數據
指令:由程序文件提供 ; 數據來源:I/O設備,文件,管道,變量
程序:算法+數據結構
算法:解決問題的方式; 數據結構:組織數據的方式

變量:變量名+指向的內存空間
變量賦值:name=value;將數據存儲到變量名指向的內存空間
變量類型:決定了數據存儲格式,表示的數據范圍,能參與的運算
注意:bash把所有變量都視為字符型;bash中的變量無需事先聲明(相當于,把聲明和賦值同時實現);聲明:變量類型,變量名
變量替換:變量名--->其值
變量引用:${name}或$name
變量名規則:
1.變量名只能包含數字、字母、下劃線,而且不能以數字開頭;
2.變量名見名知意,命名機制遵循某種法則;
3.變量名不能使用程序的保留字(if,else,while...)
bash變量類型(按作用范圍劃分)
本地變量:僅對當前shell進程有效;
環境變量:對當前shell進程 及其子進程有效;
局部變量:僅對某代碼片段有效(函數上下文)
位置參數變量:向執行腳本的shell進程傳遞的參數;
特殊變量:shell內置的有特殊公用的變量;

本地變量
賦值name=value
引用:${name}或$name
查看:set
撤銷:unset

環境變量:
賦值:
1.export name=value
2.name=value export name
3.declare -x name=value
4.name=value declare -x name
引用${name}或$name
查看
1.export
2.printenv
3.declare -x
4.env
撤銷unset name

只讀變量
無法重新賦值,且不支持撤銷;隨當前shell進程的終止而終止;
1.declare -r name
2.readonly name
查看只讀變量:declare -r

位置參數變量
引用方式:$1,$2...${10},${11}...
清空位置變量:set --
輪替:shift [n]

特殊變量
$0當前腳本的局對路徑;
$# 位置參數個數
$*所有位置參數
$@所有位置參數
$$當前進程的id號
$PPID 當前進程的父進程的id號

$與$@的區別:僅$@和$放在雙引號中有差別

[root@centos6 bin]# cat f1.sh 
#!/bin/bash
echo "all args are $*"
echo "1st is $1"
f2.sh "$*"
[root@centos6 bin]# cat f2.sh 
#!/bin/bash
echo "f2.sh"
echo "1st $1"
[root@centos6 bin]# f1.sh 10 20
all args are 10 20
1st is 10
f2.sh
1st 10 20



[root@centos6 bin]# cat f1.sh 
#!/bin/bash
echo "all args are $*"
echo "1st is $1"
f2.sh "$@"
[root@centos6 bin]# cat f2.sh 
#!/bin/bash
echo "f2.sh"
echo "1st $1"
[root@centos6 bin]# f1.sh 10 20
all args are 10 20
1st is 10
f2.sh
1st 10
小坑:
[root@centos6 ~]# x=haha 
[root@centos6 ~]# y=$x
[root@centos6 ~]# echo $y
haha
[root@centos6 ~]# x=xixi 
[root@centos6 ~]# echo $y
haha

##i++與++i的區別
[root@centos6 ~]# let j=i++
[root@centos6 ~]# echo $j
100
[root@centos6 ~]# i=100
[root@centos6 ~]# let j=++i
[root@centos6 ~]# echo $j
101


2.bash之多命令執行

多條命令順序執行:COMMAND1;COMMAND2;COMMAND3;.....

邏輯運算

1.與運算:&&
1&&1=1
1&&0=0
0&&1=0
0&&0=0  COMMAND1&&COMMAND2 ###前面的命令執行成功,后面的命令才會執行;
2.或運算:||
1||1=1
1||0=1
0||1=1
0||0=0     COMMAND1||COMMAND2 ###前面的命令執行失敗,后面的命令才會執行
3.非運算:!
!1=0
!0=1

3.shell腳本編程:

過程式編程;解釋運行;依賴于外部程序文件;
執行腳本
1.chmod +x SCRIPT_FILE; ./SCRIPT_FILE
2.bash SCRIPT_FILE ***bash會開子進程
3.source|. SCRIPT_FILE *** .和soruce不會開子進程

4.bash配置文件:

兩類:
profile類:為交互式登錄的shell進程提供配置
bashrc類:為非交互式登錄的shll進程提供配置

交互式登錄的shell進程:
直接通過某終端輸入賬號密碼后登錄打開的shell進程
使用su - username 或su -l username執行的登錄切換

非交互式登錄的shell進程:
su username執行的登錄切換
圖形界面下打開的終端
運行腳本

profile類:定義環境變量;運行命令或腳本
全局:/etc/profile /etc/profile.d/*.sh
用戶個人:~/.bash_profile

bashrc類:定義本地變量;定義命令別名
全局:/etc/bashrc
用戶個人:~/.bashrc

注意:僅管理員可以修改全局配置文件

交互式shell進程配置文件讀取順序:
/etc/profile--/etc/profile.d/*.sh--/.bash_profile--/.bashrc--/etc/bashrc

非交互式shell進程配置文件讀取順序:
~/.bashrc--/etc/bashrc--/etc/profile.d/*.sh

~/.bash_logout 用戶退出時會執行此文件中的指令

注意:通過配置文件定義的特性不會理解生效;讓配置文件中新定義的特性立即生效:
1.通過命令行重復定義一次

2.
source /PATH/FROM/CONF_FILE
.    /PATH/FROM/CONF_FILE

5.bash算數運算

1.let var=$num1+$num2
2.var=$[$num1+$num2]
3.var=$(($num1+$num2))
4.var=$(expr $num1 + $num2)

增強型賦值:變量做某種算數運算后回存至自身

num=1;let num=$num+i
可簡寫為let num(+|-|*)=i
自增,自減:當i=1時
let num++ --->相當于 let num=$num+1
let num--  --->相當于 let num=$num-1
[root@centos6 ~]# num=1
[root@centos6 ~]# let num+=2
[root@centos6 ~]# echo $num
3
[root@centos6 ~]# echo $num
3
[root@centos6 ~]# let num+=5
[root@centos6 ~]# echo $num
8
[root@centos6 ~]# let num+=6
[root@centos6 ~]# echo $num
14
[root@centos6 ~]# num=2
[root@centos6 ~]# let num++
[root@centos6 ~]# echo $num
3
[root@centos6 ~]# let num++
[root@centos6 ~]# echo $num
4
[root@centos6 ~]# let num--
[root@centos6 ~]# echo $num
3

6.條件測試:

判斷某需求是否滿足,需要由測試機制來實現;
1.通過命令狀態返回值來判斷;0:成功;1-255失敗
2.測試表達式:
(1)test EXPRESSION
(2)[ EXPRESSION ]
(3)[[ EXPRESSION ]]
注意:[]兩端必須有空格,否則為語法錯誤;表達式中的變量要加雙引,避免出錯

bash測試類型:
1.數值測試(即數值大小比較)
-eq -ne 相等 不等
-gt -ge -lt -le 大于 大于等于 小于 小于等于

2.字符串測試:
==是否等于,相等為真
!=不等
>大于,<小于
=~左側的字符串是否能被右側的PATTREN匹配
-z "STRING" 判斷指定的字符串是否為空,為空為真;
-n "STRING" 判斷指定的字符串是否不空;不空為真;

3.文件測試:
存在性測試:-a|-e FILE 文件是否存在,存在為真;
存在性及類型測試:-b,-c,-f,-d,-l,-p,-S,-h|-L FILE 符號鏈接文件 ###注意:在判斷文件類型時,因先判斷文件是否為鏈接文件,因為,鏈接文件會找其指向的原文件

[root@centos6 ~]# ll /dev/cdrom   ##cdrom為鏈接文件,sr0為塊設備文件
lrwxrwxrwx. 1 root root 3 Mar  3 13:54 /dev/cdrom -> sr0
[root@centos6 ~]# ll /dev/sr0
brw-rw----+ 1 root cdrom 11, 0 Mar  3 13:54 /dev/sr0
[root@centos6 ~]# [ -b /dev/cdrom ] 
[root@centos6 ~]# echo $?
0

存在性及權限測試:-r,-w,-x FILE
存在性及權限測試:-g,-s,-k FILE
文件是否有內容:-s FILE 文件有內容為真

4.時間戳:
-N FILE 文件自上一次讀取操作后是否被修改過

5.從屬關系測試:
-O FILE 當前用戶是否為文件的屬主
-G FIILE 當前用戶是否屬于文件的屬組

6.雙目測試:
FILE1 -ef FILE2 1和2是否為指向同一文件系統上的相同inode的硬鏈接
FILE1 -nt FILE2 1是否新于2
FILE1 -ot FILE2 1是否舊于2

組合測試
第一種方式:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
例:[ -O FILE ] && [ -r FILE ]
第二種方式:
EXPRESSION1 -a EXPRESSION2
EXPRESSION1 -o EXPRESSION2
!EXPRESSION

例:
[ -O file -a -x file ]
[ -z "hostname" -o "$hostname"==localhost -o "$hostname"==localhost.localdomain] && hostname=www.magedu.com

7.讀取用戶鍵盤輸入:

read -p "描述信息:"  變量名
read -s   鍵盤輸入   變量名        ##靜默輸入,即鍵盤輸入的內容不顯示
read -n 數字   ##限制輸入的字符長度
read -d  一個字符; ###輸入此處指定的字符即退出;注意:只能是一個字符
read -t  #;###設置超時間(秒)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容