1.SHELL是什麼?
•Shell是用戶與內核進行交互操作的一種接口,目前最流行的Shell稱爲bash Shell
•Shell也是一門編程語言<解釋型的編程語言>,即shell腳本
•一個系統可以存在多個shell,可以通過cat /etc/shells命令查看系統中安裝的shell,不同的shell可能支持的命令語法是不相同的
Shell還是一個功能相當強大的編程語言,易編寫、易調試、靈活性強。Shell是解釋執行的腳本語言,所謂腳本語言就是不用編譯就可以直接執行的語言。在Shell中可以調用Linux系統命令。
2 shell腳本的執行方式
第一種:輸入腳本的絕對路徑或相對路徑
首先要賦予+x權限
/root/helloWorld.sh
./helloWorld.sh
或者,不用賦予+x權限,而用解釋器解釋執行u+x
sh helloworld.sh
第二種:bash或sh +腳本
sh /root/helloWorld.sh
sh helloWorld.sh
第三種:在腳本的路徑前再加". "
. /root/helloWorld.sh
. ./helloWorld.sh
區別:第一種和第二種會新開一個bash,不同bash中的變量無法共享
3.1 系統變量
shell中的變量
1)Linux Shell中的變量分爲“系統變量”和“用戶自定義變量”,可以通過set命令查看系統變量。用$輸出變量
2)系統變量:$HOME、
$PWD、
$SHELL、
$USER等等 當前用戶
3)顯示當前shell中所有變量:set
3.2定義變量
1)基本語法:
變量=值 TT=100 輸出變量 echo $TT
2)變量定義規則
(1)變量名稱可以由字母、數字和下劃線組成,但是不能以數字開頭。
(2)等號兩側不能有空格
(3)變量名稱一般習慣爲大寫
(4)雙引號和單引號有區別,雙引號僅將空格脫意(既字符串之間有空格時要加引號),單引號會將所有特殊字符脫意
y=bb echo 'hello $y'----------hello $y 單引號將所有的特殊字符都當做字符串使用,脫意
echo "hello $y"---------------hello bb
字符串之間有空格時,要加引號。
x=hello word //報錯,不能有空格,不用引號時。x="hello word",ok
3)案例
STR=“hello world”
A=8 定義變量A
unset A 撤銷變量A
readonly B=2 聲明靜態的變量B=2,不能unset
export變量名 可把變量提升爲全局環境變量,可供其他shell程序使用
這也是環境變量要加export的原因,這樣所有的用戶都可以使用這個變量
export JAVA_HOME=/opt/home/jdk-7.01
export A=1 定義的變量,會對自己(當前用戶)所在的shell進程及其子進程生效
B=1 定義的變量,只對自己的所在的shell進程生效
4.將命令的返回值賦值給變量(特別重要)
•A=`ls -la` 反引號,運行裏面的命令,並把結果返回給變量A
•A=$(ls -la) 等價於反引號
A=`pwd` & echo $A ----------/home/hello
A=$(pwd) $ echo $A------------/home/hello
•$? 表示上一個命令退出的狀態
•$$ 表示當前進程編號
•$0 表示當前腳本名稱
•$n 表示n位置的輸入參數(n代表數字,n>=1)
•$# 表示參數的個數,常用於循環
•$*和$@ 都表示參數列表
•$* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號" "包含時,都以$1 $2 … $n 的形式輸出所有參數
•當它們被雙引號" "包含時,"$*" 會將所有的參數作爲一個整體,以"$1 $2 … $n"的形式輸出所有參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出所有參數
5.echo輸出命令
(1)基本語法:
echo [選項] [輸出內容]
選項: echo -e: 支持反斜線控制的字符轉換
控制字符 |
作 用 |
\\ |
輸出\本身 |
\a |
輸出警告音 |
\b |
退格鍵,也就是向左刪除鍵 |
\c |
取消輸出行末的換行符。和“-n”選項一致 |
\e |
ESCAPE鍵 |
\f |
換頁符 |
\n |
換行符 |
\r |
回車鍵 |
\t |
製表符,也就是Tab鍵 |
\v |
垂直製表符 |
\0nnn |
按照八進制ASCII碼錶輸出字符。其中0爲數字零,nnn是三位八進制數 |
\xhh |
按照十六進制ASCII碼錶輸出字符。其中hh是兩位十六進制數 |
7. 設置環境變量
1.基本語法:
export 變量名=變量值 (功能描述:設置環境變量的值)
echo $變量名 (功能描述:查詢環境變量的值)
source配置文件 (功能描述:讓修改後的配置信息立即生效)
2.位置參數變量
1)基本語法
$n (功能描述:n爲數字,$0代表命令本身,$1-$9代表第一到第九個參數,十以上的參數,十以上的參數需要用大括號包含,如${10})
$* (功能描述:這個變量代表命令行中所有的參數,$*把所有的參數看成一個整體)
$@ (功能描述:這個變量也代表命令行中所有的參數,不過$@把每個參數區分對待)
$# (功能描述:這個變量代表命令行中所有參數的個數)
2)案例
(1)計算輸入的參數1和參數2的兩個數的和,並輸出到控制檯
#!/bin/bash num1=$1 num2=$2 sum=$(( $num1 + $num2)) #變量sum的和是num1加num2 echo $sum #打印變量sum的值 |
(2)打印輸入的參數總數、所有參數
#!/bin/bash echo "A total of $# parameters" #使用$#代表所有參數的個數 echo "The parameters is: $*" #使用$*代表所有的參數 echo "The parameters is: $@" #使用$@也代表所有參數 |
(3)$*與$@的區別
#!/bin/bash for i in "$*" #$*中的所有參數看成是一個整體,所以這個for循環只會循環一次 do echo "The parameters is: $i" done x=1 for y in "$@" #$@中的每個參數都看成是獨立的,所以“$@”中有幾個參數,就會循環幾次 do echo "The parameter$x is: $y" x=$(( $x +1 )) done |
a)$*和$@都表示傳遞給函數或腳本的所有參數,不被雙引號“”包含時,都以$1 $2 …$n的形式輸出所有參數
b)當它們被雙引號“”包含時,“$*”會將所有的參數作爲一個整體,以“$1 $2 …$n”的形式輸出所有參數;“$@”會將各個參數分開,以“$1” “$2”…”$n”的形式輸出所有參數
注意:腳本可以嵌套。
9預定義變量
1)基本語法:
$? (功能描述:最後一次執行的命令的返回狀態。如果這個變量的值爲0,證明上一個命令正確執行;如果這個變量的值爲非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。)
$$ (功能描述:當前進程的進程號(PID))
$! (功能描述:後臺運行的最後一個進程的進程號(PID))
2)案例
#!/bin/bash #輸出當前進程的PID,這個PID就是當前這個腳本執行時,生成的進程的PID echo "The current process is $$" #使用find命令在root目錄下查找hello.sh文件,符號&的意思是把命令放入後臺執行 find /root -name hello.sh &
echo "The last one Daemon process is $!" echo "$?" |
10.1運算符
1)基本語法:
(1)“$((運算式))”或“$[運算式]”
(2)expr m + n
注意expr運算符間要有空格
2)案例:計算(2+3)X4的值
(1)採用$[運算式]方式
[root@hadoop102 datas]# S=$[(2+3)*4]
[root@hadoop102 datas]# echo $S
(2)expr分佈計算
S=`expr 2 + 3`
expr $S \* 4
(3)expr一步完成計算
expr `expr 2 + 3` \* 4
echo `expr \`expr 2 + 3\`\*4`
10.2 條件判斷
判斷語句
1)基本語法:
[ condition ](注意condition前後要有空格)
#非空返回true,可使用$?驗證(0爲true,>1爲false)
2)案例:
[robot] 返回true
[] 返回false
[condition] && echo OK || echo notok 條件滿足,執行後面的語句
10.3 常用判斷條件
1)兩個整數之間比較
= 字符串比較
-lt 小於
-le 小於等於
-eq 等於
-gt 大於
-ge 大於等於
-ne 不等於
2)按照文件權限進行判斷
-r 有讀的權限
-w 有寫的權限
-x 有執行的權限
3)按照文件類型進行判斷
-f 文件存在並且是一個常規的文件
-e 文件存在
-d 文件存在並是一個目錄
4)案例
[root@localhost ~]# [ 23 -ge 22 ]
[root@localhost ~]# [ -w student.txt ]
[root@localhost ~]# [ -e /root/install.log ]
10.4.循環控制
if判斷
1)基本語法:
if [ 條件判斷式 ];then
程序
fi
或者
if [ 條件判斷式 ]
then
程序
fi
注意事項:(1)[ 條件判斷式 ],中括號和條件判斷式之間必須有空格
2)案例
#!/bin/bash
read –p “please input your name:” NAME
#printf ‘%s\n’ $NAME
if[ $NAME = root ]
then
echo “hello ${NAME}, welcome !”
elif [ $NAME = robot]
then
echo “hello ${NAME}, welcome !”
else
echo “sorry ”
fi
------------------------------------------------------------------------------
#!/bin/bash
read -p "please input your name:" NAME
#printf'%s\n' $NAME
if [ $NAME = root ]
then
echo "hello ${NAME}, welcome !"
elif [ $NAME = itcast ]
then
echo "hello ${NAME}, welcome !"
else
echo "SB, get out here !"
fi
10.6.2 case語句
1)基本語法:
case $變量名 in
"值1")
如果變量的值等於值1,則執行程序1
;;
"值2")
如果變量的值等於值2,則執行程序2
;;
…省略其他分支…
*)
如果變量的值都不是以上的值,則執行此程序
;;
esac
2)案例
case $1 in
start)
echo “starting”
;; 兩個分號結束
stop)
echo “stoping”
;;
*) *是通用的通配符
echo “Usage:{start|stop}”
esac
10.6.3 for循環
•第一種:
for N in 1 2 3
do
echo $N
done
或
for N in 1 2 3; do echo $N; done
或
for N in {1..3}; do echo $N; done
第二種:
for ((i = 0; i <= 5; i++))
do
echo "welcome $i times"
done
或
for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done
2)案例:
(1)打印時間
#!/bin/bash #打印時間 for time in morning noon afternoon evening do echo "This time is $time!" done |
3)基本語法2:
for (( 初始值;循環控制條件;變量變化 ))
do
程序
done
4)案例
(1)從1加到100
#!/bin/bash #從1加到100 s=0 for (( i=1;i<=100;i=i+1 )) do s=$(( $s+$i )) done echo "The sum is : $s" |
10.6.4 while循環
1)基本語法:
while [ 條件判斷式 ] 條件判斷式都要兩邊加空格
do
程序
done
2)案例
(1)從1加到100
#!/bin/bash #從1加到100 i=1 s=0 while [ $i -le 100 ] #如果變量i的值小於等於100,則執行循環 do s=$(( $s+$i )) i=$(( $i+1 )) done echo "The sum is: $s"
第二種 i=1 s=0 while ((i<=100)) do s=$(($i+$s)) let i++ done echo $s10.7 read讀取控制檯輸入 |
1)基本語法:
read(選項)(參數)
選項:
-p:指定讀取值時的提示符;
-t:指定讀取值時等待的時間(秒)。
參數
變量:指定讀取值的變量名
2)案例
[robot@hadoop101 etc]$ read -p "please input your name:" NAME
please input your name:lilei
[robot@hadoop101 etc]$ echo $NAME
lilei