天天看點

【Linux中進階運維: 第52天——Shell程式設計】第2章:特殊變量+變量子串原理及應用+算術運算符+expr結合邏輯判斷實踐

特殊變量
$0  擷取目前執行腳本的檔案名,如果檔案名帶路徑,則會顯示出路徑和檔案名
$n  傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
$#  可以顯示傳參到腳本中的參數個數
$*  傳遞給腳本或函數的所有參數。
$@  傳遞給腳本或函數的所有參數。被雙引号(" ")包含時,與 $* 稍有不同。
$?  測試傳回值,上一條指令正确則輸出0,非0則為False
$$  擷取目前腳本的PID
$!  擷取上一個背景腳本的PID
$_      
如果傳參數量大于$9,應該把腳本中的$9以上的用{}括起來,聲明這個才  是變量,才可以正确引用,否則隻會讀到$後的一位。      
[root@web01 /server/scripts]# set -- "I am" handsome oldboy.
[root@web01 /server/scripts]# echo $1
I am
[root@web01 /server/scripts]# echo $2
handsome
[root@web01 /server/scripts]# echo $3
oldboy.
[root@web01 /server/scripts]# echo $#
3
[root@web01 /server/scripts]# echo $*
I am handsome oldboy.
[root@web01 /server/scripts]# echo $@
I am handsome oldboy.
[root@web01 /server/scripts]# for i in "$*";do echo $i;done
I am handsome oldboy.
[root@web01 /server/scripts]# for i in "$@";do echo $i;done
I am
handsome
oldboy.
[root@web01 /server/scripts]# cat oldboy.sh 
echo $0
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} $13 $14 $15
echo $#
echo $*
echo $@
echo $$|tee /tmp/a.log
sleep 30
 [root@web01 /server/scripts]# cat kill.sh 
kill `cat /tmp/a.log`      
[root@hosue /server/scripts/offic]# OLDBOY="I am oldboy" 
[root@hosue /server/scripts/offic]# echo $OLDBOY
I am oldboy
[root@hosue /server/scripts/offic]# echo ${OLDBOY}
I am oldboy
[root@hosue /server/scripts/offic]# echo ${#OLDBOY}         <---------------列印變量内容的長度
11
[root@hosue /server/scripts/offic]# echo ${OLDBOY:2:2}      <---------------偏移量2,後取兩個
am
[root@hosue /server/scripts/offic]# echo ${OLDBOY:2}        <---------------偏移量2      
[root@web01 /server/scripts]# OLDBOY=abcABC123ABCabc
[root@web01 /server/scripts]# echo $OLDBOY
abcABC123ABCabc
[root@web01 /server/scripts]# echo ${OLDBOY#a*C}     <-----從開頭删除 條件:最短a*C範圍内容
123ABCabc
[root@web01 /server/scripts]# echo ${OLDBOY##a*C}    <-----從開頭删除 條件:最長a*C範圍内容
abc
[root@web01 /server/scripts]# echo ${OLDBOY%a*C}        <-----從結尾删除 條件:最短a*C範圍内容 
abcABC123ABCabc                                         <-----由于此處無比對内容是以無動作
[root@web01 /server/scripts]# echo ${OLDBOY%a*c}        <-----從結尾删除 條件:最短a*c範圍内容
abcABC123ABC
[root@web01 /server/scripts]# echo ${OLDBOY%%a*c}       <-----從結尾删除 條件:最長a*c範圍内容
                                    <-----由于變量是以a開頭以c結尾,是以輸出空
[root@hosue /server/scripts/offic]# echo ${OLDBOY/abc/bcd}  <-----比對第一個abc進行替換   
bcdABC123ABCabc
[root@hosue /server/scripts/offic]# echo ${OLDBOY//abc/bcd}  <-----比對所有的abc進行替換
bcdABC123ABCbcd
擷取變量内容長度的五種方法:
[root@web01 /server/scripts]# echo $OLDBOY|wc -L
22
[root@web01 /server/scripts]# echo ${#OLDBOY}
22
[root@web01 /server/scripts]# expr length "$OLDBOY"
22
[root@web01 /server/scripts]# echo $OLDBOY|awk '{print length}'
22
[root@web01 /server/scripts]# echo $OLDBOY|awk '{print length($0)}'      
有關計算字元串長度有一個企業面試案例,面試題目如下
請編寫Shell腳本列印下面語句中字元數小于6的單詞。
I am oldboy linux,welcome to our training.      
[root@web01 /server/scripts]# cat count.sh 
chars="I am oldboy linux welcome to our training."
for word in $chars
do
  if [ ${#word} -lt 6 ]
  then
      echo $word
  fi
done
${參數:-word}
[root@localhost ~]# echo $test    #>==   此時test變量未指派

[root@localhost ~]# echo ${test:-word}      #>==  可以看到test變量未指派,輸出了 word,表明test變量為空,傳回 “-”後面定義的字元,但是需注意 不會将word指派給test變量,隻是一個辨別。
word
[root@localhost ~]# test="abc"    #>==  将test變量指派 abc,檢視輸出結果
[root@localhost ~]# echo $test
abc
[root@localhost ~]# echo ${test:-word}   #>==  此時test變量有指派,是以輸出了test變量的值。
abc
${參數:=word}
[root@localhost ~]# unset test
[root@localhost ~]# echo $test  #>==  test變量未指派
[root@localhost ~]# A=${test:=word}
[root@localhost ~]# echo $A     #>==   未指派,則将word指派給變量test
word
如果test變量有指派,則直接輸出test的變量
[root@localhost ~]# test="5678"
[root@localhost ~]# echo $test
5678
[root@localhost ~]# B=${test:=word}
[root@localhost ~]# echo $B   #>==  test變量有指派,直接輸出值,不會将word指派給$test      

以上兩個特殊變量的差別:

${parameter:-word}: 如果parameter有指派,輸出值,無指派,輸出"-"後定義的字元,不會指派給變量parameter,隻是顯示資訊
${parameter:=word}: 如果parameter有指派,輸出值,無指派,将"="後定義的字元,指派給變量parameter
${parameter:?word}
如果變量未指派 
[root@localhost ~]# unset test   #>==  取消test變量的指派
[root@localhost ~]# echo ${test:? is not value}
-bash: test:  is not value    #>==  可以看到,未指派情況下,輸出了? 後定義的錯誤資訊

如果有指派
[root@localhost ~]# test="abcdefg"   #>==   給test變量指派
[root@localhost ~]# echo $test
abcdefg
[root@localhost ~]# echo ${test:? test  is not have value}
abcdefg    #>==   test變量有值的情況下,直接輸出了值
${parameter:+word}
[root@localhost ~]# unset test
[root@localhost ~]# echo $test 

[root@localhost ~]# echo ${test:+word}       #>==  test變量為指派,輸出了空

[root@localhost ~]# test=aaaaaaa
[root@localhost ~]# echo ${test:+word}  #>==  輸出word,說明test變量有指派,但不會将word指派給test,隻是輸出資訊,用于提示
word
[root@localhost ~]# echo $test   #>==  test變量還是最初定義的值      
算術運算:
**  幂運算
*  /  %  乘  除   取餘(取模)
~    |    &      ^  按位取反 按位異或  按位與 按位或
=  +=  -=  *=   /=   %=  指派運算符 a+=1相當于a=a+1
shell的常見算術運算指令:
運算操作符和指令  意義
(( ))  用于整數運算的常用運算符
let  用于整數運算 類似于(())
expr  用于整數運算
$[ ]  用于整數運算
bc  電腦,用于整數和小數
declear  定義變量值和屬性,-i參數可以運算
awk      

數值運算:

1)整數運算
方法1:
[root@web01 /server/scripts]# a=1
[root@web01 /server/scripts]# let a=a+1
[root@web01 /server/scripts]# echo $a
2
方法2:
[root@web01 /server/scripts]# a=10
[root@web01 /server/scripts]# ((a=a+1))
[root@web01 /server/scripts]# echo $a
11
方法3:
[root@web01 /server/scripts]# a=10
[root@web01 /server/scripts]# expr $a + 111
121
[root@web01 /server/scripts]# b=`expr $a + 111`
[root@web01 /server/scripts]# echo $b
121
方法4:
[root@web01 /server/scripts]# a=11
[root@web01 /server/scripts]# echo $[$a+11]
22
[root@web01 /server/scripts]# echo $[a+11]`
22
[root@web01 /server/scripts]# c="$[a+11]"
[root@web01 /server/scripts]# echo $c
22
方法5:
[root@web01 /server/scripts]# a=8
[root@web01 /server/scripts]# declare -i a=a+10
[root@web01 /server/scripts]# echo $a      
整數或小數運算
bc
[root@web01 /server/scripts]# echo 1+2|bc
3
[root@web01 /server/scripts]# echo 1.1*2|bc
2.2
[root@web01 /server/scripts]# echo 3/2|bc
1
[root@web01 /server/scripts]# echo 3%2|bc
1
[root@web01 /server/scripts]# echo 3.33*9.99|bc
33.26
[root@web01 /server/scripts]# echo "scale=4;3.33*9.99"|bc
33.2667
[root@web01 /server/scripts]# echo 3^2|bc
9
awk
[root@web01 ~]# echo 1.1 2|awk '{print $1*$2}'
2.2
[root@web01 ~]# echo 1.1 2|awk '{print $1%$2}'
1.1
[root@web01 ~]# echo 4 2|awk '{print $1%$2}'
0
(()) 邏輯判斷
[root@web01 /server/scripts]# a=10
[root@web01 /server/scripts]# ((a++))
[root@web01 /server/scripts]# echo $a
11
[root@web01 /server/scripts]# ((a--))
[root@web01 /server/scripts]# echo $a
11
[root@web01 /server/scripts]# ((--a))
[root@web01 /server/scripts]# echo $a
9
[root@web01 /server/scripts]# echo $((a--))
4
[root@web01 /server/scripts]# echo $a
3
[root@web01 /server/scripts]# ((8>7))
[root@web01 /server/scripts]# echo $?
0
[root@web01 /server/scripts]# ((8<7))
[root@web01 /server/scripts]# echo $?
1
[root@web01 /server/scripts]# ((8<7&&6>5))
[root@web01 /server/scripts]# echo $?
1
[root@web01 /server/scripts]# ((8<9&&6>5))
[root@web01 /server/scripts]# echo $?      
Expr功能

1)計算

[root@web01 /server/scripts]# expr 10 + 10      

2)擷取字元串長度

[root@web01 /server/scripts]# a="oldgirl"
[root@web01 /server/scripts]# echo $a
oldgirl
[root@web01 /server/scripts]# expr length "$a"      

3)判斷字元串是否為整數數字或字元

[root@web01 /server/scripts]# a=1
[root@web01 /server/scripts]# expr $a + 1 &>/dev/null
[root@web01 /server/scripts]# echo $?
0
[root@web01 /server/scripts]# a=oldboy
[root@web01 /server/scripts]# expr $a + 1 &>/dev/null
[root@web01 /server/scripts]# echo $?      

4)用來判斷檔案擴充名是否符合指定擴充名

[root@web01 /server/scripts]# cat judge.sh 
  if expr "$1" : ".*\.avi$" >/dev/null ; then
    echo "好興奮啊"
  else
    echo "好失望啊"
  fi      
-p   在read讀入的時候輸入一段内容提示使用者
-t    等待使用者輸入時間      
1)定義式   a=1
2)read讀入式   
3)腳本傳參   $1=100

\/
1.test
2.[   ]
3.[[   ]]
4.((   ))