天天看點

shell知識

腳本的執行方法: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