目錄
一、Shell 編程入門
1. 認(rèn)識 Shell
2. Shell 腳本的創(chuàng)建與執(zhí)行????????
二、Shell 變量
1. 系統(tǒng)變量和自定義變量
2. 變量的基本規(guī)則
3. 設(shè)置環(huán)境變量
4. 位置參數(shù)變量
5. 預(yù)定義變量
三、運算符
四、條件判斷
五、流程控制
1. if 語句
2. case 語句
3. for 循環(huán)
4. while 循環(huán)
六、read 讀取控制臺輸入
一、Shell 編程入門
1. 認(rèn)識 Shell
開發(fā)者在進(jìn)行服務(wù)器集群管理時,都需要編寫 Shell 程序來進(jìn)行服務(wù)器管理。Shell 是一個命令行解釋器,為用戶提供了一個向 Linux 內(nèi)核發(fā)送請求以便于運行程序的界面系統(tǒng)升級程序。用戶可以用 Shell 來啟動、掛起、停止或者編寫一些程序。
2. Shell 腳本的創(chuàng)建與執(zhí)行????????
Shell 腳本在執(zhí)行時有兩個格式上的要求:以 #!/bin/bash 開頭、必須有可執(zhí)行權(quán)限。如下我們編寫第一個 Shell 腳本:
(1)創(chuàng)建新目錄 shell 用于存放 shell 腳本;
[root@majinjian ~]# mkdir /root/shell
[root@majinjian ~]# cd /root/shell
(2)vim 編輯器新建 shell 腳本 shell.sh,輸入命令;
#!/bin/bash
echo "hello world!"
(3)這個時候查看 shell.sh 的權(quán)限,是沒有可執(zhí)行權(quán)限 x 的;
(4)為它添加可執(zhí)行權(quán)限;
[root@majinjian shell]# chmod u+x shell.sh
(5)執(zhí)行文件;
shell 腳本常用的執(zhí)行方式有兩種:
- 輸入腳本的絕對路徑或者相對路徑(需要先賦予腳本執(zhí)行權(quán)限 x);
- sh + 腳本(無需賦予執(zhí)行權(quán)限,直接執(zhí)行即可)。
二、Shell 變量
1. 系統(tǒng)變量和自定義變量
Linux Shell 中的變量分為系統(tǒng)變量和用戶自定義變量。系統(tǒng)變量顧名思義就是系統(tǒng)已經(jīng)設(shè)置好的變量,諸如 $HOME、$PWD、$USER、$SHELL 等都是系統(tǒng)變量。使用指令 set 可以查看系統(tǒng)中所有的系統(tǒng)變量。我們常用較多的是自定義變量,基本語法如下:
- 定義變量:變量名稱=值;
- 撤銷變量:unset 變量名;
- 定義靜態(tài)變量:readonly 變量名稱=值(靜態(tài)變量不能撤銷);
- 輸出變量:$變量。
我們試著操作一下變量:
#定義變量A
A=100
#輸出變量
echo A=$A
echo "A=$A"
#撤銷變量A
unset A
echo $A
#聲明靜態(tài)的變量B = 3
readonly B=3
echo $B
執(zhí)行結(jié)果為;
2. 變量的基本規(guī)則
在定義變量時變量名稱可以由字母、數(shù)字和下劃線組成,但不能以數(shù)字開頭;等號的兩側(cè)不能有空格;變量名稱一般為大寫。
將命令的返回值賦給變量時使用如下寫法;
- A=`data`,表示運行 ` ` 中的命令,并把結(jié)果返回給 A;
- A=$(data),$() 相當(dāng)于 ``。
3. 設(shè)置環(huán)境變量
- export 變量名=變量值? //將 Shell 變量輸出為環(huán)境變量/全局變量
- source 配置文件? //讓修改后的配置信息立即生效
- echo $變量名? //查詢環(huán)境變量的值
案例:在 /etc/profile 文件中定義 TOMCAT_HOME 環(huán)境變量,vim 打開?/etc/profile 輸入;
export TOMCAT_HOME=/opt/tomcat
設(shè)置完之后刷新配置狀態(tài);
[root@majinjian opt]# source /etc/profile
結(jié)果如下;
4. 位置參數(shù)變量
當(dāng)執(zhí)行一個 Shell 腳本時,如果希望獲取到命令行的參數(shù)信息,就需要使用到位置參數(shù)變量?;菊Z法有:
- $n? //n 為數(shù)字,$0 代表命令本身,$1-9 代表第 1 到第 9 個參數(shù),10 以上的參數(shù)需要用大括號包含如 ${10}
- $*? //代表命令行中的所有參數(shù),$* 將所有參數(shù)看成一個整體
- $@? //這個變量也可以代表命令行中的所有參數(shù),不過 $@ 把每個參數(shù)區(qū)分對待
- $#? //代表命令行中所有參數(shù)的個數(shù)
案例:編寫一個 Shell 腳本 position.sh,在腳本中獲取到命令行中的各個參數(shù)信息。
#!/bin/bash
echo "0=$0 1=$1 2=$2"
echo "所有參數(shù)=$*"
echo "$@"
echo "參數(shù)個數(shù)=$#"
運行時輸入 100 和 200 兩個參數(shù),結(jié)果如下。
5. 預(yù)定義變量
預(yù)定義變量就是 Shell 的設(shè)計者事先定義好的變量,可以直接在 Shell 腳本中使用。基本語法有:
- $$? //當(dāng)前進(jìn)程的進(jìn)程號碼(PID)
- $!? //后臺運行的最后一個進(jìn)程的進(jìn)程號
- $?? //最后一次執(zhí)行命令的返回狀態(tài),如果這個變量的值為0證明上一個命令正確執(zhí)行,如果不是 0 上一個命令沒有正確執(zhí)行
三、運算符
在 Shell 編程中有各種運算操作,語法格式為 $((運算式)) 或 $[運算式] 或者 expr m + n;如果希望將 expr 的值賦給某個變量,使用 `` 即可。
- \*? //乘,在?`` 里面的乘應(yīng)該用此格式即 * 前添加轉(zhuǎn)義字符 \
- /? //除
- %? //取余
案例1:計算 (2+3)×4;
#!/bin/bash
#計算(2+3)×4的值
#方式1
result1=$(((2+3)*4))
echo "res1=$result1"
#方式2
result2=$[(2+3)*4]
echo "res2=$result2"
#方式3
result3=`expr 2 + 3`
result4=`expr $result3 \* 4`
echo "expr res4=$result4"
結(jié)果如下。
案例2:計算命令行兩個參數(shù)的和;
#計算命令行兩個參數(shù)的和
sum=$[$1+$2]
echo "sum=$sum"
運行時輸入 20 和 50,結(jié)果如下:
四、條件判斷
條件判斷使用語法 [ condition ](注意 condition 前后有空格),非空會返回 true??梢允褂?$? 驗證結(jié)果,0 為 true,>1 為false。如:
- [ hspEdu ] 會返回 true
- [ ] 會返回 false
- [ condition?] && echo yes?|| echo no ,前一個判斷滿足時會繼續(xù)執(zhí)行后面的語句
常用的判斷語句有:
判斷兩個字符串
- =? //相等
判斷兩個整數(shù)
- -lt? //小于
- -le? //小于等于
- -eq? //等于
- -gt? //大于
- -ge? //大于等于
- -ne? //不等于
按照文件權(quán)限進(jìn)行判斷
- -r? //有讀的權(quán)限
- -w? //有寫的quanx
- -x? //有執(zhí)行的權(quán)限
按照文件類型進(jìn)行判斷
- -f? //文件存在并且是一個常規(guī)的文件
- -e? //文件存在
- -d? //文件存在并是一個目錄
案例:判斷 "ok" 是否等于 ok;
#!/bin/bash
if [ "ok" = "ok" ]
then
echo "equal" #如果等于則輸出 equal
fi #否則結(jié)束
22 是否大于等于 21;
if [ 22 -ge 21 ]
then
echo "大于"
fi
/root/shell 目錄下是否有 aaa.txt 文件;
if [ -f /root/shell/aaa.txt ]
then
echo "存在"
fi
執(zhí)行結(jié)果如下:
五、流程控制
1. if 語句
if 語句的基本語法如下,需要注意 [ 條件判斷式?] 中括號與判斷式之間必須有空格。
#單分支
if [ 條件判斷式 ]
then
代碼
fi
#多分支
if [ 條件判斷式 ]
then
代碼
elif [ 條件判斷式 ]
then
代碼
fi
案例:編寫一個 shell 程序,如果輸入的參數(shù)大于等于 60,輸出“及格”,小于 60 則輸出“不及格”。
#!/bin/bash
if [ $1 -ge 60 ]
then
echo "及格"
elif [ $1 -le 60 ]
then
echo "不及格"
fi
運行時帶參數(shù)結(jié)果如下;
2. case 語句
基本語法如下,其中 * 代表都不是以上的值。
case $變量名 in
"值1")
如果變量的值等于1,則執(zhí)行程序1
;;
"值2")
如果變量的值等于2,則執(zhí)行程序2
;;
......
*)
如果變量的值都不是以上的值,則執(zhí)行此程序
;;
esac
案例:編寫 Shell 程序當(dāng)命令行參數(shù)為 1 時輸出“周一”,是 2 時輸出“周二”,其他情況均輸出“other”。
#!/bin/bash
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac
運行結(jié)果如下:
3. for 循環(huán)
for 循環(huán)有兩個基本語法,語法一:
for 變量 in 值1 值2 值3...
do
程序
done
案例1:打印命令行輸入的參數(shù);
#!/bin/bash
#使用$*
for i in "$*"
do
echo "num is $i"
done
#使用$@
for i in "$@"
do
echo "num is $i"
done
運行結(jié)果如下,這也印證了 $*(將所有參數(shù)看成一個整體)?和 $@(將參數(shù)區(qū)別對待) 的區(qū)別;
除此之外 for 循環(huán)還有第二個語法;
for((初始值;循環(huán)控制條件;變量變化))
do
程序
done
案例2:輸出從 1 加到 100 的值。
#!/bin/bash
sum=0
for(( i=1;i<=100;i++ ))
do
sum=$[$sum+$i]
done
echo "SUM=$sum"
運行結(jié)果如下:
4. while 循環(huán)
基本語法:
while [ 條件判斷式 ]
do
程序
done
案例:命令行輸入一個參數(shù) n,計算 1+2+..+n 的值;
#/bin/bash
sum=0
i=0
while [ $i -le $1 ] #只要第i個數(shù)小于我們輸入的參數(shù),就執(zhí)行循環(huán)
do
sum=$[$sum+$i]
i=$[$i+1] #i自增
done
echo "SUM=$SUM"
運行結(jié)果如下:
六、read 讀取控制臺輸入
在我們進(jìn)行 Shell 編程的時候,有時候也需要跟控制臺進(jìn)行交互,比如用戶動態(tài)的輸入一些數(shù)據(jù),這個時候就需要用到 read?;菊Z法為
read(選項)(參數(shù))
- -p 制定讀取值時的提示符
- -t 指定讀取值時的等待時間,如果沒有在規(guī)定時間內(nèi)輸入,則不再等待
案例 1:讀取控制臺輸入一個 num 值;
#!/bin/bash
read -p "輸入num1=:" num1
echo "你輸入的num1為:$num1"
運行結(jié)果如下:
案例 2:讀取控制臺輸入一個 num 值,指定在 10 秒內(nèi)輸入;
read -t 10 -p "輸入num2=" num2
echo "你輸入的num2為:$num2"
運行結(jié)果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-777049.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-777049.html
到了這里,關(guān)于Linux【實操篇】—— Shell 編程入門、變量、運算符、條件判斷、流程控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!