shell编程基础-简述
1.1?前言
1.1.1?為什么學(xué)Shell
Shell腳本語(yǔ)言是實(shí)現(xiàn)Linux/UNIX系統(tǒng)管理及自動(dòng)化運(yùn)維所必備的重要工具,?Linux/UNIX系統(tǒng)的底層及基礎(chǔ)應(yīng)用軟件的核心大都涉及Shell腳本的內(nèi)容。每一個(gè)合格?的Linux系統(tǒng)管理員或運(yùn)維工程師,都需要能夠熟練地編寫Shell腳本語(yǔ)言,并能夠閱?讀系統(tǒng)及各類軟件附帶的Shell腳本內(nèi)容。只有這樣才能提升運(yùn)維人員的工作效率,適?應(yīng)曰益復(fù)雜的工作環(huán)境,減少不必要的重復(fù)工作,從而為個(gè)人的職場(chǎng)發(fā)展奠定較好的基礎(chǔ)
1.1.2?什么是shell
Shell是一個(gè)命令解釋器,它在操作系統(tǒng)的最外層,負(fù)責(zé)直接與用戶對(duì)話,把用戶的輸入解釋給操作系統(tǒng),并處理各種各樣的操作系統(tǒng)的輸出結(jié)果,輸出屏幕返回給用戶。
這種對(duì)話方式可以是:
交互的方式:從鍵盤輸入命令,通過/bin/bash的解析,可以立即得到Shell的回應(yīng)
[root@clsn ~]# ls anaconda-ks.cfg [root@clsn ~]# echo ls |bash anaconda-ks.cfg非交互的方式:?腳本
1.1.3?什么是Shell腳本
? 命令、變量和流程控制語(yǔ)句等有機(jī)的結(jié)合起來(lái)
???????? shell腳本擅長(zhǎng)處理純文本類型的數(shù)據(jù),而linux中,幾乎所有的配置文件,日志,都是純文本類型文件
1.1.4?腳本語(yǔ)言的種類
一、編譯型語(yǔ)言
定義:指用專用的編譯器,針對(duì)特定的操作平臺(tái)(操作系統(tǒng))將某種高級(jí)語(yǔ)言源代碼一次性翻譯成可被硬件平臺(tái)直接運(yùn)行的二進(jìn)制機(jī)器碼(具有操作數(shù),指令、及相應(yīng)的格式),這個(gè)過程叫做編譯(./configure? make makeinstall?);編譯好的可執(zhí)行性文件(.exe),可在相對(duì)應(yīng)的平臺(tái)上運(yùn)行(移植性差,但運(yùn)行效率高)。。
典型的編譯型語(yǔ)言有,?C語(yǔ)言、C++等。
另外,Java語(yǔ)言是一門很特殊的語(yǔ)言,Java程序需要進(jìn)行編譯步驟,但并不會(huì)生成特定平臺(tái)的二進(jìn)制機(jī)器碼,它編譯后生成的是一種與平臺(tái)無(wú)關(guān)的字節(jié)碼文件(*.class)(移植性好的原因),這種字節(jié)碼自然不能被平臺(tái)直接執(zhí)行,運(yùn)行時(shí)需要由解釋器解釋成相應(yīng)平臺(tái)的二進(jìn)制機(jī)器碼文件;大多數(shù)人認(rèn)為Java是一種編譯型語(yǔ)言,但我們說(shuō)Java即是編譯型語(yǔ)言,也是解釋型語(yǔ)言也并沒有錯(cuò)。
二、解釋型語(yǔ)言
定義:指用專門解釋器對(duì)源程序逐行解釋成特定平臺(tái)的機(jī)器碼并立即執(zhí)行的語(yǔ)言;相當(dāng)于把編譯型語(yǔ)言的編譯鏈接過程混到一起同時(shí)完成的。
解釋型語(yǔ)言執(zhí)行效率較低,且不能脫離解釋器運(yùn)行,但它的跨平臺(tái)型比較容易,只需提供特定解釋器即可。
常見的解釋型語(yǔ)言有,?Python(同時(shí)是腳本語(yǔ)言)與Ruby等。
三、腳本語(yǔ)言
定義:為了縮短傳統(tǒng)的編寫-編譯-鏈接-運(yùn)行(edit-compile-link-run)過程而創(chuàng)建的計(jì)算機(jī)編程語(yǔ)言。
特點(diǎn):程序代碼即是最終的執(zhí)行文件,只是這個(gè)過程需要解釋器的參與,所以說(shuō)腳本語(yǔ)言與解釋型語(yǔ)言有很大的聯(lián)系。腳本語(yǔ)言通常是被解釋執(zhí)行的,而且程序是文本文件。
典型的腳本語(yǔ)言有,JavaScript,Python,shell等。
其他常用的腳本語(yǔ)句種類
PHP是網(wǎng)頁(yè)程序,也是腳本語(yǔ)言。是一款更專注于web頁(yè)面開發(fā)(前端展示)的腳本語(yǔ)言,例如:Dedecms,discuz。PHP程序也可以處理系統(tǒng)日志,配置文件等,php也可以調(diào)用系統(tǒng)命令。
Perl腳本語(yǔ)言。比shell腳本強(qiáng)大很多,語(yǔ)法靈活、復(fù)雜,實(shí)現(xiàn)方式很多,不易讀,團(tuán)隊(duì)協(xié)作困難,但仍不失為很好的腳本語(yǔ)言,存世大量的程序軟件。MHA高可用Perl寫的
Python,不但可以做腳本程序開發(fā),也可以實(shí)現(xiàn)web程序以及軟件的開發(fā)。近兩年越來(lái)越多的公司都會(huì)要求會(huì)Python。
Shell腳本與php/perl/python語(yǔ)言的區(qū)別和優(yōu)勢(shì)?
shell腳本的優(yōu)勢(shì)在于處理操作系統(tǒng)底層的業(yè)務(wù)?(linux系統(tǒng)內(nèi)部的應(yīng)用都是shell腳本完成)因?yàn)橛写罅康膌inux系統(tǒng)命令為它做支撐。2000多個(gè)命令都是shell腳本編程的有力支撐,特別是grep、awk、sed等。例如:一鍵軟件安裝、優(yōu)化、監(jiān)控報(bào)警腳本,常規(guī)的業(yè)務(wù)應(yīng)用,shell開發(fā)更簡(jiǎn)單快速,符合運(yùn)維的簡(jiǎn)單、易用、高效原則.
PHP、Python優(yōu)勢(shì)在于開發(fā)運(yùn)維工具以及web界面的管理工具,web業(yè)務(wù)的開發(fā)等。處理一鍵軟件安裝、優(yōu)化,報(bào)警腳本。常規(guī)業(yè)務(wù)的應(yīng)用等php/python也是能夠做到的。但是開發(fā)效率和復(fù)雜比用shell就差很多了。
系統(tǒng)環(huán)境說(shuō)明
[root@clsn scripts]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@clsn scripts]# uname -r 3.10.0-693.el7.x86_64 [root@clsn scripts]# getenforce Disabled [root@clsn scripts]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: inactive (dead)Docs: man:firewalld(1)1.1.5?系統(tǒng)中的shell
查看系統(tǒng)中的命解釋器
[root@clsn ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin常用操作系統(tǒng)的默認(rèn)shell
1.Linux是Bourne Again shell(bash)
2.Solaris和FreeBSD缺省的是Bourne shell(sh)
3.AIX下是Korn Shell(ksh)
4.HP-UX缺省的是POSIX shell(sh)
[root@clsn ~]# echo $SHELL /bin/bashbash版本
[root@clsn scripts]# bash -version GNU bash, 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. 許可證 GPLv3+: GNU GPL 許可證版本3或者更高 <http://gnu.org/licenses/gpl.html>這是自由軟件,您可以自由地更改和重新發(fā)布。 在法律允許的范圍內(nèi)沒有擔(dān)保.?bash?破殼漏洞
使用 命令 env x='() { :;}; echo be careful' bash -c "echo this is a test" 如果返回結(jié)果為一行,則為正常,[root@clsn ~]# env x='() { :;}; echo be careful' bash -c "echo this is a test"this is a test#解決辦法 升級(jí)當(dāng)前的bash版本yum install update bashsh與bash?的關(guān)系
[root@clsn ~]# ll /bin/sh lrwxrwxrwx. 1 root root 4 11月 13 11:15 /bin/sh -> bash/bin與?/user/bin?的關(guān)系
[root@clsn ~]# ll /bin -d lrwxrwxrwx. 1 root root 7 11月 13 11:15 /bin -> usr/bin1.2?腳本書寫規(guī)范
1.2.1?腳本統(tǒng)一存放目錄
[root@clsn ~]# mkdir -p /server/scripts/ [root@clsn ~]# cd /server/scripts/1.2.2?選擇解釋器
注意格式?↓
其中開頭的"#!"字符又稱為幻數(shù),在執(zhí)行bash腳本的時(shí)候,內(nèi)核會(huì)根據(jù)"#!"后的解釋器來(lái)確定該用那個(gè)程序解釋這個(gè)腳本中的內(nèi)容。
[root@clsn scripts]# head -1 /etc/init.d/* ==> /etc/init.d/functions <== # -*-Shell-script-*-==> /etc/init.d/netconsole <== #!/bin/bash==> /etc/init.d/network <== #! /bin/bash1.2.3?編輯腳本使用vim
使用?.vimrc?文件,能夠快速的生成開頭的注釋信息
[root@clsn scripts]# cat ~/.vimrc autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"func SetTitle()if expand("%:e") == 'sh'call setline(1,"#!/bin/bash")call setline(2, "##############################################################")call setline(3, "# File Name: ".expand("%"))call setline(4, "# Version: V1.0")call setline(5, "# Author: clsn")call setline(6, "# Organization: http://blog.znix.top")call setline(7, "# Created Time : ".strftime("%F %T"))call setline(8, "# Description:")call setline(9, "##############################################################")call setline(10, "")endif endfunc使用后的效果
[root@clsn scripts]# cat scripts_test.sh #!/bin/bash ############################################################## # File Name: scripts_test.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-04 11:39:57 # Description: First scripts file ##############################################################在Shell腳本中,跟在#后面的內(nèi)容表示注釋。注釋部分不會(huì)被執(zhí)行,僅給人看。注釋可以自成一行,也可以跟在命令后面,與命令同行。要養(yǎng)成寫注釋的習(xí)慣,方便自己與他人。
最好不用中文注釋,因?yàn)樵诓煌址南到y(tǒng)會(huì)出現(xiàn)亂碼。(字符集為zh_CN.UTF-8,為中文)。
1.2.4?文件名規(guī)范
?????????名字要有意義,并且結(jié)尾以?.sh?結(jié)束
1.2.5?開發(fā)的規(guī)范和習(xí)慣小結(jié)
1)?放在統(tǒng)一的目錄
2)?腳本以.sh為擴(kuò)展名
3)?開頭指定腳本解釋器。
4)?開頭加版本版權(quán)等信息,可配置~/.vimrc文件自動(dòng)添加。
5)?腳本不要用中文注釋,盡量用英文注釋。
6)?代碼書寫優(yōu)秀習(xí)慣
? a、成對(duì)的內(nèi)容一次性寫出來(lái),防止遺漏,如[? ]、' '、" "等
? b、[? ]兩端要有空格,先輸入[? ],退格,輸入2個(gè)空格,再退格寫。
? c、流程控制語(yǔ)句一次書寫完,再添加內(nèi)容。(if?條件?; then ?內(nèi)容;fi)ddd
? d、通過縮進(jìn)讓代碼易讀。
? f、腳本中的引號(hào)都是英文狀態(tài)下的引號(hào),其他字符也是英文狀態(tài)。
1.3 shell腳本的執(zhí)行
1.3.1?執(zhí)行腳本的辦法
sh/bash scripts.sh chown +x ./scripts.sh && ./scripts.sh source scripts.sh . (空格) scripts.sh cat oldboyedu.sh |bash # 效率較低source?與?.?(點(diǎn))?的作用
soucre命令
[root@clsn ~]# help source |head -2 source: source 文件名 [參數(shù)]在當(dāng)前 shell 中執(zhí)行一個(gè)文件中的命令。. (點(diǎn))
[root@clsn scripts]# help . |head -2 .: . 文件名 [參數(shù)]在當(dāng)前 shell 中執(zhí)行一個(gè)文件中的命令。1.3.2 sh?于?source的區(qū)別
[root@clsn scripts]# sh clsn_test.sh Hello World! [root@clsn scripts]# echo $clsn # sh 新建一個(gè)Shell窗口(新建一個(gè)進(jìn)程)執(zhí)行一個(gè)文件中的命令。[root@clsn scripts]# source clsn_test.sh Hello World! [root@clsn scripts]# echo $clsn Hello World!面試題:
問sh test.sh后echo $user返回的結(jié)果__空_??
[root@oldboy scripts]# cat test.sh #!/bin/bash user=`whoami`1.4 Shell的變量
1.4.1?什么是變量
變量可以分為兩類:環(huán)境變量(全局變量)和普通變量(局部變量)
環(huán)境變量也可稱為全局變量,可以在創(chuàng)建他們的Shell及其派生出來(lái)的任意子進(jìn)程shell中使用,環(huán)境變量又可分為自定義環(huán)境變量和Bash內(nèi)置的環(huán)境變量
普通變量也可稱為局部變量,只能在創(chuàng)建他們的Shell函數(shù)或Shell腳本中使用。普通變量一般是由開發(fā)者用戶開發(fā)腳本程序時(shí)創(chuàng)建的。
?????????特殊變量
1.4.2?環(huán)境變量
使用?env/declare/set/export -p?命令查看系統(tǒng)中的環(huán)境變量,這三個(gè)命令的的輸出方式稍有不同。
[root@clsn scripts]# env XDG_SESSION_ID=1 HOSTNAME=clsn TERM=linux SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=10.0.0.1 5537 22 SSH_TTY=/dev/pts/0 USER=root ~~~?????????輸出一個(gè)系統(tǒng)中的?環(huán)境變量
[root@clsn ~]# echo $LANG zh_CN.UTF-81.4.3?普通變量
本地變量在用戶當(dāng)前的Shell生存期的腳本中使用。例如,本地變量OLDBOY取值為bingbing,這個(gè)值在用戶當(dāng)前Shell生存期中有意義。如果在Shell中啟動(dòng)另一個(gè)進(jìn)程或退出,本地變量值將無(wú)效???????
定義普通變量實(shí)踐
[root@clsn ~]# a=1 [root@clsn ~]# b='2' [root@clsn ~]# c="3" [root@clsn ~]# echo "$a" 1 [root@clsn ~]# echo "$b" 2 [root@clsn ~]# echo "${c}"提示:$變量名表示輸出變量,可以用$c和${c}兩種用法
小結(jié):連續(xù)普通字符串內(nèi)容賦值給變量,不管用什么引號(hào)或者不用引號(hào),它的內(nèi)容是什么,打印變量就輸出什么
1.4.4 export命令
[root@clsn ~]# help export export: export [-fn] [名稱[=值] ...] 或 export -p 為 shell 變量設(shè)定導(dǎo)出屬性。標(biāo)記每個(gè) NAME 名稱為自動(dòng)導(dǎo)出到后續(xù)命令執(zhí)行的環(huán)境。如果提供了 VALUE 則導(dǎo)出前將 VALUE 作為賦值。export命令的說(shuō)明
當(dāng)前shell窗口及子shell窗口生效
在新開的shell窗口不會(huì)生效,生效需要寫入配置文件
#?定義變量
[root@clsn scripts]# CSLN=clsn [root@clsn scripts]# export CSLN1=1#?當(dāng)前窗口查看
[root@clsn scripts]# echo $CSLN clsn [root@clsn scripts]# echo $CSLN1 1#?編寫測(cè)試腳本
[root@clsn scripts]# vim quanju.sh #!/bin/bash echo $CSLN echo $CSLN1#?使用sh執(zhí)行
[root@clsn scripts]# sh quanju.sh 1#?使用source?執(zhí)行
[root@clsn scripts]# source quanju.sh clsn 11.4.5?環(huán)境變量相關(guān)配置文件
/etc/proflie
/etc/bashrc
~/.bashrc
~/.bash_profile
/etc/proflie.d/? #?目錄
四文件讀取順序(CentOS6和7都一樣)
①?/etc/profile
②?~/.bash_profile
③?~/.bashrc
④?/etc/bashrc
文件讀取過程示意圖
驗(yàn)證四文件讀取順序的方法
sed -i '1a echo "$(date +%T-%s) /etc/profile1" >>/tmp/clsn' /etc/profile sed -i '$a echo "$(date +%T-%s) /etc/profile2" >>/tmp/clsn' /etc/profile sed -i '1a echo "$(date +%T-%s) /etc/bashrc1" >>/tmp/clsn' /etc/bashrc sed -i '$a echo "$(date +%T-%s) /etc/bashrc2" >>/tmp/clsn' /etc/bashrc sed -i '1a echo "$(date +%T-%s) ~/.bashrc1" >>/tmp/clsn' ~/.bashrc sed -i '$a echo "$(date +%T-%s) ~/.bashrc2" >>/tmp/clsn' ~/.bashrc sed -i '1a echo "$(date +%T-%s) ~/.bash_profile1" >>/tmp/clsn' ~/.bash_profile sed -i '$a echo "$(date +%T-%s) ~/.bash_profile2" >>/tmp/clsn' ~/.bash_profile1.4.6?環(huán)境變量的知識(shí)小結(jié)
ü?變量名通常要大寫。
ü?變量可以在自身的Shell及子Shell中使用。
ü?常用export來(lái)定義環(huán)境變量。
ü?執(zhí)行env默認(rèn)可以顯示所有的環(huán)境變量名稱及對(duì)應(yīng)的值。
ü?輸出時(shí)用“$變量名”,取消時(shí)用“unset變量名”。
ü?書寫crond定時(shí)任務(wù)時(shí)要注意,腳本要用到的環(huán)境變量最好先在所執(zhí)行的Shell腳本中重新定義。
ü?如果希望環(huán)境變量永久生效,則可以將其放在用戶環(huán)境變量文件或全局環(huán)境變量文件里。
1.4.7?變量中引號(hào)的使用
只有在變量的值中有空格的時(shí)候,會(huì)使用引號(hào)。
單引號(hào)與雙引號(hào)的區(qū)別在于,是否能夠解析特殊符號(hào)。
[root@clsn ~]# name=znix [root@clsn ~]# name2='clsn' [root@clsn ~]# name3="http://blog.znix.top" [root@clsn ~]# echo $name znix [root@clsn ~]# echo $name2 clsn [root@clsn ~]# echo $name3 http://blog.znix.top [root@clsn ~]# name4='cl sn' [root@clsn ~]# echo $name4 cl sn [root@clsn ~]# name5="cl sn" [root@clsn ~]# echo $name5 cl sn [root@clsn ~]# name6='cl sn $PWD' [root@clsn ~]# echo $name6 cl sn $PWD [root@clsn ~]# name6="cl sn $PWD" [root@clsn ~]# echo $name6 cl sn /root1.4.8?普通變量的要求
1)?????內(nèi)容是純數(shù)字、簡(jiǎn)單的連續(xù)字符(內(nèi)容中不帶任何空格)時(shí),定義時(shí)可以不加任何引號(hào),例如:
a.ClsnAge=22
b.NETWORKING=yes
2)?????沒有特殊情況時(shí),字符串一律用雙引號(hào)定義賦值,特別是多個(gè)字符串中間有空格時(shí),例如:
a.NFSD_MODULE="no load"
b.MyName="Oldboy is a handsome boy."
3)?????當(dāng)變量里的內(nèi)容需要原樣輸出時(shí),要用單引號(hào)(M),這樣的需求極少,例如:
a.OLDBOY_NAME='OLDBOY'
變量使用反引號(hào)賦值
[root@clsn scripts]# time=`date` [root@clsn scripts]# echo $time 2017年 12月 05日 星期二 09:02:06 CST[root@clsn scripts]# file=`ls` [root@clsn scripts]# echo $file clsn_test.sh panduan.sh quanju.sh yhk.sh使用${}
打印變量的時(shí)候防止出現(xiàn)“金庸新著”的問題
[root@clsn scripts]# time=`date` [root@clsn scripts]# echo $time_day[root@clsn scripts]# echo ${time}_day 2017年 12月 05日 星期二 09:02:06 CST_day [root@clsn scripts]# echo $time-day 2017年 12月 05日 星期二 09:02:06 CST-day編寫腳本測(cè)試${}
# 使用腳本測(cè)試[root@clsn scripts]# vim bianliang.sh #!/bin/bash############################################################## File Name: bianliang.sh# Version: V1.0# Author: clsn# Organization: http://blog.znix.top# Created Time : 2017-12-05 09:10:29# Description:#############################################################time=`date`echo $timedayecho ${time}day[root@clsn scripts]# sh bianliang.sh 2017年 12月 05日 星期二 09:11:19 CSTday1.4.9?定義變量名技巧
1.?變量名只能為字母、數(shù)字或下劃線,只能以字母或下劃線開頭。
2.?變量名的定義要有一定的規(guī)范,并且要見名知意。
示例:
ClsnAge=22?? ????#<==每個(gè)單詞的首字母大寫的寫法
clsn_age=22????? #<==單詞之間用"_"的寫法
clsnAgeSex=man? ?#<==駝峰語(yǔ)法:首個(gè)單詞的首字母小寫,其余單詞首字母大寫
CLSNAGE=22?????? #<==單詞全大寫的寫法
3.?一般的變量定義、賦值常用雙引號(hào);簡(jiǎn)單連續(xù)的字符串可以不加引號(hào);希望原樣輸出時(shí)使用單引號(hào)。
4.?希望變量的內(nèi)容是命令的解析結(jié)果時(shí),要用反引號(hào)'',或者用$()把命令括起來(lái)再賦值。
1.5?特殊變量
1.5.1?位置變量
常用的特殊位置參數(shù)說(shuō)明
| 位置變量 | 作用說(shuō)明 |
| $0 | 獲取當(dāng)前執(zhí)行的shell腳本的文件名,如果執(zhí)行腳本帶路徑那么就包括腳本路徑。 |
| $n | 獲取當(dāng)前執(zhí)行的shell腳本的第n個(gè)參數(shù)值,n=1..9,當(dāng)n為0時(shí)表示腳本的文件名,如果n大于9用大括號(hào)括起來(lái){10},參數(shù)以空格隔開。 |
| $# | 獲取當(dāng)前執(zhí)行的shell腳本后面接的參數(shù)的總個(gè)數(shù) |
| $* | 獲取當(dāng)前shell的所有傳參的參數(shù),不加引號(hào)同$@;如果給$*加上雙引號(hào),例如:?“$*”,則表示將所有的參數(shù)視為單個(gè)字符串,相當(dāng)于“112$3”。 |
| $@ | 獲取當(dāng)前shell的所有傳參的參數(shù),不加引號(hào)同$*;如果給$@加上雙引號(hào),例如:?“$@”,則表示將所有參數(shù)視為不同的獨(dú)立字符串,相當(dāng)于“$1”?“$2”?“$3”?“……”,這是將參數(shù)傳遞給其他程序的最佳方式,因?yàn)樗麜?huì)保留所有內(nèi)嵌在每個(gè)參數(shù)里的任何空白。 |
| 當(dāng)“$*”和“$@”都加雙引號(hào)時(shí),兩者有區(qū)別,都不加雙引號(hào)時(shí),兩者無(wú)區(qū)別。 | |
0,0,1.$2 ~?參數(shù)實(shí)踐
[root@clsn scripts]# vim chanshu.sh #!/bin/bash ############################################################# # File Name: chanshu.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-05 09:39:16 # Description: ############################################################# echo $0 echo "第一個(gè)參數(shù):" $1 echo "第二個(gè)參數(shù):" $2 echo "第11個(gè)參數(shù):" ${11} [root@clsn scripts]# sh chanshu.sh chanshu.sh 第一個(gè)參數(shù): 第二個(gè)參數(shù): 第11個(gè)參數(shù): [root@clsn scripts]# sh chanshu.sh 1 2 3 4 5 6 7 8 9 10 11 chanshu.sh 第一個(gè)參數(shù): 1 第二個(gè)參數(shù): 2 第11個(gè)參數(shù): 11$#?參數(shù)實(shí)踐
[root@clsn scripts]# vim chanshu.sh ############################################################# # File Name: chanshu.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-05 09:39:16 # Description: #############################################################echo $0 echo "第一個(gè)參數(shù):" $1 echo "第二個(gè)參數(shù):" $2 echo "第10個(gè)參數(shù):" ${10} echo "第11個(gè)參數(shù):" ${11} echo "參數(shù)個(gè)數(shù):" $#[root@clsn scripts]# sh chanshu.sh 55 2 3 4 5 6 7 8 9 10 11 112 chanshu.sh 第一個(gè)參數(shù): 55 第二個(gè)參數(shù): 2 第10個(gè)參數(shù): 10 第11個(gè)參數(shù): 11 參數(shù)個(gè)數(shù): 12$*?參數(shù)實(shí)踐
[root@clsn scripts]# vim chanshu.sh ############################################################# # File Name: chanshu.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-05 09:39:16 # Description: #############################################################echo $0 echo "第一個(gè)參數(shù):" $1 echo "第二個(gè)參數(shù):" $2 echo "第10個(gè)參數(shù):" ${10} echo "第11個(gè)參數(shù):" ${11} echo "參數(shù)個(gè)數(shù):" $# echo "參數(shù):" $* "chanshu.sh" 18L, 456C 已寫入 [root@clsn scripts]# sh chanshu.sh 55 2 3 4 5 6 7 8 9 10 11 112 chanshu.sh 第一個(gè)參數(shù): 55 第二個(gè)參數(shù): 2 第10個(gè)參數(shù): 10 第11個(gè)參數(shù): 11 參數(shù)個(gè)數(shù): 12 參數(shù): 55 2 3 4 5 6 7 8 9 10 11 112$*?與?$@?對(duì)比實(shí)踐
[root@clsn scripts]# set -- "I am" handsome boy.. [root@clsn scripts]# echo $1 I am [root@clsn scripts]# echo $2 handsome [root@clsn scripts]# echo $3 boy.. [root@clsn scripts]# echo $* I am handsome boy.. [root@clsn scripts]# echo $@ I am handsome boy..[root@clsn scripts]# for i in $*;do echo $i ;done I am handsome boy.. [root@clsn scripts]# for i in $@;do echo $i ;done I am handsome boy.. [root@clsn scripts]# for i in "$@";do echo $i ;done I am handsome boy.. [root@clsn scripts]# for i in "$*";do echo $i ;done I am handsome boy..1.5.2?進(jìn)程狀態(tài)變量
Shell進(jìn)程的特殊狀態(tài)變量說(shuō)明
| 位置變量 | 作用說(shuō)明 |
| $? | 獲取執(zhí)行上一個(gè)指令的執(zhí)行狀態(tài)返回值(0為成功,非零為失敗),這個(gè)變量最常用 |
| $$ | 獲取當(dāng)前執(zhí)行的Shell腳本的進(jìn)程號(hào)(PID),這個(gè)變量不常用,了解即可 |
| $! | 獲取上一個(gè)在后臺(tái)工作的進(jìn)程的進(jìn)程號(hào)(PID),這個(gè)變量不常用,了解即可 |
| $_ | 獲取在此之前執(zhí)行的命令或腳本的最后一個(gè)參數(shù),這個(gè)變量不常用,了解即可 |
進(jìn)程參數(shù)實(shí)踐
[root@clsn scripts]# echo $? 0 [root@clsn scripts]# echo $$ 1368 [root@clsn scripts]# echo $![root@clsn scripts]# echo $_ echo1.5.3 echo參數(shù)說(shuō)明
| 參數(shù) | 參數(shù)說(shuō)明 |
| -n | 不要追加換行 |
| -e | 啟用下列反斜杠轉(zhuǎn)義的解釋 |
| -E | 顯式地抑制對(duì)于反斜杠轉(zhuǎn)義的解釋 |
| `echo'?對(duì)下列反斜杠字符進(jìn)行轉(zhuǎn)義: | |
| \n | 換行 |
| \r | 回車 |
| \t | 橫向制表符 |
| \b | 退格 |
| \v | 縱向制表符 |
| \c | 抑制更多的輸出 |
1.6?定義變量的方式
1.6.1?三種定義變量的方式
??1、直接賦值
? 2、傳參?(傳遞參數(shù))
? 3、交互式設(shè)置變量,使用read命令
1.6.2 read命令說(shuō)明
在命令行中使用
[root@clsn scripts]# read 132 [root@clsn scripts]# echo $REPLY 132 [root@clsn scripts]# read clsn 456 [root@clsn scripts]# echo $clsn 456 [root@clsn scripts]# echo $REPLY 132在腳本中使用
[root@clsn scripts]# vim clsn_test.sh #!/bin/bash read -p '請(qǐng)輸入:' clsnecho $clsn執(zhí)行結(jié)果
[root@clsn scripts]# sh clsn_test.sh 請(qǐng)輸入:clsn_znix clsn_znixread命令的幫助說(shuō)明
[root@clsn scripts]# read --help -bash: read: --: 無(wú)效選項(xiàng) read: 用法:read [-ers] [-a 數(shù)組] [-d 分隔符] [-i 緩沖區(qū)文字] [-n 讀取字符數(shù)] [-N 讀取字符數(shù)] [-p 提示符] [-t 超時(shí)] [-u 文件描述符] [-s不顯示終端的任何輸入] [名稱 ...]1.6.3?定義方法實(shí)踐
直接賦值方法
[root@clsn scripts]# vim bianliang.sh # File Name: bianliang.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-05 09:10:29 # Description: ############################################################## name=CLSN age=22 sex=Man hobby=`ls` ethFile=/etc/sysconfig/network-scripts/ifcfg-eth0echo $hobby ls $ethFile [root@clsn scripts]# sh bianliang.sh bianliang.sh chanshu.sh clsn.sh clsn_test.sh panduan.sh quanju.sh xiugaizhuji.sh yhk.sh /etc/sysconfig/network-scripts/ifcfg-eth0傳參?(傳遞參數(shù))
[root@clsn scripts]# vim bianliang.sh ############################################################## # File Name: bianliang.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-05 09:10:29 # Description: ############################################################## name=CLSN age=22 sex=Man hobby=$1 ethFile=$2echo $hobby ls $ethFile [root@clsn scripts]# sh bianliang.sh clsn /etc/hostname clsn /etc/hostname交互式設(shè)置變量?read
[root@clsn scripts]# vim yhk.sh #!/bin/bash ############################################################## # File Name: yhk.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-04 17:01:44 # Description: ############################################################## read -p "請(qǐng)輸入你的銀行卡號(hào):" Yhk read -s -p "請(qǐng)輸入密碼:" miMa echo echo "你的銀行卡號(hào):" $Yhk echo "你的密碼為:" $miMa # 測(cè)試結(jié)果 [root@clsn scripts]# sh yhk.sh 請(qǐng)輸入你的銀行卡號(hào):123456 請(qǐng)輸入密碼: 你的銀行卡號(hào): 123456 你的密碼為: 1234561.6.4?寫一個(gè)交互腳本,實(shí)現(xiàn)能夠定義主機(jī)名及IP地址
腳本內(nèi)容↓
[root@clsn scripts]# cat xiugaizhuji.sh #!/bin/bash ############################################################# # File Name: jiaohu.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-05 10:55:42 # Description: #############################################################ethFile=/etc/sysconfig/network-scripts/ifcfg-eth[01] Now_eth=`hostname -I|awk -F "[. ]+" '{print $4}'`read -p "請(qǐng)輸入主機(jī)名:" Hostname read -p "請(qǐng)輸入IP地址的主機(jī)位:" HostIPhostnamectl set-hostname $Hostnamesed -i "s#${Now_eth}#${HostIP}#g" $ethFile read -p "是否重啟服務(wù)器:{yes/no}" REbootif [ $REboot == yes ] then echo "系統(tǒng)將在10秒后重啟!"shutdown -r 10 elseecho "請(qǐng)稍后手動(dòng)重啟系統(tǒng)!" fi腳本測(cè)試結(jié)果
[root@clsn scripts]# sh xiugaizhuji.sh 請(qǐng)輸入主機(jī)名:clsn 請(qǐng)輸入IP地址的主機(jī)位:180 是否重啟服務(wù)器:{yes/no}yes 系統(tǒng)將在10秒后重啟! [root@clsn scripts]# sh xiugaizhuji.sh 請(qǐng)輸入主機(jī)名:clsn 請(qǐng)輸入IP地址的主機(jī)位:180 是否重啟服務(wù)器:{yes/no}no 請(qǐng)稍后手動(dòng)重啟!1.7?變量的子串
1.7.1?變量子串說(shuō)明
| 表達(dá)式 | 說(shuō)明 |
| ${parameter} | 返回變量$parameter的內(nèi)容 |
| ${#parameter} | 返回變內(nèi)容的長(zhǎng)度(按字符),也適用于特殊變量 |
| ${parameterioffset} | 在變量${parameter}中,從位置offset之后開始提取子串到結(jié)尾 |
| ${parameter:offset:length} | 在變量${parameter}中,從位置offset之后開始提取長(zhǎng)度為length的子串 |
| ${parameter#word} | 從變量${parameter}開頭開始刪除最短匹配的word子串 |
| ${parameter##word} | 從變量${parameter}開頭開始刪除最長(zhǎng)匹配的word子串 |
| ${parameter%word} | 從變量${parameter}結(jié)尾開始刪除最短匹配的word子串 |
| ${parameter%%word} | 從變量${parameter}結(jié)尾開始刪除最長(zhǎng)匹配的word子串 |
| ${parameter/pattem/string} | 使用string代替第一個(gè)匹配的pattern |
| ${parameter//pattem/string} | 使用string代替所有匹配的pattern |
計(jì)算變賦值的長(zhǎng)度
[root@clsn scripts]# clsn=http://blog.znix.top [root@clsn scripts]# echo ${clsn} |wc -L 20 [root@clsn scripts]# echo ${#clsn} 20 [root@clsn scripts]# time echo ${clsn} |wc -L 20real 0m0.002s user 0m0.002s sys 0m0.000s [root@clsn scripts]# time echo ${#clsn} 20real 0m0.000s user 0m0.000s sys 0m0.000s截取變量中的字符
[root@clsn scripts]# clsn=abcABC123ABCabc [root@clsn scripts]# echo ${clsn#abc} ABC123ABCabc [root@clsn scripts]# echo ${clsn##abc} ABC123ABCabc [root@clsn scripts]# echo ${clsn%abc} abcABC123ABC [root@clsn scripts]# echo ${clsn%%abc} abcABC123ABC [root@clsn scripts]# echo ${clsn#a*c} ABC123ABCabc [root@clsn scripts]# echo ${clsn##a*c}[root@clsn scripts]# echo ${clsn%a*c} abcABC123ABC [root@clsn scripts]# echo ${clsn%%a*c}[root@clsn scripts]# echo ${clsn#a*C} 123ABCabc [root@clsn scripts]# echo ${clsn#a*C} 123ABCabc [root@clsn scripts]# echo ${clsn##a*C} abc [root@clsn scripts]# echo ${clsn%a*c} abcABC123ABC [root@clsn scripts]# echo ${clsn%A*c} abcABC123 [root@clsn scripts]# echo ${clsn%%A*c} abc替換變量?jī)?nèi)容
[root@clsn scripts]# echo $clsn abcABC123ABCabc [root@clsn scripts]# echo ${clsn/abc/clsn} clsnABC123ABCabc [root@clsn scripts]# echo ${clsn//abc/clsn} clsnABC123ABCclsn有關(guān)上述匹配刪除的小結(jié)
#表示從幵頭刪除匹配最短。
##表示從開頭刪除匹配最長(zhǎng)。
%表示從結(jié)尾刪除匹配最短。
%%表示從結(jié)尾刪除匹配最長(zhǎng)。
a*c表示匹配的突符串,*表示匹配所有,a*c匹配開頭為a、中間為任意多個(gè)字符、結(jié)尾為c的字符串。
a*C表示匹配的字符串,*表示匹配所有,a*C匹配開頭為a、中間為任意多個(gè)字符、結(jié)尾為C的字符串。
有關(guān)替換的小結(jié)
一個(gè)“/”表示替換匹配的第-個(gè)字符串。
兩個(gè)“/”表示替換匹配的所有字符串。
1.7.2 Shell的特殊擴(kuò)展變量說(shuō)明
| 表達(dá)式 | 說(shuō)明 |
| ${parameter:-word} | 如果parameter的變量值為空或未賦值,則會(huì)返回word字符串并替代變量的值用途.如果變量未定義,則返回備用的值,防止變量為空值或因未定義而導(dǎo)致異常 |
| ${parameter:=word} | 如果parameter的變量值為空或未賦值,則設(shè)置這個(gè)變量值為word,并返回其值。位置變量和特殊變量不適用用途:基本同上一個(gè)${parameter>word},但該變量又額外給parameter變量賦值了 |
| ${parameter:?word} | 如果parameter變量值為空或未賦值,那么word字符串將被作為標(biāo)準(zhǔn)錯(cuò)誤輸出,否則輸出變量的值。用途:用于捕捉由于變量未定義而導(dǎo)致的錯(cuò)誤,并退出程序 |
| ${parameter:+word} | 如果parameter變量值為空或未賦值,則什么都不做,否則word字符串將替代變量的值 |
特殊變量實(shí)踐
腳本內(nèi)容
[root@clsn scripts]# cat clsn.sh #!/bin/bash ############################################################# # File Name: clsn.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-05 12:13:38 # Description: ############################################################# dir= echo ${dir:-/tmp} echo ${dir} echo ${dir:=/mnt} echo ${dir} dir2= (空格) echo ${dir2-/tmp} echo ${dir2} echo ${dir2:-/tmp} echo ${dir2} echo ${dir2=/mnt} echo ${dir2}測(cè)試結(jié)果
[root@clsn scripts]# sh clsn.sh /tmp/mnt /mnt/tmp至此shell中的變量就都介紹完了
1.8?變量的數(shù)值計(jì)算
1.8.1?僅支持整數(shù)的運(yùn)算
echo $((數(shù)學(xué)運(yùn)算表達(dá)式))
# 形式一 [root@clsn scripts]# echo $((1 + 1)) 2 [root@clsn scripts]# echo $((2*7-3/6+5)) 19 # 形式二 [root@clsn scripts]# ((clsn=2*8)) [root@clsn scripts]# echo $clsn 16 # 形式三 [root@clsn scripts]# znix=$((2*7-3/6+5)) [root@clsn scripts]# echo $znix 19延伸產(chǎn)物(重要)
i++?自增1
i--?自減1
++i
--i
?????????示例:
[root@clsn scripts]# i=1 [root@clsn scripts]# echo $((i++)) 1 [root@clsn scripts]# echo $((i++)) 2 [root@clsn scripts]# echo $((i--)) 3 [root@clsn scripts]# echo $((i--)) 2 [root@clsn scripts]# echo $((i--)) 1 [root@clsn scripts]# echo $((++i)) 1 [root@clsn scripts]# echo $((++i)) 2 [root@clsn scripts]# echo $((++i)) 3 [root@clsn scripts]# echo $((--i)) 2 [root@clsn scripts]# echo $((--i)) 1 [root@clsn scripts]# echo $((--i)) 0記憶方法:++,--
變量a在前,表達(dá)式的值為a,然后a自增或自減,變量a在符號(hào)后,表達(dá)式值自增或自減,然后a值自增或自減。
let命令
[root@clsn scripts]# i=1 [root@clsn scripts]# i=i+1 [root@clsn scripts]# echo $i i+1[root@clsn scripts]# i=1 [root@clsn scripts]# let i=i+1 [root@clsn scripts]# echo $i 2expr?命令
1.整數(shù)計(jì)算
2.判斷擴(kuò)展名
3.判斷輸入是否為整數(shù),非整數(shù)返回值為2
4.計(jì)算變量的長(zhǎng)度
[root@clsn scripts]# expr 1+1 1+1 [root@clsn scripts]# expr 1 + 1 2 [root@clsn scripts]# expr 1 * 1 expr: 語(yǔ)法錯(cuò)誤 [root@clsn scripts]# expr 1 \* 1 1非整數(shù)返回值為2?示例:
[root@clsn scripts]# expr 1 + 1 2 [root@clsn scripts]# echo $? 0 [root@clsn scripts]# expr -1 + 1 0 [root@clsn scripts]# echo $? 1 [root@clsn scripts]# expr a + 1 expr: 非整數(shù)參數(shù) [root@clsn scripts]# echo $? 2$[]運(yùn)算符
[root@clsn scripts]# echo $[1+2] 3 [root@clsn scripts]# echo $[1-2] -1 [root@clsn scripts]# echo $[1*2] 2 [root@clsn scripts]# echo $[1/2] 0typeset命令進(jìn)行運(yùn)算
[root@clsn scripts]# typeset -i A=2017 B=2018 [root@clsn scripts]# A=A+B [root@clsn scripts]# echo $A 40351.8.2?可以進(jìn)行小數(shù)運(yùn)算的命令
bc????命令
# 安裝 bc 依賴于base源 [root@clsn scripts]# yum -y install bc??交互模式測(cè)試bc命令
[root@clsn scripts]# bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. 1+1 2 [root@clsn scripts]# echo 1+1.1|bc 2.1免交互模式測(cè)試bc命令
[root@clsn scripts]# echo 'scale=6;1/3'|bc .333333python?命令
[root@clsn scripts]# file `which yum ` /usr/bin/yum: Python script, ASCII text executable [root@clsn scripts]# python >>> import os >>> os.system('df -h') >>> 1+1.1 2.1 >>>exit()awk?命令
[root@clsn ~]# echo "7.7 3.8"|awk '{print ($1-$2)}' 3.9 [root@clsn ~]# echo "358 113"|awk '{print ($1-3)/$2}' 3.14159 [root@clsn ~]# echo "3 9"|awk '{print ($1+3)*$2}' 54 [root@backup scripts]# awk BEGIN'{print 1.2+3.3}' 4.51.8.3?運(yùn)算相關(guān)練習(xí)題
1.8.3.1?【練習(xí)題】實(shí)現(xiàn)一個(gè)加減乘除等功能的計(jì)算器
實(shí)現(xiàn)腳本:
[root@clsn scripts]# cat jishuanqi.sh #!/bin/bash ############################################################# # File Name: jishuanqi.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-06 08:57:13 # Description: #############################################################read -p "請(qǐng)輸入第一個(gè)整數(shù):" a read -p "請(qǐng)輸入第二個(gè)整數(shù):" becho $a + $b =$(($a+$b)) echo $a - $b =$(($a-$b)) echo $a \* $b =$(($a*$b)) echo $a / $b =$(($a/$b))?????????腳本執(zhí)行過程:
[root@clsn scripts]# sh jishuanqi.sh 請(qǐng)輸入第一個(gè)整數(shù):12 請(qǐng)輸入第二個(gè)整數(shù):12 12 + 12 =24 12 - 12 =0 12 * 12 =144 12 / 12 =1精簡(jiǎn)方法
[root@clsn scripts]# vim jishuanqi2.sh #!/bin/bash ############################################################# # File Name: jishuanqi2.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-06 15:02:41 # Description: ############################################################# echo $(($1))?????????腳本執(zhí)行過程:
[root@clsn scripts]# sh jishuanqi2.sh 1+1 2 [root@clsn scripts]# sh jishuanqi2.sh 1*9 91.8.3.2?【練習(xí)題】打印結(jié)果1+2+3+4+5+6+7+8+9+10=55
腳本內(nèi)容
[root@clsn scripts]# vim yunshuan.sh #!/bin/bash ############################################################# # File Name: yunshuan.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-06 09:40:31 # Description: #############################################################Num=`seq -s + 1 10` echo $Num=$(($Num))腳本執(zhí)行結(jié)果
[root@clsn scripts]# sh yunshuan.sh 1+2+3+4+5+6+7+8+9+10=551.9?補(bǔ)充說(shuō)明
shell腳本中批量注釋的方法
<<'EOF' 文件內(nèi)容 EOF或使用 exit可以注釋其之后的所有內(nèi)容(類似注釋,實(shí)質(zhì)為不執(zhí)行后面的內(nèi)容)1.9.1?參考文獻(xiàn)
http://blog.csdn.net/lansesl2008/article/details/20558369
https://www.abcdocker.com/abcdocker/269
http://blog.51cto.com/life2death/1657133
轉(zhuǎn)載于:https://www.cnblogs.com/coolpale/p/8413367.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的shell编程基础-简述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ng机器学习视频笔记(十四) ——推荐
- 下一篇: 简单显示分配器的实现