腳本的執行方法:5種
絕對路徑:#/home/shell/shell.sh
相對路徑:#../shell.sh
$PATH中:#shell.sh
bash指令:#bash shell.sh
source指令(簡寫"."):#. shell.sh
腳本的書寫:
第一行:#!/bin/bash #!叫shabang header
檔案頭:
腳本名、作者、聯系方式、日期、changelog
定義變量:
PATH、LANG、自定義變量
定義函數:
主程式:
傳回值
傳回值:
代表程式(指令、語句)的執行情況。
父程序負責收集子程序的傳回值。
0 成功
非0 失敗
2 用法錯誤
126 沒權限
127 指令沒找到
定義方法:
exit N
return N
檢視方法:隻能常上一個程式。
#echo $?
變量:
儲存資料的一種形式,在記憶體中配置設定的位置。
變量名:
字母或下劃線開頭,後面更随字母數字或下劃線。
#echo $PATH
顯示 變量名
變量的定義(指派):
變量名=值 =兩邊不能空格、不要用$
#A=123
#echo $A
#unset A 退出終端也行
#A=/etc/*.conf
間接引用:
#A=B
#B=helloworld
#echo ${!A} #eval echo \$$A
全局變量:
#A=helloword
#export A
#export
#bash
helloword
#exit
#export -n A
#export | head -n 5
想永久生效的話,寫配置檔案/etc/[bashrc|profile]。
内部變量:
PPID 父程序的PID
UID 目前使用者UID
EUID 有效使用者UID
BASH bash二進制檔案的路徑
BASH_VERSION bash版本資訊
SHELL 登入shell的絕對路徑
SHELLOPTS 目前shell啟用的選項
EDITOR 預設編輯器
USER/LOGNAME 使用者名/登入名
HOME 使用者主目錄
PWD 目前目錄
HOSTNAME 主機名
MACHTYPE/OSTYPE 機器類型/系統類型
PATH 可執行檔案的搜尋路徑
#PATH=$PATH:/root/bin
#export PATH
REPLY 輸入資料的預設存儲變量
SECONDS 腳本運作時間
RANDOM 随機數0-32767 #echo $(($RANDOM%100)) 1-100之間的随機數
PS1 第一提示符
PS2 第二提示符
$? 上一個指令的傳回值
$$ 目前程序的PID
$! 最近一個背景程序的PID
$0 腳本名字
$1...$N 腳本的第1個參數
$# 參數的個數
$@ 所有參數,一個一個的。"A" "B"
"$@" 所有參數,一個一個的。
$* 所有參數,一個一個的。
"$*" 所有參數,一個字元串。"A B"
#!bin/bash
echo "input something..."
read
echo $REPLY
echo '$0='$0
echo '$1='$1
echo '$10='${10} 位置變量大于10、數組、間接引用
echo '$#='$#
bash的操作環境:
env 環境變量
set
-f 關閉路徑替換
-n 讀取腳本但是不執行
-e 遇到錯誤立刻停止
-x 列印指令替換(debug) #!/bin/bash -x
-v 列印讀取的指令
stty
declare聲明變量
-i 整型
-x 環境變量
-a 數組
-r 隻讀變量
bash中的數組:
兩個相關聯的變量組成數組
array[index/key]=value
數組名 下标 元素
數組的指派:
#array[0]=hello ; array[1]=world ; array[3]=again
#arry=(hello [4]=world [6]=again again)
數組的取值:
#echo ${array[0]}
#array=(one two there four five)
#echo ${array[0]} 第一個元素的值
#echo ${array[0]:1} 第一個元素的值,從第二個字母開始顯示。
#echo ${array[@]} 全部元素的值
#echo ${array[*]} 全部元素的值
#echo ${#array[0]} 第一個元素的值的長度
#echo ${#array[@]} 數組中所有元素的個數
#echo ${array[@]#f*r} 從左向右最短比對,删除
#echo ${array[@]##t*e} 從左向右最長比對,删除
#echo ${array[@]%h*e} 從右向左最短比對,删除
#echo ${array[@]%%t*e} 從右向左最長比對,删除
變量的各種操縱方法:
參數替換:
${變量名-值}
${var-default} #如果變量var沒有被聲明,那麼default就是變量var的值。
${var:-default} #如果變量var沒有被指派,那麼default就是變量var的值。
#!/bin/bash
#var=
echo "${var-notdefine}"
echo "${var:-isnull}"
${var=default}
${var:=default}
${var+default}
${var:+default}
${var?default}
${var:?default}
變量替換:
${#var} 變量内容的長度
${var#string} 從左向右最短比對,删除
${var##string} 從左向右最長比對,删除
${var%string} 從右向左最短比對,删除
${var%%string} 從右向左最長比對,删除
stringX=abcABC123ABCabc
echo $stringX
echo ${stringX#a*C}
echo ${stringX##a*C}
echo ${stringX%b*c}
echo ${stringX%%b*c}
echo $0
echo ${0##*/} 保留腳本名
echo $(basename /home/shell/shell.sh) 保留腳本名
echo $MAIL
echo ${MAIL##/*/} 隻保留使用者名
echo ${MAIL%$USER} 隻保留路徑
大括号替換:
#touch file{4,9}
#touch file{0..9}
#cp /etc/fstab{,.bak}
算術替換:
#echo $((1+ 6 ))
#echo $[1+6]
+ - * / % ()
#SUM=`bc <<<"1+7"`
#echo $SUM
指令替換:
`command`
$(command)
#rpm -qf `which httpd` httpd指令是哪個軟體包安裝的?
各種比較:
test(簡寫"[","]")指令
檔案類型:#test -e filename #[ -e filename ]
-e 是否存在
-f 是否為檔案
-d 是否為目錄
-b 是否為塊裝置
-c 是否為字元裝置
-S 是否為socket檔案
-p 是否為管道
-L 是否為連接配接
檔案權限:
-r
-w
-x
-u 是否有SUID
-g 是否有SGID
-k 是否有Sticky bit
-s 是否非空
兩個檔案之間:#test file1 -nt file2
-nt file1是否比file2新
-ot file1是否比file2舊
-ef 兩個檔案是否相同
整數之間:
-eq 相等
-ne 不等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
字元、字元串之間:
-z 是否空
-n 是否非空
== 相同
!= 不同
其他:#test -r file1 -a -x file1 #test ! -e file1
-a 邏輯于
-o 邏輯或
! 非(取反)
例:
test.sh
各種雜項:
echo:
#echo -ne "hello\tworld\n"
read:
-p 顯示提示資訊 #read -p "Input filename:" FN
-t 逾時時間
-n 1 按任意鍵繼續
sleep/wait: #sleep 5
exit/return:
:
bc: #bc <<<"1+7"
seq: #seq 6 #seq 2 6 #seq 1 2 9
各種語句:
if:
if CONDITION
then
COMMAND
fi
COMMAND1
else
COMMAND2
if CONDITION1
elif CONDITION2
then
COMMAND3
if [ -d $1 ] ; then
echo "$1 is directory."
elif [ -x $1 ] ; then
echo "$1 is a scripts."
elif [ -f $1 ] ; then
echo "$1 is a file."
echo "Unknown."
例子:
有木有.sh
計算閏年
leapyear.sh
for:
for VAR in LIST
do
COMMANDS
done
LIST的寫法:
直接寫: for i in 1 2 3
大括号擴充:for i in {0..99}
通配符:for i in /etc/*.conf
指令的結果:for i in `find /etc/ -name "*.conf"`
C風格:for ((i=0;i<10;i=i+1))
練:
for A in $@ ; do
for B in "$@" ; do
for C in $* ; do
echo '$*='$C
for D in "$*" ; do
echo '"$*"='$D
for i in ${array[@]} ; do
echo $i
9*9.sh
for i in {1..9} ; do
for n in `seq 1 $i` ; do
echo -ne "$i*$n=$(($i*$n))"
done
echo
ping.sh
方法一:
for i in {252..254} ; do
ping -c1 192.168.18.$i &> /dev/null
if [ "$?" == "0" ] ; then
echo "192.168.18.$i online."
else
echo "192.168.18.$i offline."
fi
方法二:
if ping -c1 192.168.18.$i &> /dev/null ; then
方法三:
result=`ping -c1 192.168.18.$i | grep ttl | cut -d "=" -f 2 | cut -d " " -f 2`
if [ "$result" == "ttl" ] ; then
mssh.sh
#mssh.sh "IP1 IP2" "service iptables stop"
for i in $1 ; do
ssh $i $2
監控磁盤
for space in `LANG=C df -h | grep -v Use | awk '{print $5}' | cut -d "%" -f 1`
if [ $space -get 80 ] ; then
while:#true #false
while CONTROL-COMMAND
CONSEQUENT-COMMANDS
i=0
while [ $i -lt 4 ] ; do
i=$[$i+1]
until:
until CONTROL-COMMAND
num=1
until [ ! "$num" -le 5 ] ; then
echo "$num"
num=$(($num+1))
監控httpd是否運作,沒運作的話嘗試重新開機并發郵件報警。
process=httpd
while true ; do
#result=`pstree | grep $process`
pstree | grep $process &> /dev/null
if [ $? -eq 0 ] ; then
sleep 600
case
break continue
shift
函數
鎖
autoinstall.sh
本文轉自zhaoyun00 51CTO部落格,原文連結:http://blog.51cto.com/zhaoyun/747166