超適合小白!Linux 之 shell 編程入門
來源:整理自網(wǎng)絡(luò)素材
一、變量的運用
1. 變量命名
界說變量時,變量名不加美元符號($,PHP言語中變量需求),如:
your_name="yikoulinux"
留神,變量名和等號之間不能有空格,這或許和你了解的悉數(shù)編程言語都不相同。一同,變量名的命名須遵從如下規(guī)矩:
命名只能運用英文字母,數(shù)字和下劃線,首個字符不能以數(shù)字開端。
中心不能有空格,能夠運用下劃線(_)。
不能運用標(biāo)點符號。
不能運用bash里的要害字(可用help指令檢查保存要害字)。
變量稱謂一般習(xí)氣為大寫
有用的 Shell 變量名示例如下:
RUNOOB
LD_LIBRARY_PATH
_var
var2
無效的變量命名:
?var=123
user*name=runoob
2. 常用變量
Linux Shell 中的變量分為:體系變量和用戶自界說變量。
體系變量:HOME、HOME、HOME、PWD、SHELL、SHELL、SHELL、USER 等等比方:echo $HOME 等等..
用戶自界說變量:
界說變量:變量=值
2)顯現(xiàn)當(dāng)時 shell 中悉數(shù)變量:set
3)吊銷變量:unset 變量
4) 聲明靜態(tài)變量:readonly 變量,留神:不能 unset
將指令的回來值賦給變量(要害)
除了顯式地直接賦值,還能夠用句子給變量賦值,如:
1)
A=ls -la
反引號,作業(yè)里邊的指令,并把作用回來給變量 A
2)
A=$(ls -la)
$等價于反引號
3)
for file in `ls /etc`
或
for file in $(ls /etc)
以上句子將 /etc 下目錄的文件名循環(huán)出來。
3. 舉例
例1:
意義如下:
界說一個變量名為name的變量,值為一口linux
輸出變量name的值
界說一個變量名為number的變量,初始值為22
輸出變量number的值
直接輸出帶變量的字符串
運用雙引號輸出帶變量的字符串
運用單引號輸出帶變量的字符串
運用雙引號輸出帶不存在的變量的字符串,不存在的變量默許為空
運用雙引號來聲明字符串中的變量
運用大括號{&變量名},聲明字符串中的變量
留神:
上述變量是暫時變量,當(dāng)關(guān)閉終端后,變量就會消失。
例2:
刪去變量并檢查指定變量
unset name 刪去變量name
檢查name變量
二、字符串的操作
在做shell批處理程序時分,經(jīng)常會涉及到字符串相關(guān)操作。有許多指令句子,如:awk,sed都能夠做字符串各種操作。
其實shell內(nèi)置一系列操作符號,能夠抵達(dá)相似作用,我們知道,運用內(nèi)部操作符會省掉主張外部程序等時刻,因而速度會非常的快。
1. 字符串操作(長度,讀取,替換)
| 表達(dá)式 | 意義 |
|---|---|
| ${#string} | $string的長度 |
| ${string:position} | 在 $string中, 從方位$position開端提取子串 |
| ${string:position:length} | 在$string中, 從方位$position開端提取長度為$length的子串 |
| ${string#substring} | 從變量$string的開端, 刪去最短匹配$substring的子串 |
| ${string##substring} | 從變量$string的開端, 刪去最長匹配$substring的子串 |
| ${string%substring} | 從變量$string的完畢, 刪去最短匹配$substring的子串 |
| ${string%%substring} | 從變量$string的完畢, 刪去最長匹配$substring的子串 |
| ${string/substring/replacement} | 運用$replacement, 來替代榜首個匹配的$substring |
| ${string//substring/replacement} | 運用$replacement, 替代悉數(shù)匹配的$substring |
| ${string/#substring/replacement} | 假定$string的前綴匹配$substring, 那么就用$replacement來替代匹配到的$substring |
| ${string/%substring/replacement} | 假定$string的后綴匹配$substring, 那么就用$replacement來替代匹配到的$substring |
闡明:”* $substring”能夠是一個正則表達(dá)式.
2. 字符串操作舉例
a)?核算字符串長度
root@ubuntu:/home/peng# test='I love china'
root@ubuntu:/home/peng# echo ${#test}
12

${#變量名}得到字符串長度
b) 截取字串
root@ubuntu:/home/peng# test='I love china'
root@ubuntu:/home/peng# echo ${test:5}
e china
root@ubuntu:/home/peng# echo ${test:5:10}
e china
root@ubuntu:/home/peng#
root@ubuntu:/home/peng# echo ${test:4:10}
ve china

${變量名:開端:長度}得到子字符串
c) 字符串刪去
root@ubuntu:/home/peng# test='c:/windows/boot.ini'
root@ubuntu:/home/peng# echo ${test#/}
c:/windows/boot.ini
root@ubuntu:/home/peng# echo ${test#*/}
windows/boot.ini
root@ubuntu:/home/peng# echo ${test##*/}
boot.ini
root@ubuntu:/home/peng# echo ${test%/*}
c:/windows
root@ubuntu:/home/peng# echo ${test%%/*}
c:

${變量名#substring正則表達(dá)式}從字符串開端開端配備substring,刪去匹配上的表達(dá)式。
${變量名%substring正則表達(dá)式}從字符串完畢開端配備substring,刪去匹配上的表達(dá)式。
留神:
${test##*/},${test%/*} 分別是得到文件名,或許目錄地址最簡略辦法。
d) 字符串替換
root@ubuntu:/home/peng# test='c:/windows/boot.ini'
root@ubuntu:/home/peng# echo ${test///}
c:windows/boot.ini
root@ubuntu:/home/peng# echo ${test////}
c:windowsboot.ini

${變量/查找/替換值} 一個“/”標(biāo)明替換榜首個,”//”標(biāo)明替換悉數(shù),當(dāng)查找中出現(xiàn)了:”/”請加轉(zhuǎn)義符”/”標(biāo)明。
留神:
字符串的方位是從0開端,-1標(biāo)明該字符串畢竟一個方位;
截取字符串的時分,是左閉右開的,從左面的方位開端,一直到右邊的方位完畢,不包括右邊的方位。
三、 腳本的創(chuàng)建和實施
shell腳本并不能作為正式的編程言語,因為它是在Linux的shell中作業(yè)的,所以稱他為shell腳本。
事實上,shell腳本就是一些指令的集結(jié)。
我們一般把悉數(shù)的操作都記錄到一個文檔中,然后去調(diào)用文檔中的指令,這樣一步操作就能夠完成了
一般shell腳本都是放在/usr/local/sbin的目錄下。
1) shell腳本的樹立
在linux體系中,shell腳本(bash shell程序)一般是在編輯器(如vi/vim)中編寫,由unix/linux指令、bash shell指令、程序結(jié)構(gòu)操控句子和注釋等內(nèi)容組成,舉薦用vim編輯器。
2) 腳本開端(榜首行)
一個規(guī)范的shell腳本的榜首行會指出由哪個程序(闡冥具)來實施腳本中的內(nèi)容,在linux bash編程中一般為:
#!/bin/bash
或
#!/bin/sh <==255個字符以內(nèi)
其間開端的”#!”又稱為幻數(shù),在實施bash腳本的時分,內(nèi)核會根據(jù)”#!”后的闡冥具來承認(rèn)該用哪個程序闡明腳本中的內(nèi)容,
留神:
這一行有必要在每個腳本頂端的榜首行,假定不是榜首行則為腳本注釋行,例如下面的比方。
root@ubuntu:/home/peng# cat test1.sh
#!/bin/bash
echo "scajy start"
#!/bin/bash <==寫到這兒就是注釋
#!/bin/sh
echo "scajy en:"
sh和bash的差異
root@ubuntu:/home/peng# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Sep 21 2015 /bin/sh -> bash
提示:sh為bash的軟聯(lián)接,這兒舉薦用標(biāo)準(zhǔn)寫法#!/bin/bash
Bash是GNU/Linux默許的shell,和Bourne shell (sh)兼容,Bash采用了Korn shell (Ksh)和C shell(csh)的特征。符合IEEE POISIX P10003.2/ISO 9945.2 shell and tools 標(biāo)準(zhǔn)。
Centos和redhat linux 下默許的shell 均為bash 因而,在寫shell腳本的時分,我們的腳本的開端也能夠不加#!/bin/bash。但假定當(dāng)時的shell非你默許的shell時,比方tcsh,那么久有必要要寫#!了。不然腳本文件就只能實施一些指令的集結(jié),不能夠運用shell內(nèi)建的指令了,主張讀者養(yǎng)成習(xí)氣,不管什么腳本最好都加上開端言語標(biāo)識,這在后文的shell編程標(biāo)準(zhǔn)中會再次提到。
假定腳本的開端不指定解析器,那么,就要用對應(yīng)的闡冥具來實施腳本。例如:bash test.sh
3) 腳本注釋
在shell腳本中,跟在(#)#號后邊的內(nèi)容標(biāo)明注釋,用來對腳本進(jìn)行注釋闡明,注釋部分不會被實施,僅僅是給人看的,注釋可自一行,也能夠跟在腳本指令后邊與指令在同一行,開發(fā)腳本時,假定沒有注釋,其他人就很難理解腳本畢竟在做什么,時刻長了自己也會忘掉。因而,我們要盡量成為所做的作業(yè)(腳本等)書寫注釋的習(xí)氣,不光是便當(dāng)他人,也是便當(dāng)自己。不然寫完一個腳本后或許后就記不起腳本的用處了,在從頭閱覽也會糟蹋許多名貴時刻。關(guān)于團(tuán)隊的協(xié)作也晦氣。
4) 舉例
創(chuàng)建文件first.sh,并復(fù)制如下信息到文件:
#cd usr/local/sbin
# vim first.sh
#! /bin/bash
##this is my first shell script
#wirten by 一口Linux 2021.5.3
date
echo "Hello world"
shell腳本一般以.sh為后綴名
實施腳本
以下幾種辦法都能夠:
#sh first.sh
#bash first.sh
#./first.sh
#./first.sh
會報權(quán)限不行
能夠:
#chmod +x first.sh
四、環(huán)境變量的運用
1. 知識點詳解
Linux Shell 中的變量分為:體系變量和用戶自界說變量。
體系變量:HOME、HOME、HOME、PWD、SHELL、SHELL、SHELL、USER 等等比方:echo $HOME 等等..
用戶自界說變量:
1) 界說變量:變量=值
2)顯現(xiàn)當(dāng)時 shell 中悉數(shù)變量:set
3)吊銷變量:unset 變量
4) 聲明靜態(tài)變量:readonly 變量,留神:不能 unset
界說變量的規(guī)矩
1) 變量稱謂能夠由字母、數(shù)字和下劃線組成,可是不能以數(shù)字開端。
2) 等號兩頭不能有空格
3) 變量稱謂一般習(xí)氣為大寫
將指令的回來值賦給變量(要害)
1)A=`ls -la` 反引號,作業(yè)里邊的指令,并把作用回來給變量 A
2)A=$(ls -la) 等價于反引號
設(shè)置環(huán)境變量的根本語法:
export 變量名=變量值 (功用描繪:將 shell 變量輸出為環(huán)境變量)
source 配備文件(功用描繪:讓修改后的配備信息立即收效)
echo $變量名(功用描繪:查詢環(huán)境變量的值)
2. 操作詳解
檢查環(huán)境變量HOME、PATH的值:
root@ubuntu:/home/peng# echo $HOME
/root
root@ubuntu:/home/peng# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/peng/toolchain/gcc-4.6.4/bin:/home/peng/toolchain/arm-cortex_a8/bin
檢查windows體系中的環(huán)境變量
檢查環(huán)境變量PATH中悉數(shù)的途徑
腳本途徑設(shè)備舉例
辦法1:
修改環(huán)境環(huán)境變量:在PATH中增加指定“軟件設(shè)備”的目錄:
root@ubuntu:/home/peng/yikou# pwd
/home/peng/yikou
root@ubuntu:/home/peng/yikou# ls
a.sh
root@ubuntu:/home/peng/yikou# sh a.sh
Sun May 2 17:00:14 PDT 2021
Hello world
root@ubuntu:/home/peng/yikou# export PATH=$PATH:/home/peng/yikou/
root@ubuntu:/home/peng/yikou# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/peng/toolchain/gcc-4.6.4/bin:/home/peng/toolchain/arm-cortex_a8/bin:/home/peng/yikou/
root@ubuntu:/home/peng/yikou# a.sh
bash: /home/peng/yikou/a.sh: 權(quán)限不行
root@ubuntu:/home/peng/yikou# chmod 777 a.sh
root@ubuntu:/home/peng/yikou# a.sh
Sun May 2 17:01:34 PDT 2021
Hello world

辦法2:
修改環(huán)境變量配備文件的辦法,使修改后的環(huán)境變量永久收效
vim /etc/bash.bashrc

source .bash.rc ,使配備文件從頭收效
關(guān)閉終端,翻開并從頭從頭輸入:a.sh依舊能夠?qū)嵤?/span>
root@ubuntu:/home/peng/# a.sh
Sun May 2 17:10:00 PDT 2021
Hello world
五、數(shù)學(xué)運算
1. 知識點詳解
運算符運用的語法:
expr操作符對照表
操作符意義
2. 操作詳解
比較大小,只能對整數(shù)進(jìn)行比較,需求加空格,linux 保存要害字要轉(zhuǎn)義
root@ubuntu:/home/peng/yikou# num1=30
root@ubuntu:/home/peng/yikou# num2=50
root@ubuntu:/home/peng/yikou# expr $num1 > $num2

檢查上一條指令有沒有實施成功:![]()
回來0 成功,其他失利
小于、小于等于、大于等于
expr $num1 < $num2
expr $num1 <= $num2
expr $num1 >= $num2

運算 加、減、乘、除
# 加
num1=17
num2=5
expr $num1 + $num2
# 減
num3=`expr $num1 + $num2`
echo $num3
expr $num1 - $num2
# 乘
expr $num1 * $num2
expr $num1 / $num2
# 取余數(shù)
expr $num1 % $num2

需求留神事項:
兩個小括號的核算辦法,要賦值,不然會報錯![]()
六、腳本與用戶交互
操作指令行參數(shù)
1. 讀取參數(shù)
bash shell用方位參數(shù)變量(positional parameter)存儲指令行輸入的悉數(shù)參數(shù),包括程序名。
其間,0標(biāo)明程序名,0標(biāo)明程序名,0表示程序名,1標(biāo)明第1個參數(shù),2標(biāo)明第2個參數(shù),…,2標(biāo)明第2個參數(shù),…,2表示第2個參數(shù),...,9標(biāo)明第9個參數(shù)。假定參數(shù)個數(shù)多于9個,有必要如下標(biāo)明變量:10,{10},10,{11},…
#!/bin/bash
# author:一口Linux
for((count = 1; count <= $1; count++))
do
echo The number is $count.
done
實施作用:

修改腳本如下:
echo $1, $2, $3, $4
實施作用如下:
2 讀取程序名
首要想到的是運用0,可是0,可是0,但是0獲取的文件名包括./以及途徑等前綴信息,如下:
echo The command entered is: $0
# 作業(yè):./
# 輸出:The command entered is: ./14.sh
假定想僅得到文件名,而不包括./,能夠運用basename指令:
name=`basename $0`
echo The command entered is: $name
# 作業(yè):./
# 輸出:The command entered is: 14.sh
3 特別變量
$#標(biāo)明指令行參數(shù)的個數(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
實施作用

假定想獲取悉數(shù)的參數(shù),當(dāng)然能夠運用#和循環(huán)逐個遍歷。也能夠運用如下兩個特別變量:*將悉數(shù)的指令行參數(shù)看作一個整體存儲,而$@將指令行中以空格距離的參數(shù)單獨存儲,如下:
#!/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指令承受從鍵盤或文件描繪符中的輸入數(shù)據(jù),將其存儲到一個指定變量中。
選項:
-p:指定讀取值時的提示符;
-t:指定讀取值時等候的時刻(秒),假定沒有在指定的時刻內(nèi)輸入,就不再等候了。。
-n:設(shè)置答應(yīng)輸入字符的個數(shù)
參數(shù)
變量:指定讀取值的變量名
操作詳解
例1
#!/bin/bash
# author:一口Linux
# testing the read option
read -p "Please enter your name: " name
echo "Hello $name."
實施作用
例2
read指令中,能夠根據(jù)需求將輸入的數(shù)據(jù)保存在多個變量中,假定指定的變量比較少,那么畢竟一個變量將包括余下的悉數(shù)輸入,如下所示:
#!/bin/bash
# author:一口Linux
# testing the read option
read -p "Enter the values: " val1 val2 val3
echo "$val1"
echo "$val2"
echo "$val3"
實施作用:
歸納比方
提示用戶輸入一個正整數(shù)num,然后核算1+2+3+…+num的值;有必要對num是否為正整數(shù)做判別,不符合應(yīng)當(dāng)作業(yè)再次輸入
思路:
expr只能對整數(shù)進(jìn)行核算,直接用expr 和一個整數(shù)核算獲取 $??的值來判別是否為整數(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
# 判別這個整數(shù)是否大于0,大于0回來1
if [ `expr $num > 0` -eq 1 ];then
#echo "yes,positive number"
# $sum沒有賦值,默許為0
for i in `seq 0 $num`
do
sum=`expr $sum + $i`
done
echo "1+2+3+...+$num = $sum"
# 實施核算需求退出
exit
fi
fi
echo "error,input enlegal"
continue
done
測驗:
七、聯(lián)絡(luò)運算符
有時分我們需求比較兩個數(shù)字的大小聯(lián)絡(luò),這時分就要用到聯(lián)絡(luò)運算符。聯(lián)絡(luò)運算符只支撐數(shù)值運算,不支撐字符運算。
1. 知識點詳解
Shell 言語支撐下面這些聯(lián)絡(luò)運算符:
-eq:檢測兩個數(shù)是否持平,持平回來 true。
-ne:檢測兩個數(shù)是否不持平,持平回來 true。
-gt:檢測左面的數(shù)是否大于右邊的,假定是回來 true。
-lt:檢測左面的數(shù)是否小于右邊的,假定是回來 true。
-ge:檢測左面的數(shù)是否大于等于右邊的,假定是回來 true。
-le:檢測左面的數(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
實施作用!如下:
八、字符串運算符
1. 知識點詳解
= 比較兩個字符串是否持平
!= 比較兩個字符串是否不持平
-z 檢測字符串的長度是否為零
-n 檢測字符串的長度是否不為零
$字符名 變量是否有負(fù)值(為空),有回來True,沒有回來False
2. 操作詳解
#!/bin/bash
# author:一口Linux
###本腳本首要用于字符串運算符
if [ ! $1 ]
then
echo "榜首個參數(shù)為空"
echo "****************************************************************"
echo "****************************************************************"
echo "**************實施用例的格式為:sh $0 變量1 變量2***************"
echo "****************************************************************"
echo "****************************************************************"
break
else
if [ ! $2 ]
then
echo "第二個參數(shù)為空"
echo "****************************************************************"
echo "****************************************************************"
echo "**************實施用例的格式為:sh $0 變量1 變量2***************"
echo "****************************************************************"
echo "****************************************************************"
break
else
###1、檢測兩個字符串是否持平;
if [ $1 = $2 ]
then
echo "這是榜首個判別句子"
echo "變量1等于變量2"
else
echo "這是榜首個判別語句"
echo "變量1不等于變量2"
fi
###2、檢測兩個字符串是否不持平;
if [ $1 != $2 ]
then
echo "這是第二個判別句子"
echo "變量1不等于變量2"
else
echo "這是第二個判別句子"
echo "便量1等于變量2"
fi
###3、檢測字符串長度是否為0
if [ -z $1 ]
then
echo "這是第三個判別段句子"
echo "變量1字符串長度為0"
else
echo "這是第三個判別段句子"
echo $1
fi
###4、檢測字符串長度是否不為0
if [ -n $2 ]
then
echo "這是第四個判別句子"
echo "變量2字符串長度不為0"
echo $2
else
echo "這是第四個判別句子"
echo "變量2字符串長度為0"
fi
###5、檢測字符串是否不為空
if [ $1 ]
then
echo "這是第五個判別句子"
echo "變量1不為空"
else
echo "這是第五個判別句子"
echo "變量1為空"
fi
fi
fi
測驗作用:
九、shell文件及目錄常用操作的幾個實例
提取途徑的目錄和文件名
提取目錄:
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 `ls $1`
do
element=$1"/"$file
if [ -d $element ]
then
getFile $element
else
echo $element
fi
done
}
清空文件內(nèi)容
cat /dev/null > $filePath???????????????? ?END ????????????????? 關(guān)注我的微信公眾號,回復(fù)“加群”按規(guī)則加入技術(shù)交流群。
歡迎關(guān)注我的視頻號:
點擊“閱讀原文”查看更多分享,歡迎點分享、收藏、點贊、在看。
