特殊變量
$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.(( ))