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 #;###設置超時間(秒)