版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
編寫shell管理腳本:
shell的作用:
Shell是一個(gè)特殊的應(yīng)用程序,它介于操作系統(tǒng)內(nèi)核與用戶之間,負(fù)責(zé)接收用戶輸入的操作
指令并進(jìn)行解釋,將需要執(zhí)行的操作傳遞給內(nèi)核執(zhí)行。
Shell程序有很多種,windows里的cmd.exe也是shell的一種。
在linux/unix操作系統(tǒng)中,能夠使用的shell程序有很多種,常見的shell如下:
Bsh:早期的unixshell程序,實(shí)現(xiàn)了最基本的命令解釋其功能。
Csh:使用C語言的語法風(fēng)格,更加適合為用戶提供命令交互操作。
Ksh:結(jié)合了bsh和csh兩者的功能優(yōu)勢。
Bash;是bsh的升級替代品,目前大多數(shù)linux默認(rèn)的shell程序。
Zsh:更多的基于交互式操作系統(tǒng)考慮設(shè)計(jì)。
Shell環(huán)境的切換:
通過配置文件/etc/shells可以了解系統(tǒng)所支持的shell程序的路徑。
查看當(dāng)前l(fā)inux系統(tǒng)中能夠使用的shell程序的列表:
[root@localhost~]#cat/etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
[root@localhost
有一部分shell程序?qū)嶋H上是其他shell程序的符號鏈接文件:
[root@test~]#Is-I/bin/*sh
-rwxr-xr-x.1rootroot938832Jul182013/bin/bash
Irwxrwxrwx.1rootroot4Jun2422:11/bin/csh->tcsh(tcsh是csh的兼容升級版本)
-rwxr-xr-x.1rootroot109672Oct172012/bin/dash
Irwxrwxrwx.1rootroot4Jun2422:05/bin/sh->bash
-rwxr-xr-x.1rootroot387328Feb222013/bin/tcsh
[root@test
1.臨時(shí)切換到新的shell環(huán)境:
直接輸入其他shell程序的名稱即可切換到新的shell環(huán)境,返回原來的shell可執(zhí)行exit
命令:
[root@testtcsh
[root@test~]#
查看當(dāng)前用戶所用的shell:
[root@enscript]#echo$SHELL
/bin/bash
[root@enscript]#
[root@test^]#echo$0(并不是所有shell都支持)
tcsh
[root@test~]#
[root@testexit
exit
[root@test~]#echo$0
-bash
[root@test~]#
2.更改用戶自己的登陸shell:
用戶登錄shell信息記錄在/etc/passwd文件中。用戶可以用chsh命令進(jìn)行修改:
[root@localhostgrep"root"/etc/passwd
root:x:Q:0:root:/root:/bin/bash
operators:11:0:operator:/root:/sbin/nologin
[root@localhost~]#
普通用戶更改自己的shell方法:
使用dwzhang用戶登錄,更改自己的shell為tcsh:
[dwzhang@test~]$echo$0
-bash
[dwzhang@test~]$chsh
Changingshellfordwzhang.
Password:
Newshell[/bin/bash]:/bin/tcsh
Shellchanged.
[dwzhang@test~]$echo$0
-bash
[dwzhang@test~]$grepdwzhang/etc/passwd
dwzhang:x:500:500::/home/dwzhang:/bin/tcsh
[dwzhang@test~]$
重新連接:
[dwzhang@test~]$echo$0
-tcsh
[dwzhang@test~]$
管理員root賬戶更改shell:
管理員直接vi編輯/etc/passwd,直接更改用戶shell.
用命令usermod進(jìn)行更改:
[root@localhost~]#usermod-s/bin/bashdwzhangl
bash問題:
考試題:如何查看centoslinux系統(tǒng)默認(rèn)的shell?
[root@testecho$SHELL
/bin/bash
[root@test
查看shell版本:
[root@testbash-version
shell程序在運(yùn)維工作中的作用地位?
shell腳本很擅長處理純文本類型的數(shù)據(jù),而linux中幾乎所有的配置文件,日志文件都是純
文本類型的文件。貼近系統(tǒng)層的操作,shell是最佳。
shell腳本語言的種類:
在unix和linux中主要有兩大類shell:
bourneshell(包括sh,ksh,bash)
cshell(包括csh,tcsh)
bash是最常用的,也是linux默認(rèn)的shell解釋器。
常用的開發(fā)腳本語言:
php:網(wǎng)頁程序,主要用來做web程序。
perl:強(qiáng)大,語法復(fù)雜。
python:新興的語言,語法簡潔。
sh和bash的區(qū)別:
sh是bash的軟鏈接:
[root@testIs-I/bin/sh
Irwxrwxrwx.1rootroot4Jun2422:05/bin/sh->bash
[root@test
Bash的常用功能:
1.命令歷史
(1)使用歷史命令
可用方向鍵上來使用執(zhí)行過的命令。
⑵查看或修改歷史命令列表
命令history默認(rèn)情況下可以為用戶保存最多1000條歷史命令,若要更改需修改/etc/profile
文件中的“HISTSIZE=1000”實(shí)現(xiàn)。
[root@localhostvi/etc/profile
HISTSIZE=1000
[root@localhost
為特定用戶調(diào)整歷史用戶命令:
[dwzhang@test~]$vi.bash_profile
exportHISTSIZE=20(添加這一行)
[dwzhang@test~]$history|wc-I
76
重新登錄:
[dwzhang@test~]$history|wc-I
20
[dwzhang@test~]$
清除歷史命令:
[root@localhost~]#history-c
2.命令別名:
查看系統(tǒng)已設(shè)置的別名:
[root@localhost~]#alias
aliascp='cp-i'
aliasl.='ls-d.*-color=auto'
aliasll='ls-I-color=auto'
aliasls='ls-color=auto'
aliasmv='mv-i'
aliasrm='rm-i'
aliaswhich='alias|/usr/bin/which-tty-only-read-alias-show-dot-show-tilde'
[root@localhost^]#
設(shè)置別名命令:(重啟后失效)(長期更改應(yīng)更改文件.bashrc)
基本形式:alias別名實(shí)際命令’
取消設(shè)置別名:
命令unalias
Unalias別名名稱
[root@localhostunaliasrm
取消當(dāng)前系統(tǒng)所有設(shè)置的命令別名:
[root@localhostunalias-a
標(biāo)準(zhǔn)輸出重定向:
是將命令輸出結(jié)果定向(保存)到指定的文件中,而不是直接顯示在顯示器的屏幕上。
輸出重定向使用符號:
符號>:如果指定的文件不存在,則會(huì)建立新文件,結(jié)果保存到該文件中。
如果該文件存在,則清空文件內(nèi)容并保存結(jié)果到該文件。
[root@localhostidzhangl>idzhangl.txt
[root@localhostIs
anaconda-ks.cfgidzhangl.txtinstall.loginstall.log.syslog公共的模板視頻圖片
文檔下載音樂桌面
[root@localhostcatidzhangl.txt
uid=500(zhangl)gid=500(zhangl)組=500(zhangl)
[root@localhost~]#
符號”:可以將結(jié)果追加到指定文件末尾進(jìn)行保存,而不覆蓋文件的原有內(nèi)容。如果想把多
個(gè)命令輸出結(jié)果保存在一個(gè)文件中,可以使用此命令。
[root@localhostidzhang2?idzhangl.txt
[root@localhostcatidzhangl.txt
uid=500(zhangl)gid=500(zhangl)組=500(zhangl)
uid=501(zhang2)gid=501(zhang2)組=501(zhang2)
[root@localhost~]#
標(biāo)準(zhǔn)輸入重定向:
是將命令中接收輸入的途徑由默認(rèn)的鍵盤更改為指定的文件。
使用輸入重定向?qū)⑹挂恍┙换ナ讲僮鬟^程可以通過讀取文件來完成。
比如為用戶設(shè)置密碼的過程需要交互,比如安裝vmwaretools等。
為用戶設(shè)置密碼,結(jié)合-stdin命令和〈重定向符,則可自動(dòng)讀取文件設(shè)置密碼。省略啦交互
的過程。
[root@localhostvipw.txt
[root@localhostcatpw.txt
lqaz2wsx!@
[root@localhostpasswd-stdinzhang3<pw.txt
passwd:未知的用戶名稱'zhang3'o
[root@localhostuseraddzhang3
[root@localhostpasswd-stdinzhang3<pw.txt
標(biāo)準(zhǔn)錯(cuò)誤重定向:
就是將執(zhí)行命令過程中出現(xiàn)的錯(cuò)誤信息(如選項(xiàng)參數(shù)錯(cuò)誤等)重新定向保存到指定文件,而
不是直接顯示在屏幕上。
使用操作符2>o其中2是錯(cuò)誤文件的編號。2>>:不覆蓋舊的文件。
[root@localhost~]#helpIs
bash:help:nohelptopicsmatch'Is'.Try'helphelp'or'man-kIs1or'infoIs'.
[root@localhosthelpIs2>err.txt
[root@localhost~]#caterr.txt
bash:help:nohelptopicsmatch'Is'.Try'helphelp'or'man-kIs'or'infoIs'.
[root@localhost~]#
在實(shí)際應(yīng)用中,錯(cuò)誤重定向主要是提供以下用途:
1.在調(diào)試程序時(shí),收集錯(cuò)誤信息。
2.使用shell腳本程序時(shí),將錯(cuò)誤重定向到指定文件中。
當(dāng)命令執(zhí)行結(jié)果中同時(shí)包含標(biāo)準(zhǔn)輸出(正常執(zhí)行)和錯(cuò)誤輸出的內(nèi)容時(shí),可以同時(shí)用〉,2>
將信息分別重定向到不同的文件。也可以用&>操作符將兩種輸出內(nèi)容重定向到同一個(gè)文件
中。
管道操作:
在bash環(huán)境中,管道操作作為不同命令之間的協(xié)同工作提供了一種機(jī)制。位于管道“|”左
側(cè)的命令輸出結(jié)果,將作為右側(cè)命令的輸入,同一行命令中可以依次使用多個(gè)管道。
輸入/輸出重定向、管道
程序的默認(rèn)輸入設(shè)備,叫標(biāo)準(zhǔn)輸入,stdin,鍵盤01
程序的默認(rèn)輸出設(shè)備,叫標(biāo)準(zhǔn)輸出,stdout,minitor顯示器。2
程序的默認(rèn)錯(cuò)誤信息輸出設(shè)備,標(biāo)準(zhǔn)錯(cuò)誤輸出,stderr,minitor。3
輸出重定向:
>,大于號表示。
COMMAND>FILE,覆蓋輸出,沖掉原來的內(nèi)容。
[root@localhostIs/>/tmp/test.out
[root@localhostIs/tmp/test.out
/tmp/test.out
[root@localhost~]#
[root@localhostpwd>aa
[root@localhostcataa
/root
[root@localhost
可以用命令關(guān)掉輸出重定向這個(gè)功能:
命令:set-C(關(guān)閉輸出重定向。set+C開啟,>|強(qiáng)行覆蓋,-C無效,大C)
[root@localhostset-C
[root@localhostset+C
[root@localhost^]#ls/>|aa(強(qiáng)行覆蓋)
COMMAND?FILE,追加輸出。
>>,兩個(gè)大于號。
[root@localhostcataa
/root
[root@localhost~]#Is/?aa
[root@localhostcataa
/root
bin
boot
dev..............................
[root@localhost
/dev/null的意義
數(shù)據(jù)黑洞,送進(jìn)去的數(shù)據(jù)丟棄,把不想要的輸出信息丟棄到/dev/null中。這里單個(gè)大于號
或追加輸出都無所謂了。
[root@localhostdate
FriSep1211:12:01CST2014
[root@localhost~]#date>/dev/null《丟棄輸出內(nèi)容,只想看命令是否成功)
[root@localhost^]#echo$?(查看輸入是否成功)
0
[root@localhost
輸入重定向:
<,小于號。
COMMAND<FILE
是將命令中接收輸入的途徑由默認(rèn)的鍵盤更改為指定的文件。
使用輸入重定向?qū)⑹挂恍┙换ナ讲僮鬟^程可以通過讀取文件來完成。
比如為用戶設(shè)置密碼的過程需要交互,比如安裝vmwaretools等。
為用戶設(shè)置密碼,結(jié)合-stdin命令和〈重定向符,則可自動(dòng)讀取文件設(shè)置密碼。省略啦交互
的過程。
[root@localhost~]#vipw.txt
[root@localhost~]#catpw.txt
lqaz2wsx!@
[root@localhostpasswd-stdinzhang3<pw.txt
passwd:未知的用戶名稱'zhang3'c
[root@localhostuseraddzhang3
[root@localhostpasswd-stdinzhang3<pw.txt
??兩個(gè)小于號:
COMMAND?,文件結(jié)尾標(biāo)示符,(出現(xiàn)此標(biāo)示即結(jié)束)
例子:把hellozhang
helloda
hellowei一次寫入文件中。
方法1:一行一行追加
[root@localhost~]#echo"hellozhang',>testl
[root@localhost~]#echo"helloda"?testl
[root@localhost~]#echo"hellowei"?testl
[root@localhost~]#cattestl
hellozhang
helloda
hellowei
[root@localhost^]#
方法2:利用?e和\n下一行功能
[root@localhostecho-e"hellozhang\nhelloda\nhellowei">test2
[root@localhost~]#cattest2
hellozhang
helloda
hellowei
[root@localhost~]#
方法3:用<<兩個(gè)小于號
[root@localhost~]#cat?test3?eof(輸入eof結(jié)束)
>hellozhang
>helloda
>hellowei
>eof(遇到eof結(jié)束)
[root@localhostcattest3
hellozhang
helloda
hellowei
[root@localhost~]#
<<用在腳本中:
[root@localhost~]#vimtest4.sh
#!/bin/bash
cat?eof
whatdoyouwanttoeat?
l.shaoji
2.longxia
3.dazhaxie
eof
[root@localhostbashtest4.sh
whatdoyouwanttoeat?
l.shaoji
2.longxia
3.dazhaxie
[root@localhost
錯(cuò)誤輸出:
就算重定向一個(gè)命令,如果命令是錯(cuò)誤的,也是沒有重定向。
例子:
[root@localhostIls/etc>testl
-bash:Ils:commandnotfound
[root@localhost^]#
2>:
把錯(cuò)誤信息追加到文件:
[root@localhostIls/etc2>testl
[root@localhostcattestl
-bash:Ils:commandnotfound
[root@localhost~]#
正確或錯(cuò)誤都重定向:
COMMAND>FILE2>&1
COMMAND>FILE12>FILE2(把對的輸出到FILE1文件中,錯(cuò)誤輸入到FILE2中)
COMMAND&>FILE(無論對錯(cuò)都輸出到文件中)
管道:
把第一個(gè)命令結(jié)果送給第二個(gè)命令。
COMMAND1|COMMAND2|......................
[root@localhostecho"welcomezhangdawei"
welcomezhangdawei
[root@localhost^]#echo"welcomezhangdawei"|tr'a-z''A-Z'(用大寫字母顯示)
WELCOMEZHANGDAWEI
[root@localhost~]#echo"welcomezhangdawei"|cut-d''-f2(只顯示第二個(gè)字符)
zhangdawei
[root@localhost~]#echo"welcomezhangdawei"|cut-d''-fl
welcome
[root@localhostREC='echo"welcomezhangdawei"|cut-d''-fl'
[root@localhost~]#echo$REC
welcome
[root@localhost~]#
顯示/etc下文件大寫顯示:
[root@localhostIs/etc|tr'a-z''A-Z*|less
[root@localhostlog]#pwd
/var/log
[root@localhostlog]#
[root@localhostlog]#file'Is/var/log'
anaconda.ifcfg.log:ASCIItext
anaconda.log:ASCIIEnglishtext
[root@localhostlog]#file'Is/var/log'|tr-d'1(tr-d',刪除空格字符)
anaconda.ifcfg.log:ASCIItext
anaconda.log:ASCIIEnglishtext
[root@localhostlog]#file'Is/var/log'|sort(排序)
anaconda.ifcfg.log:ASCIItext
anaconda.log:ASCIIEnglishtext
[root@localhostlog]#file'Is/var/log'|cut-d:-f2(顯示第二個(gè)字符)
ASCIItext
ASCIIEnglishtext
[root@localhostlog]#file'Is/var/log'|cut-d:-f2|tr-d11|sort-u(sort-u去掉重復(fù)的選項(xiàng))
ASCIIC++programtext,withverylonglines
ASCIIEnglishtext
想顯示命令并且保存一份命令結(jié)果:
tee命令
COMMAND|teefile|COMMAND
[root@localhostlog]#Is/etc|teetest51查看/etc并把結(jié)果保存到test5文件中)
Shell變量應(yīng)用:
用于保存系統(tǒng)和用戶需要特定參數(shù),而且這些參數(shù)可以根據(jù)用戶的設(shè)定或系統(tǒng)環(huán)境的變化而
相應(yīng)變化。
常見的shell變量類型:用戶自定義變量(本地變量),環(huán)境變量(全局變量),預(yù)定義變量,
位置變量。
用戶自定義變量:
是由系統(tǒng)用戶自己定義的變量,只在用戶自己的shell環(huán)境中有效,又稱為本地變量。
1.定義新的變量
格式:變量名=變量值
新建一個(gè)名為“DAY”的變量,初始內(nèi)容設(shè)置為"Sunday"
[root@localhost~]#DAY=Sunday
[root@localhost~]#
2.查看和引用變量的值
通過在變量名前加“$”,可以引用一個(gè)變量的內(nèi)容。需要在終端中輸出變量內(nèi)容,可以
使用echo命令。
查看變量DAY的內(nèi)容,比較使用$和不使用的區(qū)別:
[root@localhost~]#DAY=Sunday
[root@localhost~]#echoDAY(錯(cuò)誤用法,直接顯示輸入字符)
DAY
[root@localhost~]#echo$DAY(弓I用DAY變量的內(nèi)容)
Sunday
[root@localhost
當(dāng)變量名稱和緊跟著其后的其他字符相渾濁時(shí),需要加{}大括號,將變量名包圍起來。
[root@localhost~]#DAY=Sunday
[root@localhost~]#echo$DAYmoring(錯(cuò)誤用法,顯示空行)
[root@localhostecho${DAY}moring(正確引用DAY變量的內(nèi)容)
Sundaymoring
[root@localhost~]#
[root@testjintian=wensday
[root@test~]#echo$jintian
wensday
[root@testechojintianshi${jintian}(注意$要放在中括號外面${jintian})
jintianshiwensday
[root@test~]#
這種變量的方式是直接定義變量內(nèi)容,內(nèi)容一般為簡單連續(xù)的數(shù)字,字符串,路徑名等。
3.為變量賦值的常用方法:
上面說的在=號后面直接指定變量內(nèi)容是為變量賦值的基本方法,除此之外,比較常用
的幾種變量賦值操作包括:雙引號,單引號,反撇號,read命令。
雙引號(”〃)
使用雙引號時(shí),可以再雙引號的范圍內(nèi)使用$符號來引用其他變量的值。
確認(rèn)變量DAY的內(nèi)容,并使用雙引號為TODAY變量值"todayis$DAY":
[root@localhostecho$DAY
Sunday
[root@localhosttoday="todayis$DAY"
[root@localhost~]#echo$today
todayisSunday
[root@localhost~]#
這種變量的方式是通過雙引號定義變量,特點(diǎn)是輸出變量時(shí)引號里的變量會(huì)經(jīng)過解析后輸
出的變量內(nèi)容,不是把引號內(nèi)容輸出,適合于字符串中附帶有變量的內(nèi)容。
單引號(“)
使用單引號時(shí),將不可以在單引號范圍內(nèi)引用其他變量的值,$將會(huì)被當(dāng)成普通字符。
確認(rèn)變量的內(nèi)容DAY,并使用單引號為today變量賦值弋。dayis$DAY"
[root@localhost~]#echo$DAY
Sunday
[root@localhosttoday='todayis$DAY'
[root@localhost~]#echo$today
todayis$DAY
[root@localhost^]#
這種變量的方式是通過單引號定義變量,特點(diǎn)是單引號里面是什么就輸出什么,比較適合
定義顯示純字符串。
例子:
[root@test3=
[root@testb='192.168?l.2'
[root@testc=,,"
[root@testecho$a
[root@test~]#echo$b
[root@test~]#echo$c
[root@test~]#
[root@testa=-$a
[root@testb='-$a'
[root@testc=H-$a"
[root@test**]#echo"a=$a"
3=-
[root@test~]#echo,,b=$b"
b=-$a
[root@test~]#echo"c=${c}"
c=--
[root@test~]#
對于不連續(xù)的字符串定義要用雙引號,否則系統(tǒng)提示沒有這個(gè)命令:
[root@testa="bcd"
[root@testecho$a
bed
[root@test~]#d=fdg
-bash:d:commandnotfound
[root@test
反撇號(,、)
使用反撇號時(shí),可以將執(zhí)行的特定命令的輸出結(jié)果賦給變量,反撇號內(nèi)包含的字串必須是能
夠執(zhí)行的命令,執(zhí)行后會(huì)用輸出結(jié)果替換該命令字串。
用命令I(lǐng)I查看,將結(jié)果保存到變量aa中:
[root@localhost~]#aa='ll'(給aa一個(gè)可以執(zhí)行命令的變量II查看命令)
[root@localhost~]#echo$aa(查看結(jié)果)
總用量112-rw-------.1rootroot13544月922:48anaconda-ks.cfg-rw-r-r—.1rootroot854
月2309:18err.txt-rw-r-r-.1rootroot964月2210:55idzhangl.txt-rw-r-r-.1rootroot
450644月922:48install.log-rw-r-r-.1rootroot100334月922:46install.log.syslog-rw-r-r-.
1rootroot114月2211:05pw.txtdrwxr-xr-x.2rootroot40964月914:50公共的drwxr-xr-x.
2rootroot40964月914:50模板drwxr-xr-x.2rootroot40964月914:50視頻drwxr-xr-x.
2rootroot40964月914:50圖片drwxr-xr-x.2rootroot40964月914:50文檔drwxr-xr-x.
2rootroot40964月914:50下載drwxr-xr-x.2rootroot40964月914:50音樂drwxr-xr-x.
2rootroot40964月914:50桌面
[root@localhost~]#
在需要嵌套使用命令替換操作時(shí),反撇號將力所不能,這時(shí)需使用“$()"來代替:
[root@localhost~]#bb=$(ll$(mkdirvvb))(給bb變量,創(chuàng)建文件夾vvb,查看II)
[root@localhost~]#echo$bb
總用量124-rw-r-r-.1rootroot7354月2311:11aa.txtdrwxr-xr-x.2rootroot40964月23
11:17abc-rw-------.1rootroot13544月922:48anaconda-ks.cfg-rw-r-r-.1rootroot854月
2309:18err.txt-rw-r-r-.1rootroot964月2210:55idzhangl.txt-rw-r-r-.1rootroot450644
月922:48install.log-rw-r-r-.1rootroot100334月922:46install.log.syslog-rw-r-r-.1root
root114月2211:05pw.txtdrwxr-xr-x.2rootroot40964月2311:18vvbdrwxr-xr-x.2root
root40964月914:50公共的drwxr-xr-x.2rootroot40964月914:50模板drwxr-xr-x.2
rootroot40964月914:50視頻drwxr-xr-x.2rootroot40964月914:50圖片drwxr-xr-x.2
rootroot40964月914:50文檔drwxr-xr-x.2rootroot40964月914:50下載drwxr-xr-x.2
rootroot40964月914:50音樂drwxr-xr-x.2rootroot40964月914:50桌面
[root@localhost
命令read是bash內(nèi)置命令來給變量賦值
[root@localhost^]#readzhang(賦值給變量zhang)
zhangdawei(輸入內(nèi)容)
[root@localhostecho$zhang(查看變量zhang)
zhangdawei
[root@localhost
4.設(shè)置變量的作用范圍:
對于用戶自行定義的變量,默認(rèn)只能在當(dāng)前的shell環(huán)境中使用,因此稱為局部變量。
為了能在所有子shell環(huán)境中能夠繼續(xù)使用,可以使用export命令將指定的變量設(shè)置為“全
局變量”??梢酝瑫r(shí)使用多個(gè)變量名,不需要$符號,多個(gè)變量用空格分開。
[root@localhost~]#filesvr=
[root@localhostecho$filesvr
[root@localhost~]#zsh
[root@localhost~]#echo$filesvr
[root@localhost~]#exit
[root@localhostexportfilesvr
[root@localhostzsh
[root@localhostecho$filesvr
[root@localhost~]#
定義兩個(gè)變量MONTH,YEAR,并將其設(shè)置成全局變量。
[root@localhost~]#exportM0NTH=mayYEAR=2009
[root@localhostecho$MONTH$YEAR
may2009
[root@localhost
例子說明:
[root@test~]#zdw=zhangdawei(定義變量zdw)
[root@test~]#echo$zdw(echo查看變量)
zhangdawei
[root@testcsh(切換到csh)
[root@testecho$zdw(查看zdw變量)
zdw:Undefinedvariable.(顯示未定義的變量)
[root@testecho$0(查看當(dāng)前shell)
csh
[root@testexit(退出)
exit
[root@testexportzdw(用命令export指定變量zdw為全局變量)
[root@testcsh(切換到csh)
[root@testecho$zdw(查看zdw變量內(nèi)容)
zhangdawei
[root@test
5.清除自定義變量:
當(dāng)用戶不再需要使用自定義變量時(shí),可以使用unset命令對已定義的用戶變量進(jìn)行清除,
指定一個(gè)或多個(gè)變量名稱作為參數(shù)即可。(以空格分開)
[root@localhost~]#exportM0NTH=mayYEAR=2009
[root@localhost~]#echo$M0NTH$YEAR
may2009
[root@localhostunsetMONTHYEAR(注意:刪除變量不用加$)
[root@localhost~]#echo$MONTH$YEAR
[root@localhost~]#
6.數(shù)值變量的運(yùn)算:
Bash程序并不適合進(jìn)行強(qiáng)大的數(shù)學(xué)運(yùn)算(如小數(shù),指數(shù)等),一般只適合進(jìn)行簡單地整
數(shù)運(yùn)算.可以使用expr表達(dá)式命令:
格式如下:expr變量1運(yùn)算符變量2【運(yùn)算符變量3......]
其中變量1,變量2.......對應(yīng)需計(jì)算的數(shù)值變量(前面需要加$符號引用),常用的幾種運(yùn)
算符:
+:加法運(yùn)算
-:減法運(yùn)算
\*:乘法運(yùn)算
/:除法運(yùn)算
%:求模運(yùn)算,又稱為取余運(yùn)算,即計(jì)算數(shù)值相除后的余數(shù)。
第一種方法:用let:
[root@enscript]#a=2
[root@enscript]#b=6
[root@enscript]#c=$a+$b
[root@enscript]#echo$c
2+6
[root@enscript]#letc=$a+$b
[root@enscript]#echo$c
8
[root@enscript]#
第二種方法:用$[算數(shù)表達(dá)式]
[root@enscript]#a=5
[root@enscript]#b=5
[root@enscript]#w=$[$a+$b]
[root@enscript]#echo$w
10
[root@enscript]#
第三種方法:用$((算數(shù)表達(dá)式)),2個(gè)小括號:
[root@enscript]#n=8
[root@enscript]#m=6
[root@enscript]#p=$(($n+$m))
[root@enscript]#echo$p
14
[root@enscript]#
第四種方法:用expr算術(shù)表達(dá)式,注意數(shù)字之間要有空格,要用''引號:
[root@enscript]#f=7
[root@enscript]#s=9
[root@enscript]#x='expr$f+$s'(注意:'expr空格$f空格+空格$s')
[root@enscript]#echo$x
16
[root@enscript]#
環(huán)境變量:
這里所說的環(huán)境變量是指用戶登陸后linux系統(tǒng)預(yù)先設(shè)定好的一類shell變量,其功能是設(shè)
置用戶的shell工作環(huán)境,包括用戶宿主目錄,命令查找路徑,用戶當(dāng)前目錄,登陸終端等。
通常使用大寫字母,數(shù)字和其他字符組成。一般由linux系統(tǒng)自行維護(hù)。
1.查看環(huán)境變量
通常不帶任何選項(xiàng)或參數(shù)的set命令,可以查看系統(tǒng)中的所有的shell變量。
[root@localhost~]#set|less
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:host
complete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
比較常用的環(huán)境變量:
$USER,$LOGNAME變量表示當(dāng)前用戶登陸的名稱,$UID變量表示當(dāng)前用戶的UID號,
$SHELL變量表示用戶使用的登陸shell,$HOME變量表示用戶的宿主目錄,$PWD變量表示
用戶當(dāng)前的工作目錄等。
$PATH變量表示當(dāng)前用戶的命令搜索路徑。
以分號分割,顯示當(dāng)前用戶的用戶名,宿主目錄,登陸shell。
[root@localhost~]#echo"$USER:$HOME:$SHELL"
root:/root:/bin/bash
[root@localhost
查看當(dāng)前的命令搜索路徑,并將“/opt/bin”目錄添加到現(xiàn)有的搜索路徑中去:
[dwzhang@test~]$echo$PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/dwz
hang/bin
[dwzhang@test~]$PATH=7opt/bin:$PATH"
[dwzhang@test~]$echo$PATH
/opt/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/h
ome/dwzhang/bin
[dwzhang@test~]$
2.環(huán)境變量配置文件
/etc/profile:全局配置文件,對所有用戶起作用。
.bash_profile:用戶配置文件,可以覆蓋全局配置。
用戶需要長期變更所使用的某個(gè)環(huán)境變量,可以再.bash_profile中修改。
在當(dāng)前用戶環(huán)境中,將用于限制歷史命令查看數(shù)量的環(huán)境變量HISTSIZE的值改為900。
[root@localhost~]#echo$HISTSIZE(查看環(huán)境變量)
1000
[root@localhostexportHISTSIZE=900(設(shè)置全局變量改為900)
[root@localhostecho$HISTSIZE(查看變量)
900
[root@localhost
位置變量:
$n:獲取當(dāng)前執(zhí)行的shell腳本的第n個(gè)參數(shù)值,n=1..9,當(dāng)n為0時(shí)表示腳本的文件
名,如果n大于9,用大括號括起來${10}
例子:
[root@testdayl]#catn.sh
echo$1$2$3
[root@testdayl]#shn.shxiaolxiao2xiao3
xiaolxiao2xiao3(分別對應(yīng)$1,$2,$3)
[root@testdayl]#
[root@testdayl]#catn.sh
echo$1$2$3${10}
[root@testdayl]#shn.sh1234567891011
12310
[root@testdayl]#
預(yù)定義變量:(特殊變量)
是由bash程序預(yù)先定義好的一些特殊變量,用戶只能使用預(yù)定義變量,而不能創(chuàng)建新的預(yù)
定義變量。所有的預(yù)定義變量都是由$符號和另一個(gè)符號組成的,較常用的有:
$0:獲取當(dāng)前執(zhí)行的shell腳本的文件名,包括路徑。(表示當(dāng)前執(zhí)行的進(jìn)程的進(jìn)程名)
例子:
[root@testdayl]#catO.sh
echo$0
[root@testdayl]#shO.sh(顯示腳本的名稱)
0.sh
[root@testdayl]#sh/scripts/dayl/O.sh
/scripts/dayl/O.sh(顯示腳本名和路徑)
[root@testdayl]#
[root@testdayl]#cat/etc/init.d/postfix(查看postfix腳本文件)
echo$"Usage:$0{start|stop|restart|reload|abort|flush|check|status|condrestart}"
[root@testdayl]#/etc/init.d/postfixxiaozhang(執(zhí)行一下)
Usage:/etc/init.d/postfix{start|stop|restart|reload|abort|flush|check|status|condrestart}
[root@testdayl]#(提示文件名和路徑)
如果腳本需要使用腳本名,直接定義$0,不需要在定義參數(shù)。
有的時(shí)候我們不需要路徑和腳本名同時(shí)顯示:需要用命令dirname和basename:
[root@testdayl]#dirname/scripts/dayl/O.sh(路徑)
/scripts/dayl
[root@testdayl]#basename/scripts/dayl/O.sh(腳本名)
O.sh
[root@testdayl]#
[root@testdayl]#cat00.sh
dirname"$0"
basename"$0"
[root@testdayl]#sh00.sh(路徑)
OO.sh
[root@testdayl]#catOO.sh
dirname"$0"
basename"$0"
[root@testdayl]#sh/scripts/dayl/OO.sh(sh路徑)
/scripts/dayl
OO.sh
[root@testdayl]#
$*:獲取當(dāng)前shell的所有參數(shù),將所有的命令行參數(shù)視為單個(gè)字符串,相當(dāng)于〃$1$2$3〃....
注意與$#區(qū)別。(表示所有位置參數(shù)的內(nèi)容。)
$#:獲取當(dāng)前shell命令行中參數(shù)的總個(gè)數(shù)。
[root@testdayl]#catn.sh
echo$1$2$3${10}
echo$#
[root@testdayl]#shn.sh123
123
3(顯示命令行總個(gè)數(shù))
[root@testdayl]#shn.sh12345
123
5
[root@testdayl]#
[root@testdayl]#catbijiao.sh
if[$#-ne3];then(命令行輸入3個(gè))
echo"err,plsinput3argv."(否則顯示錯(cuò)誤)
exit1
else
echo"ok"
fi
[root@testdayl]#shbijiao.sh
err,plsinput3argv.
[root@testdayl]#shbijiao.shaa
err,plsinput3argv.
[root@testdayl]#shbijiao.shaabb
err,plsinput3argv.
[root@testdayl]#shbijiao.shaabbcc
ok
[root@testdayl]#shbijiao.shaabbccdd
err,plsinput3argv.
[root@testdayl]#
$@:這個(gè)程序的所有參數(shù)“$1”“$2”“$3”.…,這是將參數(shù)傳遞給其他程序的最佳方
式,因?yàn)樗麜?huì)保留所有內(nèi)嵌在每個(gè)參數(shù)里的任何空白。
注意$*和$@的區(qū)別:
進(jìn)程狀態(tài)變量
$$:獲取當(dāng)前shell的進(jìn)程號(PID)。
$!:執(zhí)行上一個(gè)指令的PID,上一個(gè)后臺運(yùn)行進(jìn)程的進(jìn)程號。
$?:獲取執(zhí)行上一個(gè)指令的返回值(0為成功,非0為失?。?/p>
例子:
[root@testdayl]#oldboy
-bash:oldboy:commandnotfound
[root@testdayl]#echo$?
127(非0,上一條命令執(zhí)行失?。?/p>
[root@testdayl]#pwd
/scripts/dayl
[root@testdayl]#echo$?
0
[root@testdayl]#
返回值:
0:表示運(yùn)行成功。
2:權(quán)限拒絕。
1~125:表示運(yùn)行失敗,執(zhí)行錯(cuò)誤。
126:未找到執(zhí)行的命令。
>128:命令被系統(tǒng)強(qiáng)制結(jié)束。
$_:在此之前執(zhí)行的命令(上一個(gè)命令)或腳本的最后一個(gè)參數(shù)。
Shell腳本的概念
凡是使用shell編程語言腳本編寫的程序文件都可以稱為shell腳本。
只要將linux命令按順序保存到一個(gè)文本文件中,并給予這個(gè)文件可執(zhí)行權(quán)限,那么這個(gè)文
件就可以稱為shell腳本。Shell腳本是屬于解釋執(zhí)行的,并不需要進(jìn)行特別編譯,只需要有
相應(yīng)的shell命令解釋器即可。
查看系統(tǒng)腳本文件的數(shù)量和文件類型:
[root@localhost~]#Is-I/etc/rc.d/init.d/*|wc-I
67
[root@localhost~]#file/etc/rc.d/init.d/*|tail-2
/etc/rc.d/init.d/wpa_supplicant:Bourne-Againshellscripttextexecutable
/etc/rc.d/init.d/ypbind:POSIXshellscripttextexecutable
[root@localhost
Linux中的系統(tǒng)腳本文件屬主都是管理員用戶root,所有的腳本文件都具有可執(zhí)行(x)屬性,
因此可以由shell解釋執(zhí)行。Shell腳本文件以文本文件的形式保存,可以使用cat命令查看
文件內(nèi)容,也可以使用vi編輯器修改文件的內(nèi)容。
查看系統(tǒng)中的網(wǎng)絡(luò)服務(wù)腳本network文件的開頭五行內(nèi)容:
[root@localhost"]#cat/etc/rc.d/init.d/network|head-5
#!/bin/bash
#
#networkBringup/downnetworking
#
#chkconfig:23451090
[root@localhost
Linux中的系統(tǒng)腳本文件只有管理員root才具有修改的權(quán)限。
編寫一個(gè)完整可運(yùn)行的Shell腳本需要經(jīng)過以下步驟:
1.建立包含可執(zhí)行語句的文本文件
使用vi創(chuàng)建腳本文件,可以有擴(kuò)展名,也可以沒有。
腳本中包括的內(nèi)容如下:
運(yùn)行環(huán)境設(shè)置:通常位于文件的第一行,用于指定使用哪一個(gè)shell程序解釋。
設(shè)置以“#!”開始,后面緊跟指定的完整路徑,例如#!/bin/bash。
注釋行:以#符號開頭的內(nèi)容都被視為注釋行。
可執(zhí)行語句:是腳本最重要的組成部分。在命令行中可執(zhí)行的命令都可以寫入腳本中,
當(dāng)程序運(yùn)行時(shí),默認(rèn)將會(huì)按照順序依次解釋執(zhí)行。還可以添加一些程序結(jié)構(gòu)語句。
以上部分只有可執(zhí)行語句是必不可少的。
例子:
使用vi編輯一個(gè)用于查看當(dāng)前系統(tǒng)中/boot目錄所占空間的大小,并列出內(nèi)核文件的屬性信
息的腳本文件repboot.sho
[root@localhostvirepboot.sh
[root@localhostcatrepboot.sh
#!/bin/bash(指定shell路徑)
#/bootandkernel(注釋)
echo"Useageof/boot:"(顯示提示信息)
du-sh/boot(查看目錄空間)
echo"themodeofkernelfile:"(顯示提示信息)
Is-Ih/boot/vmlinuz-*(查看文件屬性)
[root@localhost
2.為腳本添加可執(zhí)行權(quán)限
編好腳本后,需要執(zhí)行程序才能看到結(jié)果。但是新創(chuàng)建的腳本不具有可執(zhí)行屬性,需要
用命令chmod為文件添加x權(quán)限:
[root@localhost~]#Is-Irepboot.sh(查看)
-rw-r-r-.1rootroot1234月2510:50repboot.sh(無x權(quán)限)
[root@localhost
[root@localhostchmoda+xrepboot.sh(力口x權(quán)限)
[root@localhost~]#Is-Irepboot.sh(查看)
-rwxr-xr-x.1rootroot1234月2510:50repboot.sh(有啦x權(quán)限)
[root@localhost
執(zhí)行shell腳本:有多種方式執(zhí)行shell腳本:
1.直接執(zhí)行帶x權(quán)限的腳本文件
最常用的一種方式。直接通過腳本文件路徑執(zhí)行
[root@localhost~]#./repboot.sh(?/執(zhí)行)
Useageof/boot:
27M/boot
themodeofkernelfile:
-rwxr-xr-x.1rootroot3.9M2月222013/boot/vmlinuz-2.6.32-358.el6.x86_64
[root@localhost~]#
2.使用shell解釋器程序執(zhí)行腳本
由解釋器程序負(fù)責(zé)讀取腳本文件中的內(nèi)容并執(zhí)行,不需要x權(quán)限,通常在腳本調(diào)試中使
用。(bash或sh執(zhí)行,兩個(gè)意思一樣。)
[root@localhost~]#bashrepboot.sh(bash執(zhí)行)
Useageof/boot:
27M/boot
themodeofkernelfile:
-rwxr-xr-x.1rootroot3.9M2月222013/boot/vmlinuz-2.6.32-358.el6.x86_64
[root@localhost
3.使用.命令執(zhí)行
上面都是在當(dāng)前shell中啟動(dòng)一個(gè)子shell來運(yùn)行腳本程序。需要在當(dāng)前shell環(huán)境中運(yùn)行
用bash的內(nèi)部命令.或source命令。也是不需要x權(quán)限。
[root@localhost~]#.repboot.sh(,后有空格)
Useageof/boot:
27M/boot
themodeofkernelfile:
-rwxr-xr-x.1rootroot3.9M2月222013/boot/vmlinuz-2.6.32-358.el6.x86_64
[root@localhost~]#
注意執(zhí)行腳本方式第三種和前兩種的區(qū)別!
其他說明:
shell腳本的建立:
shell腳本通常是在編輯器如vi中編寫,由unix/linux,bashshell命令,程序結(jié)構(gòu)控制語句和
注釋等內(nèi)容組成。
腳本開頭(第一行):#!/bin/bash必須在第一行。
一個(gè)規(guī)范的shell腳本的第一行會(huì)指出由哪個(gè)程序來執(zhí)行腳本,一般為:
#!/bin/bash或#!/bin/sh
在執(zhí)行腳本的時(shí)候,內(nèi)核會(huì)根據(jù)它來確定該用哪個(gè)程序來解釋腳本中的內(nèi)容,這一行必須在
腳本頂端的第一行,如果不是第一行則為注釋。
linux中常用腳本語言開頭的寫法,在不同的語言開頭一般都要加一行相應(yīng)的標(biāo)識語言:
#!/bin/sed
#!/usr/bin/awk
#!/usr/bin/perl
默認(rèn)為bash的系統(tǒng),用bash可以不用在第一行加!為了養(yǎng)成好習(xí)慣,最好第一行加上!
腳本注釋:
跟在#后面的內(nèi)容。
shell腳本的執(zhí)行:
當(dāng)shell腳本文件以非交互方式運(yùn)行時(shí),它會(huì)先查找環(huán)境變量ENV,該變量指定了一個(gè)環(huán)境
文件,通常是.bashrc,然后從該環(huán)境變量文件開始執(zhí)行,當(dāng)讀取了ENV文件后,SHELL才開
始執(zhí)行shell腳本。
執(zhí)行shell腳本三種方法:
1.bash腳本名稱或sh腳本名稱
當(dāng)腳本文件本身沒有可執(zhí)行權(quán)限(X權(quán)限)使常用的方法。
2.path/腳本名稱或./腳本名稱
需要先將腳本權(quán)限改為可執(zhí)行權(quán)限(X權(quán)限),然后通過腳本路徑執(zhí)行。
3.source腳本名稱或.腳本名稱
使用這種方法讀入或加載指定的shell腳本(如san.sh),然后依次執(zhí)行指定shell腳本文
件san.sh中的所有語句。這些語句將作為當(dāng)前父shell腳本father.sh進(jìn)程的一部分運(yùn)行。
就是說在當(dāng)前shell中執(zhí)行腳本文件,而不是產(chǎn)生一個(gè)子shell來執(zhí)行文件中的命令。
使用前兩種執(zhí)行腳本,是在當(dāng)前shell中啟動(dòng)一個(gè)子shell來運(yùn)行腳本程序,因此腳本程
序定義的環(huán)境變量只能在子shell環(huán)境中使用,無法再當(dāng)前的shell中使用.
source命令與shellscripts的區(qū)別是,source在當(dāng)前bash環(huán)境下執(zhí)行命令,而scripts是
啟動(dòng)一個(gè)子shell來執(zhí)行命令。這樣如果把設(shè)置環(huán)境變量(或alias等等)的命令寫進(jìn)scripts
中,就只會(huì)影響子shell,無法改變當(dāng)前的BASH,所以通過文件(命令列)設(shè)置環(huán)境變量時(shí),
要用source命令。
source命令(從CShell而來)是bashshell的內(nèi)置命令。點(diǎn)命令,就是個(gè)點(diǎn)符號,(從Bourne
Shell而來)是source的另一名稱。同樣的,當(dāng)前腳本中配置的變量也將作為腳本的環(huán)境,
source(或點(diǎn))命令通常用于重新執(zhí)行剛修改的初始化文檔,如
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 增強(qiáng)現(xiàn)實(shí)觸覺反饋
- 中國科學(xué)院空間應(yīng)用工程與技術(shù)中心2025年一般科研崗位公開招聘備考題庫含答案詳解
- 2025年鎮(zhèn)江市丹陽生態(tài)環(huán)境局公開招聘編外工作人員5人備考題庫完整答案詳解
- 2025年興業(yè)銀行廈門分行社會(huì)招聘備考題庫及完整答案詳解1套
- 貴陽市公安機(jī)關(guān)2025年面向社會(huì)公開招聘第三批警務(wù)輔助人員備考題庫及1套完整答案詳解
- 2025年中國光大銀行光大理財(cái)社會(huì)招聘備考題庫完整參考答案詳解
- 2026屆江西省吉安市新干縣第二中學(xué)高三語文第一學(xué)期期末教學(xué)質(zhì)量檢測模擬試題含解析
- 企業(yè)社會(huì)責(zé)任報(bào)告模板全面社會(huì)責(zé)任披露
- 2025年量子計(jì)算技術(shù)產(chǎn)業(yè)化可行性研究報(bào)告
- 2025年智能電網(wǎng)建設(shè)與管理可行性研究報(bào)告
- 大健康產(chǎn)業(yè)可行性研究報(bào)告
- 腸易激綜合征中西醫(yī)結(jié)合診療專家共識(2025)解讀課件
- 庫存周轉(zhuǎn)率提升計(jì)劃
- 護(hù)理部競聘副主任
- 《統(tǒng)計(jì)學(xué)-基于Excel》(第 4 版)課件 賈俊平 第5-9章 概率分布- 時(shí)間序列分析和預(yù)測
- 中國計(jì)量大學(xué)《文科數(shù)學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
- 中國普通食物營養(yǎng)成分表(修正版)
- 20道長鑫存儲設(shè)備工程師崗位常見面試問題含HR常問問題考察點(diǎn)及參考回答
- 抖音ip孵化合同范本
- 小升初語文總復(fù)習(xí)《文章主要內(nèi)容概括》專項(xiàng)練習(xí)題(附答案)
- DL-T606.5-2009火力發(fā)電廠能量平衡導(dǎo)則第5部分-水平衡試驗(yàn)
評論
0/150
提交評論