你该认识这样的Linux_shell之变量操作符与分支判断
? ? ? ? ? ? ? ? ? ? ? ? ? ? Linux shell之變量與操作符
聲明與簡(jiǎn)介
Shell是系統(tǒng)的用戶(hù)界面,它提供了用戶(hù)跟內(nèi)核進(jìn)行交互的橋梁。Shell是一個(gè)命令解釋器,它接收用戶(hù)輸入的命令并送到內(nèi)核去執(zhí)行。
本文主要介紹圍繞Shell的變量、參數(shù)、操作符、分支循環(huán)來(lái)展開(kāi),主要介紹變量的定義、使用;參數(shù)的使用、常見(jiàn)的操作符、分支與循環(huán)的常見(jiàn)使用方法。
注: 至少有一臺(tái)linux環(huán)境,當(dāng)前驗(yàn)證環(huán)境是Centos 8。
Linux 各Shell版本示例定義變量
這里的變量區(qū)別于系統(tǒng)變量,是用戶(hù)根據(jù)業(yè)務(wù)需要自定義的變量。
使用自定義變量
#!/bin/sh echo "It is a test" name="Hi Shell" name2 = "兩邊都有空格" name3 ="僅左邊有空格" echo $name echo $name2 echo $name3#注:1 定義變量并賦值時(shí)“=”兩邊都不能有空格,否則會(huì)報(bào)錯(cuò),且變量值取不到。定義數(shù)組
變量只能存一個(gè)值,而數(shù)組可以存多個(gè)值。
# 1 定義個(gè)數(shù)組并安裝索引打印、打印所有元素。 #!/bin/bash echo "It is a test" arraydemo=("Hi" There Shell array) echo ${arraydemo[2]} echo ${arraydemo[*]}#結(jié)果 It is a test Shell Hi There Shell array#注:索引序號(hào)從0開(kāi)始。# 2 通過(guò)unset移除數(shù)組元素 #!/bin/bash echo "It is a test" arraydemo=("Hi" There Shell array) unset arraydemo[2] echo ${arraydemo[0]} echo ${arraydemo[*]}#結(jié)果 It is a test Hi Hi There array命令變量
如果變量對(duì)應(yīng)是某個(gè)命令,可以通過(guò)$結(jié)合“( )”來(lái)引用。也可以通過(guò)“` `”來(lái)引用。
# 取當(dāng)前腳本的目錄,并賦值給變量后打印出來(lái)。#Way1 $結(jié)合“( )”,類(lèi)似于執(zhí)行命令。#!/bin/bash echo "It is a test" curr_dir=$(pwd) echo $curr_dir#Way2 ``號(hào),類(lèi)似于執(zhí)行命令。#!/bin/bash curr_dir=`pwd` echo $curr_dir#結(jié)果 /home/shenliang使用系統(tǒng)變量
系統(tǒng)變量系統(tǒng)級(jí)的環(huán)境變量,一般定義在/etc/profile、~/.bash_profile、~/.bash_rc內(nèi)。
#打印當(dāng)前JDK主目錄 printenv JAVA_HOME #結(jié)果 /home/shenliang/software/jdk1.8.0_161變量范圍
Shell的變量不僅可以作用于當(dāng)前腳本,還可以被其它腳本引用。
# 1如果想一個(gè)shell腳本里的變量被另外個(gè)shell腳本調(diào)用,則需要加export關(guān)鍵字。 # script1.sh的內(nèi)容 #!/bin/bash var="我在腳本1里" export var ./script2.sh# script2.sh的內(nèi)容 #!/bin/bash echo $var# 執(zhí)行script1.sh后的結(jié)果 # ./script1.sh 我在腳本1里# 2 如果在script2.sh里修改同名變量的值,則此時(shí)打印的為script2.sh里的值。 # script2.sh的內(nèi)容 #!/bin/bash var="我在腳本2里" echo $var# 執(zhí)行script1.sh后的結(jié)果 # ./script1.sh 我在腳本2里參數(shù)
參數(shù)是shell腳本接受的外部傳遞的值,即可實(shí)現(xiàn)腳本或者函數(shù)的動(dòng)態(tài)調(diào)用。
參數(shù)類(lèi)型
# 通過(guò)參數(shù)傳遞給腳本調(diào)用。 #!/bin/bash echo "當(dāng)前執(zhí)行的文件是: $0,$1,$2" echo "Hello $*" echo "$#" exit 0#執(zhí)行 ./shell_case1.sh "參數(shù)1" "參數(shù)2"#結(jié)果 當(dāng)前執(zhí)行的文件是: ./shell_case1.sh,參數(shù)1,參數(shù)2 Hello 參數(shù)1 參數(shù)2 2注:1 其中$0參數(shù)代表當(dāng)前文件 2 $1…$10代表shell可接受的參數(shù) 3 $* 對(duì)應(yīng)所有參數(shù)的值 4 $# 對(duì)應(yīng)參數(shù)的個(gè)數(shù),比如對(duì)應(yīng)上例為2。分支判斷
且與或控制多命令執(zhí)行
多個(gè)命令合并執(zhí)行時(shí),通過(guò)&&(且)或者||(或)來(lái)控制整個(gè)命令的執(zhí)行。
且&&連接多命令
# 用&&將ls命令和date命令結(jié)合在一起,如果ls命令執(zhí)行有結(jié)果,則執(zhí)行date命令,反之不執(zhí)行。 ls -a | grep label && date +'%Y-%m-%d' #結(jié)果 label.sed 2021-06-09#如果第一命令沒(méi)結(jié)果,比如grep后的關(guān)鍵字修改成label2,那么第二個(gè)命令,也就是date將不再執(zhí)行。ls -a | grep label2 && date +'%Y-%m-%d'或||連接多命令
#用||將ls命令和date命令結(jié)合在一起,如果ls命令執(zhí)行無(wú)結(jié)果(返回為False),則執(zhí)行date命令。 ls -a | grep label2 || date +'%Y-%m-%d' #結(jié)果 2021-06-09test命令判斷數(shù)字字符串文件
test命令用于檢驗(yàn)?zāi)硞€(gè)條件是否滿(mǎn)足,一般用于數(shù)字、字符串、文件的條件判斷。
數(shù)值類(lèi)型比較
# 數(shù)字類(lèi)型比較,這里用eq(等號(hào))演示。 #!/bin/bash num1=13 num2=23 if test $num1 -eq $num2 then echo "兩數(shù)相等" else echo "兩數(shù)不等" fi# 結(jié)果 兩數(shù)不等注:比較符號(hào)匯總,-eq (相等)、-ne(不等于)、-gt(大于)、-ge(大于等于)、-lt(小于)、-le(小于等于)。字符串類(lèi)型比較
# 字符串類(lèi)型比較,這里用n(等號(hào))演示。#!/bin/bash str1="Hello" if test -n $str1 then echo "字符串長(zhǎng)度大于0" else echo "空字符串" fi#結(jié)果 字符串長(zhǎng)度大于0注:字符串比較匯總,=(相等)、!=(不等)、-z(空字符串時(shí)為真)、-n(字符串長(zhǎng)度大于0時(shí)為真)。文件比較
# 文件判斷,這里用e(存在)演示。#!/bin/bash if test -e $1 then echo "文件$1存在" else echo "文件$1不存在" fi# case1 ./shell_case1.sh shell_case1.sh #結(jié)果 文件shell_case1.sh存在#case2 ./shell_case1.sh shell_case12.sh #結(jié)果 文件shell_case12.sh不存在注:文件判斷符號(hào)匯總: -e(存在)、-r(存在且可讀)、-w(存在且可寫(xiě))、-x(存在且可執(zhí)行)、-s(存在且至少有一個(gè)字符)、-d(目錄存在)、-f(文件存在且是普通文件)、-c(文件存在且是字符特殊類(lèi)型文件)、-b(文件存在且是塊文件)。多條件組合
# test多條件的連接#!/bin/bash if test -s $1 -a 34 -gl 24 then echo "文件$1有內(nèi)容" else echo "文件$1無(wú)內(nèi)容" fi#結(jié)果 文件nothing.txt無(wú)內(nèi)容注: 1 這里nothing.txt是事先touch出來(lái)的空文件。2 多條件組合,可以通過(guò)-a(and)且、-o(or)或、!(not)非,其中!優(yōu)先級(jí)最高,-o最低。if 條件判斷語(yǔ)句
單if判斷
# 僅含if then的判斷語(yǔ)句, 如果參數(shù)1大于參數(shù)2則輸出結(jié)果 if [ $1 -gt $2 ]; then echo "數(shù)$1大于$2" fi#執(zhí)行 ./shell_case1.sh 34 12#結(jié)果 數(shù)34大于12if else 判斷
# 含if else的判斷語(yǔ)句,如果參數(shù)1大于參數(shù)2輸出結(jié)果1,反之輸出結(jié)果2。 #!/bin/bash if [ $1 -gt $2 ]; then echo "數(shù)$1大于$2" else echo "數(shù)$1小于$2" fi#執(zhí)行 ./shell_case1.sh 12 34#結(jié)果 數(shù)12小于34if elif多條件
# 通過(guò)elif then實(shí)現(xiàn)多分支判斷。 #!/bin/bash if [ $1 -gt 30 ]; then echo "數(shù)$1大于30" elif [ $1 -gt 20 ]; then echo "數(shù)$1大于20" elif [ $1 -gt 10 ]; then echo "數(shù)$1大于10" else echo "數(shù)$1小于10" fi# 執(zhí)行 ./shell_case1.sh 32 數(shù)32大于30 ./shell_case1.sh 22 數(shù)22大于20 ./shell_case1.sh 12 數(shù)12大于10 ./shell_case1.sh 2 數(shù)2小于10case條件判斷語(yǔ)句
使用case進(jìn)行判斷
#!/bin/bash case $1 in [A-B]) echo "成績(jī)優(yōu)異,級(jí)別是$1";; [C-D]) echo "成績(jī)中等,級(jí)別是$1";; [E-F]) echo "成績(jī)偏下,級(jí)別是$1";; *) echo "成績(jī)?cè)愀?#34;;; esac#執(zhí)行 ./shell_case1.sh "A" 成績(jī)優(yōu)異,級(jí)別是A ./shell_case1.sh "C" 成績(jī)中等,級(jí)別是C ./shell_case1.sh "E" 成績(jī)偏下,級(jí)別是E ./shell_case1.sh "G" 成績(jī)?cè)愀?./shell_case1.sh "H" 成績(jī)?cè)愀庾?#xff1a;1 這里的case和esac是一對(duì)關(guān)鍵字。 2 case1) 對(duì)應(yīng)某個(gè)分支判斷, 3 每個(gè);;前是具體的執(zhí)行語(yǔ)句。 4 *) 類(lèi)似于If的else,即其它情況。 與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的你该认识这样的Linux_shell之变量操作符与分支判断的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 打开高效文本编辑之门_Linux awk
- 下一篇: 汽车跑偏的原因及解决方法?