2. Shell
2.1 簡介
shell腳本執行方式Shell 是一個用 C 語言編寫的程序,通過 Shell 用戶可以訪問操作系統內核服務。它類似於 DOS 下的 command 和後來的 cmd.exe。Shell 既是一種命令語言,又是一種程序設計語言。
Shell script 是一種爲 shell 編寫的腳本程序。Shell 編程一般指 shell腳本編程,不是指開發 shell 自身。
Shell 編程跟 java、php 編程一樣,只要有一個能編寫代碼的文本編輯器和一個能解釋執行的腳本解釋器就可以了。
Linux 的 Shell 種類衆多,一個系統可以存在多個 shell,可以通過 cat /etc/shells 命令查看系統中安裝的 shell。
Bash 由於易用和免費,在日常工作中被廣泛使用。同時,Bash 也是大多數Linux 系統默認的 Shell。
2.2快速入門
1 編寫腳本
新建 /root/test/shell/01.sh 文件
#!/bin/bash
echo 'hello world'
#!是一個約定的標記,它告訴系統這個腳本需要什麼解釋器來執行,即使用哪一種 Shell。
echo 命令用於向窗口輸出文本。
2 解釋器
java 需要 虛擬機解釋器, 同理 shell腳本也需要 解析器
[root@k8s-master shells]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
3 執行shell腳本
3.1 執行方式一
[root@k8s-master shells]# /bin/sh 01.sh
hello world
[root@k8s-master shells]# /bin/bash 01.sh
hello world
3.3.1 問題: bash 和 sh****是什麼關係?
sh 是 bash 的 快捷方式
3.2 執行方式二
方式一的簡化方式
[root@k8s-master shells]# bash 01.sh
hello world
[root@k8s-master shells]# sh 01.sh
hello world
3.2.1 問題: 請思考 爲什麼可以省略 /bin/
因爲 PATH環境變量中增加了 /bin/目錄, 所以 使用/bin/sh等類似指令時, 可以省略 /bin
3.3 執行方式三
./文件名
[root@k8s-master shells]# ll
總用量 4
-rw-r--r--. 1 root root 32 3月 14 00:20 01.sh
[root@k8s-master shells]# ./01.sh
-bash: ./01.sh: 權限不夠
3.3.1 權限不夠怎麼辦?
[root@k8s-master shells]# chmod +x 01.sh
[root@k8s-master shells]# ll
總用量 4
-rwxr-xr-x. 1 root root 32 3月 14 00:20 01.sh
再次執行:
[root@k8s-master shells]# ./01.sh
hello world!
2.3 shell變量
1 簡介
定義變量時,變量名不加美元符號($,PHP語言中變量需要),如:
your_name=“runoob.com”
注意,變量名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時,變量名的命名須遵循如下規則:
- 命名只能使用英文字母,數字和下劃線,首個字符不能以數字開頭。
- 中間不能有空格,可以使用下劃線(_)。
- 不能使用標點符號。
- 不能使用bash裏的關鍵字(可用help命令查看保留關鍵字)。
有效的 Shell 變量名示例如下:
RUNOOB
LD_LIBRARY_PATH
_var
var2
無效的變量命名:
?var=123
user*name=runoob
除了顯式地直接賦值,還可以用語句給變量賦值,如:
for file in `ls /etc`
或
for file in $(ls /etc)
以上語句將 /etc 下目錄的文件名循環出來。
2 使用變量
使用一個定義過的變量,只要在變量名前面加美元符號即可,如:
your_name="qinjx"
echo $your_name
echo ${your_name}
變量名外面的花括號是可選的,加不加都行,加花括號是爲了幫助解釋器識別變量的邊界,比如下面這種情況:
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done
如果不給skill變量加花括號,寫成echo "I am good at skillScript當成一個變量(其值爲空),代碼執行結果就不是我們期望的樣子了。
推薦給所有變量加上花括號,這是個好的編程習慣。
已定義的變量,可以被重新定義,如:
your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name
這樣寫是合法的,但注意,第二次賦值的時候不能寫)。
3 只讀變量
使用 readonly 命令可以將變量定義爲只讀變量,只讀變量的值不能被改變。
下面的例子嘗試更改只讀變量,結果報錯:
#!/bin/bash
myUrl="http://www.google.com"
readonly myUrl
myUrl="http://www.runoob.com"
運行腳本,結果如下:
/bin/sh: NAME: This variable is read only.
4 刪除變量
使用 unset 命令可以刪除變量。語法:
unset variable_name
變量被刪除後不能再次使用。unset 命令不能刪除只讀變量。
實例
#!/bin/sh
myUrl="http://www.runoob.com"
unset myUrl
echo $myUrl
以上實例執行將沒有任何輸出。
2.4 字符串
字符串是shell編程中最常用最有用的數據類型(除了數字和字符串,也沒啥其它類型好用了),字符串可以用單引號,也可以用雙引號,也可以不用引號。
1 單引號
name='喬布斯'
str='我很崇拜$name'
echo $str
輸出結果爲:
我很崇拜$name
單引號字符串的限制:
- 單引號裏的任何字符都會原樣輸出,單引號字符串中的變量是無效的;
- 單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符後也不行),但可成對出現,作爲字符串拼接使用。
2 雙引號
name="喬布斯"
str="我很崇拜$name"
echo $str
輸出結果爲:
我很崇拜 喬布斯
雙引號的優點:
- 雙引號裏可以有變量
- 雙引號裏可以出現轉義字符
3 拼接字符串
3.1 使用雙引號拼接
yourname="吳恩達"
wenhou_1="你好,$yourname ."
wenhou_2="你好,"$yourname" ."
wenhou_3="你好,\"$yourname\" ."
echo $wenhou_1 $wenhou_2 $wenhou_3
輸出結果爲:
你好,吳恩達 . 你好,吳恩達 . 你好,"吳恩達" .
3.2 使用單引號拼接
yourname="喬布斯"
wenhou_4='你好,$yourname.'
wenhou_5='你好,'$yourname.''
wenhou_6='你好,"$yourname" .'
echo $wenhou_3 $wenhou_4 $wenhou_5
輸出結果
你好,$yourname. 你好,喬布斯. 你好,"$yourname" .
4 獲取字符串長度
string="jobs"
echo ${string} # 輸出結果: jobs
echo ${#string} # 輸出結果: 4
5 提取子字符串
以下實例從字符串第 2 個字符開始截取 4 個字符:
string="敢於亮劍決不後退"
echo ${string:2:2} # 輸出結果爲: 亮劍
6 查找子字符串
查找字符 i 或 o 的位置(哪個字母先出現就計算哪個):
string="i am a boy"
echo `expr index "$string" am` # 輸出是: 3
注意: 以上腳本中 ` 是反引號(Esc下面的),而不是單引號 ',不要看錯了哦。
2.5 Shell 傳遞參數
我們可以在執行 Shell 腳本時,向腳本傳遞參數,腳本內獲取參數的格式爲:$n。
n 代表一個數字,1 爲執行腳本的第一個參數,2 爲執行腳本的第二個參數,以此類推……
實例
以下實例我們向腳本傳遞三個參數,並分別輸出,其中 $0 爲執行的文件名:
#!/bin/bash
echo "Shell 傳遞參數實例!";
echo "執行的文件名:$0";
echo "第一個參數爲:$1";
echo "第二個參數爲:$2";
echo "第三個參數爲:$3";
爲腳本設置可執行權限,並執行腳本,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 傳遞參數實例!
執行的文件名:./test.sh
第一個參數爲:1
第二個參數爲:2
第三個參數爲:3
另外,還有幾個特殊字符用來處理參數:
參數處理 | 說明 |
---|---|
$# | 傳遞到腳本的參數個數 |
$* | 以一個單字符串顯示所有向腳本傳遞的參數。 如"$*“用「”」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。 |
$$ | 腳本運行的當前進程ID號 |
$! | 後臺運行的最後一個進程的ID號 |
$@ | 與@“用「”」括起來的情況、以"$1" “n” 的形式輸出所有參數。 |
$- | 顯示Shell使用的當前選項,與set命令功能相同。 |
$? | 顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。 |
#!/bin/bash
echo "Shell 傳遞參數實例!";
echo "第一個參數爲:$1";
echo "參數個數爲:$#";
echo "傳遞的參數作爲一個字符串顯示:$*";
執行腳本,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 傳遞參數實例!
第一個參數爲:1
參數個數爲:3
傳遞的參數作爲一個字符串顯示:1 2 3
$* 與 $@ 區別:
- 相同點:都是引用所有參數。
- 不同點:只有在雙引號中體現出來。假設在腳本運行時寫了三個參數 1、2、3,,則 " * " 等價於 “1 2 3”(傳遞了一個參數),而 “@” 等價於 “1” “2” “3”(傳遞了三個參數)。
#!/bin/bash
echo "-- $* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- $@ 演示 ---"
for i in "$@"; do
echo $i
done
執行腳本,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3
2.6 Shell算術運算符
1 簡介
Shell 和其他編程一樣,支持包括:算術、關係、布爾、字符串等運算符。原生 bash 不支持簡單的數學運算,但是可以通過其他命令來實現,例如expr。expr 是一款表達式計算工具,使用它能完成表達式的求值操作。
例如,兩個數相加:
val=`expr 2 + 2`
echo $val
注意:
表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2。
完整的表達式要被 包含,注意不是單引號,在 Esc 鍵下邊。
下表列出了常用的算術運算符,假定變量 a 爲 10,變量 b 爲 20:
運算符 | 說明 | 舉例 |
---|---|---|
+ | 加法 | expr $a + $b 結果爲 30。 |
- | 減法 | expr $a - $b 結果爲 -10。 |
* | 乘法 | expr $a \* $b 結果爲 200。 |
/ | 除法 | expr $b / $a 結果爲 2。 |
% | 取餘 | expr $b % $a 結果爲 0。 |
= | 賦值 | a=$b 將把變量 b 的值賦給 a。 |
== | 相等。用於比較兩個數字,相同則返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用於比較兩個數字,不相同則返回 true。 | [ $a != $b ] 返回 true。 |
**注意:**條件表達式要放在方括號之間,並且要有空格,例如: [b] 是錯誤的,必須寫成 [ $a == $b ]。
2 例子
#!/bin/bash
a=4
b=20
#加法運算
each expr $a + $b
#減法運算
echo expr $a - $b
#乘法運算,注意*號前面需要反斜槓
echo expr $a \* $b
#除法運算
echo $a / $b
此外,還可以通過(())、$(())、$[]進行算術運算。
((a++))
echo "a = $a"
c=$((a+b))
d=$[a+b]
echo "c = $c"
echo "d = $d"
2.7流程控制
1 if else
1.1 if
if 語句語法格式:
if condition
then
command1
command2
...
commandN
fi
寫成一行(適用於終端命令提示符):
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
末尾的fi就是if倒過來拼寫,後面還會遇到類似的。
1.2 if else
if else 語法格式:
if condition
then
command1
command2
...
commandN
else
command
fi
1.3 if else-if else
if else-if else 語法格式:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
以下實例判斷兩個變量是否相等:
關係運算符
關係運算符只支持數字,不支持字符串,除非字符串的值是數字。
下表列出了常用的關係運算符,假定變量 a 爲 10,變量 b 爲 20:
運算符 | 說明 | 舉例 |
---|---|---|
-eq | 檢測兩個數是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 檢測兩個數是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 檢測左邊的數是否大於右邊的,如果是,則返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 檢測左邊的數是否小於右邊的,如果是,則返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 檢測左邊的數是否大於等於右邊的,如果是,則返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 檢測左邊的數是否小於等於右邊的,如果是,則返回 true。 | [ $a -le $b ] 返回 true。 |
a=10
b=20
if [ $a == $b ]
then
echo "a 等於 b"
elif [ $a -gt $b ]
then
echo "a 大於 b"
elif [ $a -lt $b ]
then
echo "a 小於 b"
else
echo "沒有符合的條件"
fi
輸出結果:
a 小於 b
if else語句經常與test命令結合使用,如下所示:
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '兩個數字相等!'
else
echo '兩個數字不相等!'
fi
輸出結果:
兩個數字相等!
2 for 循環
與其他編程語言類似,Shell支持for循環。
for循環一般格式爲:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
寫成一行:
for var in item1 item2 ... itemN; do command1; command2… done;
當變量值在列表裏,for循環即執行一次所有命令,使用變量名獲取列表中的當前取值。命令可爲任何有效的shell命令和語句。in列表可以包含替換、字符串和文件名。
in列表是可選的,如果不用它,for循環使用命令行的位置參數。
例如,順序輸出當前列表中的數字:
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
輸出結果:
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
順序輸出字符串中的字符:
for str in 'This is a string'
do
echo $str
done
輸出結果:
This is a string
3 while 語句
while循環用於不斷執行一系列命令,也用於從輸入文件中讀取數據;命令通常爲測試條件。其格式爲:
while condition
do
command
done
以下是一個基本的while循環,測試條件是:如果int小於等於5,那麼條件返回真。int從0開始,每次循環處理時,int加1。運行上述腳本,返回數字1到5,然後終止。
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
運行腳本,輸出:
1
2
3
4
5
使用中使用了 Bash let 命令,它用於執行一個或多個表達式,變量計算中不需要加上 $ 來表示變量,具體可查閱:Bash let 命令。
4 無限循環
無限循環語法格式:
while :
do
command
done
或者
while true
do
command
done
或者
for (( ; ; ))
5 case
Shell case語句爲多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令。case語句格式如下:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
case工作方式如上所示。取值後面必須爲單詞in,每一模式必須以右括號結束。取值可以爲變量或常數。匹配發現取值符合某一模式後,其間所有命令開始執行直至 ;;。
取值將檢測匹配的每一個模式。一旦模式匹配,則執行完匹配模式相應命令後不再繼續其他模式。如果無一匹配模式,使用星號 * 捕獲該值,再執行後面的命令。
下面的腳本提示輸入1到4,與每一種模式進行匹配:
echo '輸入 1 到 4 之間的數字:'
echo '你輸入的數字爲:'
read aNum
case $aNum in
1) echo '你選擇了 1'
;;
2) echo '你選擇了 2'
;;
3) echo '你選擇了 3'
;;
4) echo '你選擇了 4'
;;
*) echo '你沒有輸入 1 到 4 之間的數字'
;;
esac
輸入不同的內容,會有不同的結果,例如:
輸入 1 到 4 之間的數字:
你輸入的數字爲:
3
你選擇了 3
6 跳出循環
在循環過程中,有時候需要在未達到循環結束條件時強制跳出循環,Shell使用兩個命令來實現該功能:break和continue。
break命令
break命令允許跳出所有循環(終止執行後面的所有循環)。
下面的例子中,腳本進入死循環直至用戶輸入數字大於5。要跳出這個循環,返回到shell提示符下,需要使用break命令。
#!/bin/bash
while :
do
echo -n "輸入 1 到 5 之間的數字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你輸入的數字爲 $aNum!"
;;
*) echo "你輸入的數字不是 1 到 5 之間的! 遊戲結束"
break
;;
esac
done
執行以上代碼,輸出結果爲:
輸入 1 到 5 之間的數字:3
你輸入的數字爲 3!
輸入 1 到 5 之間的數字:7
你輸入的數字不是 1 到 5 之間的! 遊戲結束
continue
continue命令與break命令類似,只有一點差別,它不會跳出所有循環,僅僅跳出當前循環。
對上面的例子進行修改:
#!/bin/bash
while :
do
echo -n "輸入 1 到 5 之間的數字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你輸入的數字爲 $aNum!"
;;
*) echo "你輸入的數字不是 1 到 5 之間的!"
continue
echo "遊戲結束"
;;
esac
done
運行代碼發現,當輸入大於5的數字時,該例中的循環不會結束,語句 **echo "**遊戲結束" 永遠不會被執行。
2.8 函數使用
1 語法
linux shell 可以用戶定義函數,然後在shell腳本中可以隨便調用。
shell中函數的定義格式如下:
[ function ] funname()
{
action;
[return int;]
}
說明:
- 1、可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數。
- 2、參數返回,可以顯示加:return 返回,如果不加,將以最後一條命令運行結果,作爲返回值。 return後跟數值n(0-255
下面的例子定義了一個函數並進行調用:
#!/bin/bash
demoFun(){
echo "這是我的第一個 shell 函數!"
}
echo "-----函數開始執行-----"
demoFun
echo "-----函數執行完畢-----"
輸出結果:
-----函數開始執行-----
這是我的第一個 shell 函數!
-----函數執行完畢-----
下面定義一個帶有return語句的函數:
#!/bin/bash
funWithReturn(){
echo "這個函數會對輸入的兩個數字進行相加運算..."
echo "輸入第一個數字: "
read aNum
echo "輸入第二個數字: "
read anotherNum
echo "兩個數字分別爲 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "輸入的兩個數字之和爲 $? !"
輸出類似下面:
這個函數會對輸入的兩個數字進行相加運算...
輸入第一個數字:
1
輸入第二個數字:
2
兩個數字分別爲 1 和 2 !
輸入的兩個數字之和爲 3 !
函數返回值在調用該函數後通過 $? 來獲得。
注意:所有函數在使用前必須定義。這意味着必須將函數放在腳本開始部分,直至shell解釋器首次發現它時,纔可以使用。調用函數僅使用其函數名即可。
2 函數參數
在Shell中,調用函數時可以向其傳遞參數。在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數…
帶參數的函數示例:
#!/bin/bash
funWithParam(){
echo "第一個參數爲 $1 !"
echo "第二個參數爲 $2 !"
echo "第十個參數爲 $10 !"
echo "第十個參數爲 ${10} !"
echo "第十一個參數爲 ${11} !"
echo "參數總數有 $# 個!"
echo "作爲一個字符串輸出所有參數 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
輸出結果:
第一個參數爲 1 !
第二個參數爲 2 !
第十個參數爲 10 !
第十個參數爲 34 !
第十一個參數爲 73 !
參數總數有 11 個!
作爲一個字符串輸出所有參數 1 2 3 4 5 6 7 8 9 34 73 !
注意,{10}。當n>=10時,需要使用${n}來獲取參數。
另外,還有幾個特殊字符用來處理參數:
參數處理 | 說明 |
---|---|
$# | 傳遞到腳本的參數個數 |
$* | 以一個單字符串顯示所有向腳本傳遞的參數 |
$$ | 腳本運行的當前進程ID號 |
$! | 後臺運行的最後一個進程的ID號 |
$@ | 與$*相同,但是使用時加引號,並在引號中返回每個參數。 |
$- | 顯示Shell使用的當前選項,與set命令功能相同。 |
$? | 顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。 |
2.9 數組
1 定義數組
數組中可以存放多個值。Bash Shell 只支持一維數組(不支持多維數組),初始化時不需要定義數組大小(與 PHP 類似)。
與大部分編程語言類似,數組元素的下標由0開始。
Shell 數組用括號來表示,元素用"空格"符號分割開,語法格式如下:
array_name=(value1 … valuen)
1.1 實例
#!/bin/bash
my_array=(A B "C" D)
我們也可以使用下標來定義數組:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
2 讀取數組
讀取數組元素值的一般格式是:
${array_name[index]}
2.1 實例
#!/bin/bash
my_array=(A B "C" D)
echo "第一個元素爲: ${my_array[0]}"
echo "第二個元素爲: ${my_array[1]}"
echo "第三個元素爲: ${my_array[2]}"
echo "第四個元素爲: ${my_array[3]}"
執行腳本,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh
第一個元素爲: A
第二個元素爲: B
第三個元素爲: C
第四個元素爲: D
2.2 獲取數組中的所有元素
使用@ 或 * 可以獲取數組中的所有元素,例如:
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "數組的元素爲: ${my_array[*]}"
echo "數組的元素爲: ${my_array[@]}"
執行腳本,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh
數組的元素爲: A B C D
數組的元素爲: A B C D
2.3 獲取數組的長度
獲取數組長度的方法與獲取字符串長度的方法相同,例如:
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "數組元素個數爲: ${#my_array[*]}"
echo "數組元素個數爲: ${#my_array[@]}"
執行腳本,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh
數組元素個數爲: 4
數組元素個數爲: 4
3 遍歷數組
3.1 方式一
#!/bin/bash
my_arr=(AA BB CC)
for var in ${my_arr[*]}
do
echo $var
done
3.2 方式二
my_arr=(AA BB CC)
my_arr_num=${#my_arr[*]}
for((i=0;i<my_arr_num;i++));
do
echo "-----------------------------"
echo ${my_arr[$i]}
done
2.10 select
1 簡介
select表達式是bash的一種擴展應用,擅長於交互式場合。用戶可以從一組不同的值中進行選擇:
select var in ... ;
do
commond
done
.... now $var can be used ...
注意:
select 是個無限循環,因此要記住用 break 命令退出循環,或用exit 命令終止腳本
示例
下面是一個簡單的示例:
#!/bin/bash
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other";
do
break;
done
echo "You have selected $var"
該腳本的運行結果如下:
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
2 練習
實現如下的效果
1) java
2) c++
3) shell
請輸入你的選擇:3
你選擇的是shell
代碼如下
#!/bin/bash
select var in java c++ shell;
do
break;
done
echo "你選擇的是$var"
3 select和case的綜合練習
#!/bin/bash
echo "你想學習什麼語言?"
PS3="請輸入你的選擇:" # 設置提示字符串
select var in java c++ shell python;
do
case $var in
"java")
echo "恭喜你選擇成功.java最牛"
;;
"c++")
echo "驅動開發 網絡優化 go 語言"
;;
"shell")
echo "運維必會"
;;
python)
echo "人工智能"
esac
break # 如果這裏沒有break 將會進行無限循環
done
echo "你選擇的是:$var"
4 修改提示符PS3
PS3作爲select語句的shell界面提示符,提示符爲PS3的值(賦予的字符串),更換默認的提示符”#?”
注意:PS3一定要定義在select語句的前面
#!/bin/bash
PS3="請輸入你的選擇:"
select var in java c++ shell;
do
break;
done
echo "你選擇的是$var"
2.11 EOF
Shell中通常將EOF與 << 結合使用,表示後續的輸入作爲子命令或子Shell的輸入,直到遇到EOF爲止,再返回到主調Shell。
1. 覆蓋效果
#!/bin/bash
cat >/root/a.txt <<EOF
ABCD
EOF
2. 追加效果
#!/bin/bash
cat >/root/a.txt <<EOF
ABCD
EOF
2.12 加載其它文件的變量
1 簡介
和其他語言一樣,Shell 也可以包含外部腳本。這樣可以很方便的封裝一些公用的代碼作爲一個獨立的文件。
Shell 文件包含的語法格式如下:
. filename # 注意點號(.)和文件名中間有一空格
或
source filename
2 練習
定義兩個文件 test1.sh和test2.sh,在test1中定義一個變量arr=(java c++ shell),在test2中對arr進行循環打印輸出。
第一步: vim test1.sh
#!/bin/bash
my_arr=(AA BB CC)
第二步: vim test2.sh
#!/bin/bash
source ./test1.sh # 加載test1.sh 的文件內容
for var in ${my_arr[*]}
do
echo $var
done
第三步: 執行 test2.sh
sh test2.sh
好處 :
1. 數據源 和 業務處理 分離
2. 複用 代碼擴展性更強
2.13 一鍵安裝jdk
1 思路
#第1步:提示用戶安裝jdk
#第2步:刪除centos自帶的jdk
#第3步:創建/usr/local/java目錄,進入目錄
#第4步:下載jdk安裝包
#第5步:解壓jdk,刪除壓縮包
#第6步:設置環境變量
#第7步:加載環境變量
#第8步:提示用戶安裝成功,查看java的版本
2 代碼
#!/bin/bash
# 1.提示安裝jdk
echo "現在開始安裝jdk"
sleep 1 # 休眠1秒鐘
# 2.刪除centos自帶的jdk
oldjava=` rpm -qa | grep java `
for old in ${oldjava};
do
# echo $old
rpm -e --nodeps $old
done
# 3.創建安裝目錄/usr/local/java, 進入安裝目錄
java_path="/usr/local/java"
if [ ! -d $java_path ]
then
mkdir -p $java_path
fi
cd $java_path
# 4.下載jdk安裝包
if [ ! -f jdk-8u141-linux-x64.tar.gz ]
then
cp /export/soft/jdk-8u141-linux-x64.tar.gz ./
fi
# 5.解壓縮安裝包,刪除安裝包
if [ ! -f jdk1.8.0_141 ]
then
tar -zxvf jdk-8u141-linux-x64.tar.gz
rm -rf jdk-8u141-linux-x64.tar.gz
fi
# 6.設置環境變量
JAVA_HOME="/usr/local/java/jdk1.8.0_141"
if ! grep "JAVA_HOME=$JAVA_HOME" /etc/profile
then
echo "-------------------- path = $PATH"
# JAVA_HOME
echo "--------------JAVA_HOME------------------"
echo "export JAVA_HOME=$JAVA_HOME" | tee -a /etc/profile
# PATH
echo "--------------PATH------------------------"
echo "export PATH=:$JAVA_HOME/bin:$PATH" | tee -a /etc/profile
fi
# 7.加載環境變量
source /etc/profile
# 8.提示用戶安裝成功,查看jdk安裝版本
echo "恭喜您,jdk安裝成功!"
java -version
注意:在var目錄上傳jdk安裝包!!!
從網絡上下載jdk地址
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz