Linux入門(mén):一文幫你搞定shell編程!
六、腳本與用戶交互 操作命令行參數(shù)
1. 讀取參數(shù)
bash shell用位置參數(shù)變量(positional parameter)存儲(chǔ)命令行輸入的所有參數(shù),包括程序名。其中,表示程序名,1表示第1個(gè)參數(shù),表示第個(gè)參數(shù),,9表示第9個(gè)參數(shù)。如果參數(shù)個(gè)數(shù)多于9個(gè),必須如下表示變量:,{11},...
#!/bin/bash
# author:一口Linux
for((count = 1; count <= $1; count++))
do
echo The number is $count.
done
執(zhí)行結(jié)果:

修改腳本如下:
echo $1, $2, $3, $4
執(zhí)行結(jié)果如下:

2 讀取程序名
首先想到的是利用,但是0獲取的文件名包括./以及路徑等前綴信息,如下:
echo The command entered is: $0
# 運(yùn)行:./
# 輸出:The command entered is: ./14.sh
如果想僅得到文件名,而不包含./,可以使用basename命令:
name=`basename $0`
echo The command entered is: $name
# 運(yùn)行:./
# 輸出:The command entered is: 14.sh
3 特殊變量$#表示命令行參數(shù)的個(gè)數(shù):
#!/bin/bash
# author:一口Linux
params=$#
echo The number of params is: $params
for((i = 1; i <= params; i++))
do
echo The param is: $i
done
執(zhí)行結(jié)果

如果想獲取所有的參數(shù),當(dāng)然可以利用#和循環(huán)逐個(gè)遍歷。也可以利用如下兩個(gè)特殊變量:*將所有的命令行參數(shù)看作一個(gè)整體存儲(chǔ),而$@將命令行中以空格間隔的參數(shù)單獨(dú)存儲(chǔ),如下:
#!/bin/bash
# author:一口Linux
count=1
for param in "$*"
do
echo "$* parameter $count = $param"
count=$[ $count + 1 ]
done
count=1
for param in "$@"
do
echo "$@ parameter $count = $param"
count=$[ $count + 1 ]
done

4 基本的讀取
read命令接受從鍵盤(pán)或文件描述符中的輸入數(shù)據(jù),將其存儲(chǔ)到一個(gè)指定變量中。
選項(xiàng):
-p:指定讀取值時(shí)的提示符;
-t:指定讀取值時(shí)等待的時(shí)間(秒),如果沒(méi)有在指定的時(shí)間內(nèi)輸入,就不再等待了。。
-n:設(shè)置允許輸入字符的個(gè)數(shù)
參數(shù)
變量:指定讀取值的變量名
操作詳解
例1#!/bin/bash
# author:一口Linux
# testing the read option
read -p "Please enter your name: " name
echo "Hello $name."
執(zhí)行結(jié)果

例2read命令中,可以根據(jù)需要將輸入的數(shù)據(jù)保存在多個(gè)變量中,如果指定的變量比較少,那么最后一個(gè)變量將包含余下的所有輸入,如下所示:#!/bin/bash
# author:一口Linux
# testing the read option
read -p "Enter the values: " val1 val2 val3
echo "$val1"
echo "$val2"
echo "$val3"
執(zhí)行結(jié)果:

綜合例子提示用戶輸入一個(gè)正整數(shù)num,然后計(jì)算1+2+3+...+num的值;必須對(duì)num是否為正整數(shù)做判斷,不符合應(yīng)當(dāng)運(yùn)行再次輸入
思路:
expr只能對(duì)整數(shù)進(jìn)行計(jì)算,直接用expr 和一個(gè)整數(shù)計(jì)算獲取 $? 的值來(lái)判斷是否為整數(shù)在使用 expr $num1 > 0 判斷是否大于0#!/bin/bash
# author:一口Linux
while true
do
read -p "please input a positive number: " num
# 判斷數(shù)是否是整數(shù)
expr $num + 1 &> /dev/null
if [ $? -eq 0 ];then
# 判斷這個(gè)整數(shù)是否大于0,大于0返回1
if [ `expr $num > 0` -eq 1 ];then
#echo "yes,positive number"
# $sum沒(méi)有賦值,默認(rèn)為0
for i in `seq 0 $num`
do
sum=`expr $sum + $i`
done
echo "1+2+3+...+$num = $sum"
# 執(zhí)行計(jì)算需要退出
exit
fi
fi
echo "error,input enlegal"
continue
done
測(cè)試:

七、關(guān)系運(yùn)算符
有時(shí)候我們需要比較兩個(gè)數(shù)字的大小關(guān)系,這時(shí)候就要用到關(guān)系運(yùn)算符。關(guān)系運(yùn)算符只支持?jǐn)?shù)值運(yùn)算,不支持字符運(yùn)算。
1. 知識(shí)點(diǎn)詳解
Shell 語(yǔ)言支持下面這些關(guān)系運(yùn)算符:
-eq:檢測(cè)兩個(gè)數(shù)是否相等,相等返回 true。
-ne:檢測(cè)兩個(gè)數(shù)是否不相等,相等返回 true。
-gt:檢測(cè)左邊的數(shù)是否大于右邊的,如果是返回 true。
-lt:檢測(cè)左邊的數(shù)是否小于右邊的,如果是返回 true。
-ge:檢測(cè)左邊的數(shù)是否大于等于右邊的,如果是返回 true。
-le:檢測(cè)左邊的數(shù)是否小于等于右邊的,如果是返回 true。
2. 操作詳解#!/bin/bash
# author:一口Linux
a=10
b=20
if [ $a -gt $b ]
then
echo "a great than b"
else
echo "a not great than b"
fi
執(zhí)行結(jié)果!如下:
八、字符串運(yùn)算符
1. 知識(shí)點(diǎn)詳解= 比較兩個(gè)字符串是否相等
!= 比較兩個(gè)字符串是否不相等
-z 檢測(cè)字符串的長(zhǎng)度是否為零
-n 檢測(cè)字符串的長(zhǎng)度是否不為零
$字符名 變量是否有負(fù)值(為空),有返回True,沒(méi)有返回False
2. 操作詳解#!/bin/bash
# author:一口Linux
###本腳本主要用于字符串運(yùn)算符
if [ ! $1 ]
then
echo "第一個(gè)參數(shù)為空"
echo "****************************************************************"
echo "****************************************************************"
echo "**************執(zhí)行用例的格式為:sh $0 變量1 變量2***************"
echo "****************************************************************"
echo "****************************************************************"
break
else
if [ ! $2 ]
then
echo "第二個(gè)參數(shù)為空"
echo "****************************************************************"
echo "****************************************************************"
echo "**************執(zhí)行用例的格式為:sh $0 變量1 變量2***************"
echo "****************************************************************"
echo "****************************************************************"
break
else
###1、檢測(cè)兩個(gè)字符串是否相等;
if [ $1 = $2 ]
then
echo "這是第一個(gè)判斷語(yǔ)句"
echo "變量1等于變量2"
else
echo "這是第一個(gè)判斷語(yǔ)句"
echo "變量1不等于變量2"
fi
###2、檢測(cè)兩個(gè)字符串是否不相等;
if [ $1 != $2 ]
then
echo "這是第二個(gè)判斷語(yǔ)句"
echo "變量1不等于變量2"
else
echo "這是第二個(gè)判斷語(yǔ)句"
echo "便量1等于變量2"
fi
###3、檢測(cè)字符串長(zhǎng)度是否為0
if [ -z $1 ]
then
echo "這是第三個(gè)判斷段語(yǔ)句"
echo "變量1字符串長(zhǎng)度為0"
else
echo "這是第三個(gè)判斷段語(yǔ)句"
echo $1
fi
###4、檢測(cè)字符串長(zhǎng)度是否不為0
if [ -n $2 ]
then
echo "這是第四個(gè)判斷語(yǔ)句"
echo "變量2字符串長(zhǎng)度不為0"
echo $2
else
echo "這是第四個(gè)判斷語(yǔ)句"
echo "變量2字符串長(zhǎng)度為0"
fi
###5、檢測(cè)字符串是否不為空
if [ $1 ]
then
echo "這是第五個(gè)判斷語(yǔ)句"
echo "變量1不為空"
else
echo "這是第五個(gè)判斷語(yǔ)句"
echo "變量1為空"
fi
fi
fi
測(cè)試結(jié)果:

九、shell文件及目錄常用操作的幾個(gè)實(shí)例
提取路徑的目錄和文件名提取目錄:dirname $path
提取文件名:
basename $path
批量重命名帶有空格文件function processFilePathWithSpace(){
find $1 -name "* *" | while read line
do
newFile=`echo $line | sed 's/[ ][ ]_/g'`
mv "$line" $newFile
logInfo "mv $line $newFile $?"
done
}
遍歷文件內(nèi)容cat /tmp/text.txt | while read line
do
echo $line
done
文件不存在,則創(chuàng)建文件[ -f $logFile ] || touch $logFile
遞歸遍歷目錄function getFile(){
for file in `l(xiāng)s $1`
do
element=$1"/"$file
if [ -d $element ]
then
getFile $element
else
echo $element
fi
done
}
清空文件內(nèi)容cat /dev/null > $filePath
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
圖片新聞
-

OpenAI發(fā)布的AI瀏覽器,市場(chǎng)為何反應(yīng)強(qiáng)烈?
-

馬云重返一線督戰(zhàn),阿里重啟創(chuàng)始人模式
-

機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹(shù)機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-

存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬(wàn)
-

長(zhǎng)安汽車(chē)母公司突然更名:從“中國(guó)長(zhǎng)安”到“辰致科技”
-

豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-

字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
-

員工持股爆雷?廣汽埃安緊急回應(yīng)
最新活動(dòng)更多
-
11月7日立即參評(píng)>> 【評(píng)選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評(píng)選
-
11月20日立即報(bào)名>> 【免費(fèi)下載】RISC-V芯片發(fā)展現(xiàn)狀與測(cè)試挑戰(zhàn)-白皮書(shū)
-
即日-11.25立即下載>>> 費(fèi)斯托白皮書(shū)《柔性:汽車(chē)生產(chǎn)未來(lái)的關(guān)鍵》
-
11月27日立即報(bào)名>> 【工程師系列】汽車(chē)電子技術(shù)在線大會(huì)
-
11月28日立即下載>> 【白皮書(shū)】精準(zhǔn)洞察 無(wú)線掌控——283FC智能自檢萬(wàn)用表
-
12月18日立即報(bào)名>> 【線下會(huì)議】OFweek 2025(第十屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專題
- 1 特斯拉工人被故障機(jī)器人打成重傷,索賠3.6億
- 2 AI 時(shí)代,阿里云想當(dāng)“安卓” ,那誰(shuí)是“蘋(píng)果”?
- 3 拐點(diǎn)已至!匯川領(lǐng)跑工控、埃斯頓份額第一、新時(shí)達(dá)海爾賦能扭虧為盈
- 4 L3自動(dòng)駕駛延期,逼出車(chē)企技術(shù)自我淘汰
- 5 隱退4年后,張一鳴久違現(xiàn)身!互聯(lián)網(wǎng)大佬正集體殺回
- 6 機(jī)器人9月大事件|3家國(guó)產(chǎn)機(jī)器人沖刺IPO,行業(yè)交付與融資再創(chuàng)新高!
- 7 谷歌“香蕉”爆火啟示:國(guó)產(chǎn)垂類AI的危機(jī)還是轉(zhuǎn)機(jī)?
- 8 7倍機(jī)器人大牛股:高管股東套現(xiàn)VS機(jī)構(gòu)兇猛抱團(tuán),該信誰(shuí)?
- 9 八部門(mén)聯(lián)手放行L3自動(dòng)駕駛!巨頭開(kāi)始拼搶萬(wàn)億市場(chǎng)?
- 10 OpenAI發(fā)布的AI瀏覽器,市場(chǎng)為何反應(yīng)強(qiáng)烈?
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷(xiāo)售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷(xiāo)售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門(mén)市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市


分享





