




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第10章bash 腳本編程本章內(nèi)容要點(diǎn)nShell 腳本的編制、執(zhí)行和調(diào)試nShell 腳本的成分和編碼規(guī)范nShell 變量替換擴(kuò)展、數(shù)值計(jì)算、輸入輸出n變量分類,位置參數(shù)變量和特殊參數(shù)變量n條件測試(文件測試、字符串測試、整數(shù)測試)n分支流程控制(if、case)n循環(huán)流程控制(for、while、until、select)n函數(shù)的定義和調(diào)用、返回值n使用循環(huán)分析命令行參數(shù)本章學(xué)習(xí)目標(biāo) n熟悉Shell 腳本的編碼規(guī)范,掌握執(zhí)行和調(diào)試方法n掌握對變量進(jìn)行整數(shù)運(yùn)算和間接引用的方法n理解位置參數(shù)變量和特殊參數(shù)變量的用途n掌握條件測試的使用 、()n掌握各種流程控制語句的使用qif、caseqf
2、or、while、until、select、break、continuen掌握函數(shù)的定義、調(diào)用和傳遞返回值的方法n掌握命令行參數(shù)、位置參數(shù)的操作(shift、getopts)SHELL編程基礎(chǔ)編程基礎(chǔ)2022年7月4日4Shell腳本和Shell編程n當(dāng)命令不在命令行中執(zhí)行,而是從一個(gè)文件中執(zhí)行時(shí),該文件就稱為 Shell 腳本。qShell 腳本是純文本文件。qShell 腳本通常以 .sh 作為后綴名,但不是必須。qShell 腳本是以行為單位的,在執(zhí)行腳本的時(shí)候會(huì)分解成一行一行依次執(zhí)行。nShell 是一種功能強(qiáng)大的解釋型編程語言q通常用于完成特定的、較復(fù)雜的系統(tǒng)管理任務(wù)qShell 腳
3、本語言非常擅長處理文本類型的數(shù)據(jù)2022年7月4日5Shell腳本的成分n程序元素q保留字、運(yùn)算符、表達(dá)式q變量、數(shù)組、輸入輸出q控制結(jié)構(gòu)(順序、分支、循環(huán)、子程序調(diào)用)nShell功能 【參見第2、3章內(nèi)容】q執(zhí)行命令(內(nèi)置命令、外部命令、自編程序)q重定向、管道、命令替換、命令聚合重定向、管道、命令替換、命令聚合q通配符、注釋符、qShell環(huán)境2022年7月4日6Shell 腳本的建立與執(zhí)行nShell 腳本的建立q使用文本編輯器編輯腳本文件$ vi script-fileq為腳本文件添加可執(zhí)行權(quán)限$ chmod +x script-filenShell 腳本的執(zhí)行q在子Shell中執(zhí)行
4、$ bash script-file$ script-fileq在當(dāng)前Shell中執(zhí)行$ source script-file$ . script-file2022年7月4日7PATH 環(huán)境變量的默認(rèn)值不包含當(dāng)前目錄,若腳本文件在當(dāng)前目錄,應(yīng)使用 ./script-filePATH 環(huán)境變量的默認(rèn)值包含 /bin 目錄,用戶可以將自己的腳本文件存放在 /bin 目錄,之后即可直接調(diào)用腳本文件名執(zhí)行腳本了Shell 腳本的編碼規(guī)范n以 #! 開頭:通知系統(tǒng)用何解釋器執(zhí)行此腳本#!/bin/bash#!/bin/kshn以注釋形式說明如下的內(nèi)容:# 腳本名稱# 腳本功能# 作者及聯(lián)系方式# 版本更
5、新記錄# 版權(quán)聲明# 對算法做簡要說明(如果是復(fù)雜腳本)2022年7月4日8Shell腳本舉例(1)2022年7月4日9#!/bin/bash# This is the first Bash shell program # Scriptname: greetings.shechoecho -e Hello $LOGNAME, cecho its nice talking to you.echo -n Your present working directory is: pwd # Show the name of present directoryechoecho -e The time is
6、 date +%T!. nByeechoShell腳本舉例(2)2022年7月4日10#!/bin/bash# Script Name:/etc/cron.daily/ntpdate# 使用使用NTP的客戶端命令的客戶端命令ntpdate與遠(yuǎn)程與遠(yuǎn)程N(yùn)TP服務(wù)器進(jìn)行同步服務(wù)器進(jìn)行同步# 也可以用局域網(wǎng)內(nèi)的也可以用局域網(wǎng)內(nèi)的NTP服務(wù)器替換服務(wù)器替換 /usr/sbin/ntpdate -s # 更改硬件時(shí)鐘時(shí)都會(huì)記錄在更改硬件時(shí)鐘時(shí)都會(huì)記錄在/etc/adjtime文件中文件中# 使使hwclock根據(jù)先前的記錄來估算硬件時(shí)鐘的偏差,根據(jù)先前的記
7、錄來估算硬件時(shí)鐘的偏差,# 并用來校正目前的硬件時(shí)鐘并用來校正目前的硬件時(shí)鐘/sbin/hwclock -adjust# 將系統(tǒng)時(shí)鐘同步到硬件時(shí)鐘將系統(tǒng)時(shí)鐘同步到硬件時(shí)鐘/sbin/hwclock systohc 腳本調(diào)試方法n在 bash 調(diào)用腳本時(shí)使用參數(shù)$ bash -x -n -v scriptNamen在腳本中使用 bash 內(nèi)置的 set 命令使整個(gè)或部分腳本處于調(diào)試模式開啟:開啟:set -x -n -v結(jié)束:結(jié)束:set +x +n +v2022年7月4日11腳本調(diào)試 12022年7月4日12sh x 腳本名該選項(xiàng)可以使用戶跟蹤腳本的執(zhí)行,此時(shí) shell 對腳本中每條命令的處
8、理過程為:先執(zhí)行替換,然后顯示,再執(zhí)行它。shell 顯示腳本中的行時(shí),會(huì)在行首添加一個(gè)加號 “ + ”。sh v 腳本名在執(zhí)行腳本之前,按輸入的原樣打印腳本中的各行。sh n 腳本名對腳本進(jìn)行語法檢查,但不執(zhí)行腳本。如果存在語法錯(cuò)誤,shell 會(huì)報(bào)錯(cuò),如果沒有錯(cuò)誤,則不顯示任何內(nèi)容。腳本調(diào)試舉例 1n對腳本進(jìn)行語法檢查$ bash -n greetings.shn顯示腳本中每個(gè)原始命令行及其執(zhí)行結(jié)果$ bash -v greetings.shn以調(diào)試模式執(zhí)行腳本$ bash -x greetings.sh2022年7月4日13腳本調(diào)試 2 set命令n在腳本內(nèi)使用set命令開啟調(diào)試選項(xiàng)qs
9、et -x :顯示由shell執(zhí)行的命令及其參數(shù)qset -v :顯示由shell讀入的命令行qset -n :讀取命令但不執(zhí)行他們,用于語法檢查n在腳本內(nèi)使用set命令關(guān)閉已開啟的調(diào)試選項(xiàng)qset +xqset +vqset +n2022年7月4日14腳本調(diào)試舉例 2$ bash greetings.sh./greetings.sh$ source greetings.sh2022年7月4日15#!/bin/bash# This is the first Bash shell program # Scriptname: greetings.shset -x # Turn ON debug m
10、ode #echoecho -e Hello $LOGNAME, cecho its nice talking to you.echo -n Your present working directory is: pwd # Show the name of present directoryechoset +x # Turn OFF debug mode #echo -e The time is date +%T!. nByeechoShell腳本的類型n非交互式腳本q不需要讀取用戶的輸入, 也不用向用戶反饋某些信息q每次執(zhí)行都是可預(yù)見的, 因?yàn)樗蛔x取用戶輸入, 參數(shù)是固定的q可以在后臺執(zhí)行
11、n交互式腳本q腳本可以讀取用戶的輸入, 實(shí)時(shí)向用戶反饋信息(輸出某些信息)q這樣的腳本更靈活, 每次執(zhí)行時(shí)的參數(shù)可由用戶動(dòng)態(tài)設(shè)定q用戶界面更友好,但不適用于自動(dòng)化任務(wù)(如cron任務(wù))2022年7月4日16學(xué)習(xí)Shell編程的前提n掌握一種文本編輯器的使用(Vi)n熟悉 Linux 文件系統(tǒng)的布局n學(xué)習(xí) Shell 的各種功能q重定向、管道、命令替換、命令聚合n學(xué)習(xí)各種管理和監(jiān)視命令的使用q用戶管理、權(quán)限管理、進(jìn)程管理、包管理q系統(tǒng)監(jiān)視、網(wǎng)絡(luò)監(jiān)視 n學(xué)習(xí)各種文本文件工具的使用qcat、grep、tr、sed、awk q正則表達(dá)式2022年7月4日17系統(tǒng)的配置文件幾乎都是純文本文件變量和表達(dá)式
12、變量和表達(dá)式2022年7月4日18Shell 變量操作變量操作n變量替換擴(kuò)展q變量測試q變量的字符串操作q變量的間接引用n變量的數(shù)值計(jì)算q$expression q$(expression)qexprqletqdeclare -i2022年7月4日19n輸入q變量賦值nname=valuenreadonlyq從標(biāo)準(zhǔn)輸入讀取nreadn輸出qechoqprintf變量替換擴(kuò)展變量測試2022年7月4日20Use Default Values$var:-word若若var存在且非空存在且非空,則值為則值為$var;若若var未定義或?yàn)榭罩滴炊x或?yàn)榭罩?則值為則值為word,但,但var的值不變。
13、的值不變。Assign Default Values$var:=word若若var存在且非空存在且非空,則值為則值為$var;若若var未定義或?yàn)榭罩滴炊x或?yàn)榭罩?則值為則值為word,且,且var被賦值被賦值word。Display Error if Null or Unset$var:?word若若var存在且非空存在且非空,則值為則值為$var;若若var未定義或?yàn)榭罩滴炊x或?yàn)榭罩?則輸出信則輸出信息息word,并終止腳本。,并終止腳本。Use Alternate Value$var:+word若若var存在且非空存在且非空,則值為則值為word;否則返回空值,但否則返回空值,但va
14、r的值不變。的值不變。變量測試舉例2022年7月4日21color=bluenewcolor=$color:-greyunset colorecho The sky is $color:-grey todayecho $color echo The sky is $color:=grey todayecho $color echo The sky is $color:?error todayecho $color echo The sky is $color:+blue todayecho $color 變量替換擴(kuò)展 字符串計(jì)數(shù)、截取2022年7月4日22$#var返回字符串變量返回字符串變量
15、 var 的長度的長度$var:m返回返回$var中從中從第第m個(gè)字符到最后個(gè)字符到最后的部分的部分$var:m:len返回返回$var中從中從第第m個(gè)字符開始,長度為個(gè)字符開始,長度為len的部分的部分$var#pattern刪除刪除$var中中開頭開頭部分與部分與pattern匹配的匹配的最小最小部分部分$var#pattern 刪除刪除$var中中開頭開頭部分與部分與pattern匹配的匹配的最大最大部分部分$var%pattern刪除刪除$var中中結(jié)尾結(jié)尾部分與部分與pattern匹配的匹配的最小最小部分部分$var%pattern 刪除刪除$var中中結(jié)尾結(jié)尾部分與部分與patte
16、rn匹配的匹配的最大最大部分部分m 的取值從的取值從 0 到到 $#var-1注:注:pattern 中可以使用中可以使用通配符通配符。字符串變量替換擴(kuò)展舉例12022年7月4日23str=I love linux. I love UNIX too.echo $#str30echo $#str:13I love UNIX too.echo $#str:7:5linuxecho $str#I lovelinux. I love UNIX too.echo $str#I*.I love UNIX too.echo $str#I* 變量替換擴(kuò)展 字符串替換2022年7月4日24$var/old/ne
17、w用用new替換替換$var中第一次出現(xiàn)的中第一次出現(xiàn)的old$var/old/new用用new替換替換$var中所有的中所有的old(全局替換全局替換)$var/#old/new用用new替換替換$var中中開頭開頭部分與部分與old匹配的部分匹配的部分$var/%old/new用用new替換替換$var中中結(jié)尾結(jié)尾部分與部分與old匹配的部分匹配的部分注:注:(1)old 中可以使用中可以使用 通配符通配符。(2)var 可以是可以是 或或 *,表示對每個(gè)位置參數(shù)進(jìn)行替換,表示對每個(gè)位置參數(shù)進(jìn)行替換字符串變量替換擴(kuò)展舉例22022年7月4日25str=I love linux. I lov
18、e UNIX too.echo $str/love/likeI like linux. I love UNIX too.echo $str/love/likeI like linux. I like UNIX too.echo $str/I*linux/I like FreeBSDI like FreeBSD. I love UNIX too.echo $str/#I love/JaimeJaime linux. I love UNIX too.echo $str/I love/JaimeJaime linux. Jaime UNIX too. echo $str/%too./also.I l
19、ove linux. I love UNIX also.字符串變量替換擴(kuò)展舉例32022年7月4日26set 1v1 1v2 1v3 1v4echo $1v1 1v2 1v3 1v4echo $/1/aav1 av2 av3 av4echo $/1/aava av2 av3 av4echo $/%1/a1va 1v2 1v3 1v4變量的間接引用n通過 str2 的值來引用 str1 的值2022年7月4日27str1=Hello Worldstr2=str1echo $str2 bash2.0以上才支持以上才支持newstr=$!str2echo $newstrHello World或或ec
20、ho $!str2Hello World eval newstr=$str2echo $newstrHello World或或eval echo $str2Hello World ?變量的間接引用(續(xù))2022年7月4日28n通過 x 的值來引用 CENTOS_URL 的值x=CENTOSCENTOS_URL=http:/ bash2.0以上才支持以上才支持newstr=$x_URLecho $newstrCENTOS_URLecho $!newstrhttp:/ eval newstr=$x_URLecho $newstr或或eval echo $x_URLShell內(nèi)置命令eval2022
21、年7月4日29listpage=ls -l | moreeval $listpageeval $(ssh-agent)eval newstr=$str2eval echo $x_URL eval arg1 arg2 . argNl對參數(shù)進(jìn)行兩次掃描和替換l 將所有的參數(shù)連接成一個(gè)表達(dá)式,并計(jì)算或執(zhí)行該表達(dá)式l 參數(shù)中的任何變量都將被展開Shell 變量的分類變量的分類n用戶自定義變量用戶自定義變量q由用戶自己定義、修改和使用nShell Shell 環(huán)境變量環(huán)境變量q由系統(tǒng)維護(hù),用于設(shè)置用戶的Shell工作環(huán)境q只有少數(shù)的變量用戶可以修改其值n位置參數(shù)變量位置參數(shù)變量(Positional P
22、arameters)q通過命令行給程序傳遞執(zhí)行參數(shù)q可用 shift 命令實(shí)現(xiàn)位置參數(shù)的遷移n專用參數(shù)變量專用參數(shù)變量(Special Parameters)qBash 預(yù)定義的特殊變量q用戶不能修改其值2022年7月4日30位置參數(shù)變量n是一組特殊的內(nèi)置變量q跟在腳本名后面的用空格隔開的每個(gè)字符串q$1 表示第1個(gè)參數(shù)值,$9 表示第9個(gè)參數(shù)值q$10 表示第10個(gè)參數(shù)值, $11 表示第11個(gè)參數(shù)值, n位置參數(shù)的用途q從 shell 命令/腳本 的命令行接受參數(shù)q在調(diào)用 shell 函數(shù)時(shí)為其傳遞參數(shù)2022年7月4日31專用參數(shù)變量n命令行參數(shù)相關(guān)命令行參數(shù)相關(guān)q$* 將所有位置參量看
23、成一個(gè)字符串(以空格間隔) 。q$ 將每個(gè)位置參量看成單獨(dú)的字符串(以空格間隔)。q “$*” 將所有位置參量看成一個(gè)字符串(以$IFS間隔)。q “$” 將每個(gè)位置參量看成單獨(dú)的字符串(以空格間隔) 。q$0 命令行上輸入的Shell程序名。q$# 表示命令行上參數(shù)的個(gè)數(shù)。n進(jìn)程狀態(tài)相關(guān)進(jìn)程狀態(tài)相關(guān)q$? 表示上一條命令執(zhí)行后的返回值q$ 當(dāng)前進(jìn)程的進(jìn)程號q$! 顯示運(yùn)行在后臺的最后一個(gè)作業(yè)的 PID q$_ 在此之前執(zhí)行的命令或腳本的最后一個(gè)參數(shù)2022年7月4日32位置參數(shù)和專用參數(shù)舉例n執(zhí)行腳本$ ./vartest.sh 1 2 3 4 5 a b c d e f g2022年7月4
24、日33#!/bin/bash# ScriptName: vartest.sh# To test Positional Parameters & Special Parameters.echo Hello,$USER,the output of this script are as follows:echo The script name is : $(basename $0)echo The first param of the script is : $1echo The second param of the script is : $2echo The tenth param o
25、f the script is : $10echo All the params you input are : $echo All the params you input are : $*echo The number of the params you input are: $#echo The process ID for this script is : $echo The exit status of this script is : $?”$、$*和環(huán)境變量IFS2022年7月4日34n執(zhí)行腳本$ ./ifsargs.sh 1 2 3 4 5 a b c d e f g#!/bi
26、n/bash# ScriptName: ifsargs.sh# Set the IFS to | #IFS=|echo Command-Line Arguments Demo“echo * All args displayed using $ positional parameter *echo $echo * All args displayed using $* positional parameter *echo $*echo * All args displayed using $ positional parameter *echo $ #* double quote added *
27、#echo * All args displayed using $* positional parameter *echo $* #* double quote added *#位置參數(shù)和 shift 命令n將位置參量列表依次左移n次,缺省為左移一次n一旦位置參量列表被移動(dòng),最左端的那個(gè)參數(shù)就會(huì)從列表中刪除n經(jīng)常與循環(huán)結(jié)構(gòu)語句一起使用,以便遍歷每一個(gè)位置參數(shù)2022年7月4日 35shift n#!/bin/sh# ScriptName: pp_shift.sh# To test Positional Parameters & Shift.echo The script name i
28、s : $0echo $1=$1,$2=$2,$3=$3,$4=$4 - $#=$# echo $: $ shift # 向左移動(dòng)所有的位置參數(shù)向左移動(dòng)所有的位置參數(shù)1次次echo $1=$1,$2=$2,$3=$3,$4=$4 - $#=$#echo $: $shift 2 # 向左移動(dòng)所有的位置參數(shù)向左移動(dòng)所有的位置參數(shù)2次次echo $1=$1,$2=$2,$3=$3,$4=$4 - $#=$#echo $: $ ./pp_shift.sh 1 b 3 d 4 f退出/返回狀態(tài)n$?:返回上一條語句或腳本執(zhí)行的狀態(tài)返回上一條語句或腳本執(zhí)行的狀態(tài)q0:成功q1255:不成功nexit 命令
29、命令qexit 命令用于退出腳本或當(dāng)前Shell nn 是一個(gè)從 0 到 255 的整數(shù)n0 表示成功退出,非零表示遇到某種失敗n返回值 被保存在狀態(tài)變量 $? 中2022年7月4日36exit n常見的返回狀態(tài)碼n0:n執(zhí)行正確n1:n通用錯(cuò)誤n126:n命令或腳本沒有執(zhí)行權(quán)限n127:n命令沒找到2022年7月4日37$ echo $ # 顯示當(dāng)前進(jìn)程的顯示當(dāng)前進(jìn)程的 PID9245$ echo $? # 顯示在此之前執(zhí)行的命令的返回值顯示在此之前執(zhí)行的命令的返回值0$ bash # 調(diào)用子調(diào)用子Shell$ echo $ # 顯示當(dāng)前進(jìn)程的顯示當(dāng)前進(jìn)程的 PID9474$ exit 1
30、# 指定返回值并返回父指定返回值并返回父Shell$ echo $? # 顯示上一個(gè)顯示上一個(gè)Shell/腳本的返回值腳本的返回值1$ list # 執(zhí)行不存在的命令執(zhí)行不存在的命令bash: list: command not found$ echo $?127$ touch bbb.sh$ ./bbb.sh # 執(zhí)行不具有執(zhí)行權(quán)限的命令執(zhí)行不具有執(zhí)行權(quán)限的命令bash: ./bbb.sh: Permission denied$ echo $?126readn從鍵盤輸入內(nèi)容為變量賦值qread -p 信息信息 var1 var2 .q若省略變量名,則將輸入的內(nèi)容存入REPLY變量n結(jié)合不同的
31、引號為變量賦值q雙引號 ” ”:允許通過$符號引用其他變量值q單引號 :禁止引用其他變量值,$視為普通字符q反撇號 :將命令執(zhí)行的結(jié)果輸出給變量n更多read的用法參見q/guide/Getting_User_Input_Via_Keyboard2022年7月4日38read 舉例2022年7月4日39#!/bin/bash# This script is to test the usage of read# Scriptname: ex4read.shecho = examples for testing read =echo -e What
32、is your name? cread nameecho Hello $nameechoecho -n Where do you work? readecho I guess $REPLY keeps you busy!echoread -p Enter your job title: echo I thought you might be an $REPLY.echoecho = End of the script =只讀變量n舉例2022年7月4日40q 只讀變量readonly variable是指不能被清除或重新賦值的變量。lrjcentos1 $ myname=Osmondlrjce
33、ntos1 $ echo $mynameOsmondlrjcentos1 $ readonly mynamelrjcentos1 $ unset myname-bash: unset: myname: cannot unset: readonly variablelrjcentos1 $ myname=Osmond Liang-bash: myname: readonly variablelrjcentos1 $同時(shí)輸出多行信息n使用 echon使用 here file2022年7月4日41echo Line1Line2Line3cat _END_Line1Line2Line3_END_ 多行
34、內(nèi)容中不能出現(xiàn)雙引號,否則多行內(nèi)容中不能出現(xiàn)雙引號,否則 echo 提前結(jié)束提前結(jié)束 若確實(shí)需要使用雙引號,需使用轉(zhuǎn)義字符:若確實(shí)需要使用雙引號,需使用轉(zhuǎn)義字符: _END_可以是任意字符串,只要上下一致即可可以是任意字符串,只要上下一致即可 多行內(nèi)容中不能出現(xiàn)內(nèi)容為多行內(nèi)容中不能出現(xiàn)內(nèi)容為_END_開始開始的行,否的行,否則則 cat 提前結(jié)束提前結(jié)束整數(shù)運(yùn)算nBash 變量沒有嚴(yán)格的類型定義q本質(zhì)上 Bash 變量都是字符串n若一個(gè)字面常量或變量的值是純數(shù)字的,不包含字母或其他字符, Bash可以將其視為長整型值,并可做算數(shù)運(yùn)算和比較運(yùn)算。nBash 也允許顯式地聲明整型變量qdeclar
35、e -i 變量名2022年7月4日42算數(shù)運(yùn)算符2022年7月4日43+、 -、 *、 / (四則運(yùn)算)(四則運(yùn)算)*、 % (冪運(yùn)算(冪運(yùn)算 和和 模運(yùn)算,取余數(shù))模運(yùn)算,取余數(shù)) (按位左移(按位左移 和和 按位右移)按位右移)&、 、 | (按位(按位與與 、按位、按位異或異或 和和 按位按位 或或)=、 +=、 -= 、 *=、 /= 、 %= = 、 &=、 =、 |= (賦值運(yùn)算)(賦值運(yùn)算)、 =、 =、 != (比較操作符)(比較操作符)&、 | (邏輯(邏輯與與 和和 邏輯邏輯 或或)注:按位運(yùn)算是以二進(jìn)制形式進(jìn)行的。算術(shù)運(yùn)算擴(kuò)展2022年7月4日44
36、$expression $(expression)num1=$4+1; echo $num1num1=$($num1*2-3); echo $num1注意 $,$(),$,$() 的不同作用用 $,$() 進(jìn)行整數(shù)運(yùn)算時(shí),括號內(nèi)變量前的美元符號 $ 可以省略。(num2=2+3*2-1001%5); echo $num2num2=$(2+3*2-1001%5); echo $num2echo $(2+3*2-1001%5)Shell內(nèi)置命令letnlet 內(nèi)置命令用于算術(shù)運(yùn)算2022年7月4日45num2=1; echo $num2let num2=4+1; echo $num2let num
37、2=$num2+1; echo $num2l 賦值符號和運(yùn)算符兩邊不能留空格!l 如果將字符串賦值給一個(gè)整型變量時(shí),則變量的值為 0l 如果變量的值是字符串,則進(jìn)行算術(shù)運(yùn)算時(shí)設(shè)為 0let num2=4 + 1let num2=4 + 1 # 用引號忽略空格的特殊含義用引號忽略空格的特殊含義用用 let 命令進(jìn)行算術(shù)運(yùn)算時(shí),最好加雙引號。命令進(jìn)行算術(shù)運(yùn)算時(shí),最好加雙引號。exprn通用的表達(dá)式計(jì)算命令q表達(dá)式中參數(shù)與操作符必須以空格分開。q表達(dá)式中的運(yùn)算可以是算術(shù)運(yùn)算,比較運(yùn)算,字符串運(yùn)算和邏輯運(yùn)算。2022年7月4日46man exprexpr 5 % 3expr 5 * 3 # 乘法符號必
38、須被轉(zhuǎn)義乘法符號必須被轉(zhuǎn)義expr 2 + 5 * 2 - 3 % 2expr ( 2 + 5 ) * 2 3 # 括號必須被轉(zhuǎn)義括號必須被轉(zhuǎn)義浮點(diǎn)數(shù)運(yùn)算nbash 只支持整數(shù)運(yùn)算n可以通過使用 bc 或 awk 工具來處理浮點(diǎn)數(shù)運(yùn)算2022年7月4日47n=$(echo scale=3; 13/2 | bc )echo $nm=awk BEGINx=2.45;y=3.123; printf %.3fn, x*yecho $mprintf 命令2022年7月4日48q printf 可用來按指定的格式輸出變量printf format 輸出參數(shù)列表輸出參數(shù)列表printf %-12.5fn 1
39、23.456format以%開頭flagfield widthprecision格式符格式符-:左對齊左對齊+:輸出符號輸出符號0:空白處添空白處添0空格空格:前面加一空格前面加一空格字段寬度小數(shù)點(diǎn)后輸出位數(shù)printf 命令(續(xù))2022年7月4日49printf 命令的格式說明符c字符型字符型g/G浮點(diǎn)數(shù)(自動(dòng))浮點(diǎn)數(shù)(自動(dòng))d十進(jìn)制整數(shù)十進(jìn)制整數(shù)o八進(jìn)制八進(jìn)制e/E 浮點(diǎn)數(shù)(科學(xué)計(jì)數(shù)法)浮點(diǎn)數(shù)(科學(xué)計(jì)數(shù)法)s字符串字符串f浮點(diǎn)數(shù)(小數(shù)形式)浮點(diǎn)數(shù)(小數(shù)形式)x/X十六進(jìn)制十六進(jìn)制format 中還可以使用a警鈴警鈴t水平制表符水平制表符b退后一格退后一格v垂直制表符垂直制表符n換行換行反
40、斜杠反斜杠f換頁換頁”雙引號雙引號r回車回車%百分號百分號printf 命令舉例2022年7月4日50printf The number is: %.2fn 100printf %-20s|%12.5f|n Joy 10printf %-10d%010o%+10 xn 20 20 20printf %6dt%6o%6xn 20 20 20例:數(shù)組變量2022年7月4日51q Bash 2.x 以上支持一維數(shù)組,下標(biāo)從 0 開始。variable=(item1 item2 item2 . )variablen=valuedeclare -a variablevariable=(item1 ite
41、m2 item2 . )q 數(shù)組的引用$variablenq 使用 declare 聲明或直接給變量名加下標(biāo)來賦值。數(shù)組變量舉例2022年7月4日52declare -a stustu=(math1101 math1102 math1103)echo $stu0 # 列出列出stu的第一個(gè)元素的第一個(gè)元素echo $stu* # 列出列出stu的所有元素的所有元素echo $#stu* # 給出數(shù)組給出數(shù)組stu中元素的個(gè)數(shù)中元素的個(gè)數(shù)q 數(shù)組與數(shù)組元素的刪除unset stu1 # 刪除刪除stu的第二個(gè)元素的第二個(gè)元素unset stu # 刪除刪除整個(gè)數(shù)組整個(gè)數(shù)組q 數(shù)組賦值時(shí)無須按順序
42、賦值x3=100; echo $x*state=(ME 3=CA 2=NT); echo $state*Shell內(nèi)置命令declare2022年7月4日53q 內(nèi)置命令 declare 可用來聲明變量。declare 選項(xiàng)選項(xiàng) variable=value選項(xiàng)選項(xiàng)含義含義-r將變量設(shè)為只讀將變量設(shè)為只讀 ( readonly )-x將變量輸出到子將變量輸出到子 shell 中(中(export 為全局變量)為全局變量)-i將變量設(shè)為整型將變量設(shè)為整型 ( integer )-a將變量設(shè)置為一個(gè)數(shù)組將變量設(shè)置為一個(gè)數(shù)組 ( array )-f列出函數(shù)的名字和定義列出函數(shù)的名字和定義 ( fun
43、ction )-F只列出函數(shù)名只列出函數(shù)名declare 舉例2022年7月4日54declare r myname=osmondunset mynamedeclare myname=“Osmond Liangdeclare x myname2=lrjmyname2=lrjdeclare x myname2declaredeclare myname=osmond例:變量及相關(guān)命令小結(jié)12022年7月4日55echo $variable 或或 echo $variableunset variablesetreadonly variableexport variable=valueexport -
44、n variable export -pdeclare 選項(xiàng)選項(xiàng) variable=value變量及相關(guān)命令小結(jié)22022年7月4日56basename dirname let 或或 expr$var:-word、$var:=word、$var:?word、$var:+word$0、$1-$9、$n、$#、$*、$、$、$!、$?、$-eval newstr=$str2 、newstr=$!str2hostname 、$(hostname)basename pwd 、 $(basename $(pwd)$expression 、$(expression)變量及相關(guān)命令小結(jié)32022年7月4日5
45、7q 輸入read var1 var2 .readread p 提示提示q 輸出printf %-12.5f t %d n 123.45 8format以以%開頭開頭flagfield widthprecision格式符格式符-:左對齊左對齊+:輸出符號輸出符號0:空白處添空白處添0空格空格:前面加一空格前面加一空格字段寬度字段寬度小數(shù)點(diǎn)后輸出位數(shù)小數(shù)點(diǎn)后輸出位數(shù)cdefgsoxbnrtv”% REPLY REPLY輸出參數(shù)用空格隔開輸出參數(shù)用空格隔開條件測試條件測試2022年7月4日58條件測試簡介n條件測試可以判斷某個(gè)特定條件是否滿足q測試之后通常會(huì)根據(jù)不同的測試值選擇執(zhí)行不同任務(wù)n條件測
46、試的種類q命令成功或失敗q表達(dá)式為真或假n條件測試的值qBash中沒有布爾類型變量n退出狀態(tài)為 0 表示命令成功或表達(dá)式為真n非非0 則表示命令失敗或表達(dá)式為假q狀態(tài)變量 $? 中保存了退出狀態(tài)的值2022年7月4日59條件測試舉例(1)2022年7月4日60$ User=osmond$ grep $User /etc/passwd$ echo $? $ grep $User /etc/passwd /dev/null & echo “$User is a user in /etc/passwd.” | echo “$User isnt a user in /etc/passwd.”$
47、 Host=centos1$ ping c 1 $Host$ echo $? $ ping c 1 $Host /dev/null & echo “$Host is up.” | echo “$Host is down.”條件測試語句n語句q格式1: test q格式2: q格式3: (bash 2.x 版本以上)n說明q格式1 和 格式2 是等價(jià)的,格式3是擴(kuò)展的 test 命令q在 中可以使用通配符進(jìn)行模式匹配可以使用通配符進(jìn)行模式匹配q&, |, 能夠正常存在于 中,但不能在 中出現(xiàn)q和之后的字符必須為空格,和之前的字符必須為空格q要對整數(shù)進(jìn)行關(guān)系運(yùn)算也可以使用 () 進(jìn)
48、行測試2022年7月4日61條件測試操作符n條件測試表達(dá)式中可用的操作符q文件測試操作符q字符串測試操作符q整數(shù)二元比較操作符q使用邏輯運(yùn)算符2022年7月4日62文件測試2022年7月4日63 -f fname fname 存在且是普通文件時(shí),返回真 ( 即返回 0 ) -L fname fname 存在且是鏈接文件時(shí),返回真 -d fname fname 存在且是一個(gè)目錄時(shí),返回真 -e fname fname(文件或目錄)存在時(shí),返回真 -s fname fname 存在且大小大于 0 時(shí),返回真 -r fname fname(文件或目錄)存在且可讀時(shí),返回真 -w fname fnam
49、e(文件或目錄)存在且可寫時(shí),返回真 -x fname fname(文件或目錄)存在且可執(zhí)行時(shí),返回真q測試:文件是否存在,文件屬性,訪問權(quán)限等。l 更多文件測試符參見 test 的在線幫助man test使用lftp同步y(tǒng)um倉庫2022年7月4日64#!/bin/bash# Script Name: sync_iredmail_yum_repo.shDIST=5ARCH=i386EXCL_ARCH=x86_64 SRC=/yum/rpms/$DIST/DST=/var/ftp/yum/repos/iredmail/$DIST/$ARCH/ ! -e $D
50、ST & mkdir -p $DSTexcludes=($EXCL_ARCH)|(repodata)cd $DSTlftp -e set mirror:exclude-regex $excludes & mirror -delete -only-newer -verbose & exit $SRCcreaterepo . /dev/null使用reposyncreposync同步倉庫2022年7月4日65#!/bin/bash# Script Name: sync_atomic-repo_with_reposync.shARCH=i386url=http:/ -U $u
51、rl/$ARCH/RPMS/$releaserpm -import /etc/pki/rpm-gpg/RPM-GPG-KEY.art.txtn使用 reposync 同步倉庫之前首先要配置倉庫q安裝 atomic-release 的RPM包q導(dǎo)入其RPM公鑰n對 yum 和 reposync 使用不同的配置文件qyum 使用本地倉庫配置以加快更新速度n/etc/yum.conf 和 /etc/yum.repos.d/atomic.repoqreposync 使用運(yùn)程倉庫配置n/etc/reposync.conf 和 /etc/yum/repos.d/atomic.repo使用reposyncr
52、eposync同步倉庫續(xù)12022年7月4日66 ! -f /etc/reposync.conf & (cp /etc/yum.conf /etc/reposync.conf ;echo reposdir=/etc/yum.repos.d /etc/yum.conf ;echo reposdir=/etc/yum/repos.d /etc/reposync.conf ;mkdir /etc/yum/repos.d ;mv /etc/yum.repos.d/atomic.repo /etc/yum/repos.d ; cat /etc/yum.repos.d/atomic.repoato
53、micname = CentOS / Red Hat Enterprise Linux $releasever - baseurl = file:/var/ftp/yum/repos/atomic/centos/5/$ARCH/atomicenabled = 1priority = 1protect = 0gpgkey = file:/etc/pki/rpm-gpg/RPM-GPG-KEY.art.txtgpgcheck = 1_END_)n配置對 yum 和 reposync 使用不同的配置文件q僅當(dāng) /etc/reposync.conf 不存在時(shí)執(zhí)行一次 ()使用reposyncrepos
54、ync同步倉庫續(xù)22022年7月4日67DST=/var/ftp/yum/repos/atomic/centos/5/$ARCH ! -e $DST & mkdir -p $DST | cd $DST/usr/bin/yum clean all/usr/bin/reposync -arch=$ARCH -repoid=atomic -d -c /etc/reposync.confcd atomic /usr/bin/createrepo ./usr/bin/yum clean alln若本地同步的目標(biāo)目錄不存在創(chuàng)建之,否則進(jìn)入之n使用 reposync 同步倉庫的RPM文件q-a, -
55、arch: 指定架構(gòu)指定架構(gòu) (i386、x86_64)q-r, -repoid: 指定要同步的倉庫名指定要同步的倉庫名q-d, -delete: 刪除本地存在而遠(yuǎn)程已經(jīng)不存在的文件刪除本地存在而遠(yuǎn)程已經(jīng)不存在的文件q-c, -config: 指定指定 reposync 使用的配置文件使用的配置文件n使用 createrepo 創(chuàng)建倉庫(repodata)字符串測試2022年7月4日68 -z string 如果字符串如果字符串string長度為長度為0,返回真,返回真 -n string 如果字符串如果字符串string長度不為長度不為0,返回真,返回真 str1 = str2 兩字符串相等
56、(也可使用兩字符串相等(也可使用 = )返回真)返回真 str1 != str2 兩字符串不等返回真兩字符串不等返回真 str1 = str2 兩字符串相同返回真兩字符串相同返回真 str1 != str2 兩字符串不相同返回真兩字符串不相同返回真 str1 = str2 str2是是str1的子串返回真的子串返回真 str1 str2 str1大于大于str2返回真返回真 str1 int2) int1 大于大于 int2 返回真返回真(int1 = int2) int1 大于或等于大于或等于 int2 返回真返回真(int1 int2) int1 小于小于 int2 返回真返回真(int1
57、 $m ; echo $?1$ (nm) ; echo $?1$ ($n$m) ; echo $?1$ nm ; echo $?0$ a=linux ; b=unix$ n=5 ; m=7$ $a != $b & echo T | echo FT$ $a != $b & echo T| echo FT$ $n -gt $m & echo T | echo FT$ $n$m & echo T | echo FF$ (nm) & echo T | echo FF$ ($n$m) & echo T | echo FF$ nm & echo T
58、| echo FT條件測試舉例(3)2022年7月4日73name=Tom; -z $name ; echo $?name2=Andy; $name = $name2 ; echo $?name=Tom $name = Tt? echo $?name=Tom $name = Tt? echo $?方括號前后要留空格!x=1; $x -eq 1 ; echo $?x=a; $x -eq 1 ; echo $?XX內(nèi)不能使用通配符!邏輯測試2022年7月4日74 pattern1 & pattern2 邏輯與 pattern1 | pattern2 邏輯或 ! pattern 邏輯非 ex
59、pr1 -a expr2 邏輯與,都為真時(shí),結(jié)果為真 expr1 -o expr2 邏輯或,有一個(gè)為真時(shí),結(jié)果為真 ! expr 邏輯非( expr1 & expr2 )邏輯與( expr1 | expr2 )邏輯或( ! expr )邏輯非條件測試舉例(4)2022年7月4日75 $x = 1 & $name = To? ; echo $?x=1; name=Tom; $x -eq 1 a n $name ; echo $?注:不能隨便添加括號 ( $x -eq 1 ) a ( n $name ) ; echo $?X( $x = 1 & $name = To? );
60、 echo $?注:不能在 () 中做字符串比較( $x = 1 ) & $name = To? ; echo $?此處的此處的 & 并非邏輯運(yùn)算符,而是命令聚合(并非邏輯運(yùn)算符,而是命令聚合(Command Group)X流程控制流程控制分支分支2022年7月4日76流程控制語句q分支q if 條件語句q case 選擇語句q循環(huán)q for 循環(huán)語句q while 循環(huán)語句q until 循環(huán)語句q select 循環(huán)與菜單2022年7月4日77q循環(huán)控制qbreak 語句qcontinue 語句q位置參數(shù)處理q shift 命令q getopts 命令 分支結(jié)構(gòu)if 語句語法2022年7月4日78if expr1 # 如果如果 expr1 為真為真(返回值為返回值為0)then # 那么那么 commands1 # 執(zhí)行語句塊執(zhí)行語句塊 commands1elif
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年仙居縣人民醫(yī)院招聘工作人員考試真題
- 中標(biāo)后催業(yè)主簽合同范例
- 2024年新疆昌吉學(xué)院(團(tuán)隊(duì))引進(jìn)筆試真題
- 鄉(xiāng)村承包開發(fā)合同范本
- 人員反聘合同范本
- 云梯租賃合同范本
- app開發(fā)服務(wù)合同范本
- 勞務(wù)合同范例放牧
- 《五、標(biāo)明引用內(nèi)容的出處》教學(xué)設(shè)計(jì)教學(xué)反思-2023-2024學(xué)年初中信息技術(shù)人教版七年級上冊
- 農(nóng)村電器購銷合同范本
- (高職)員工培訓(xùn)與開發(fā)(第四版)完整版教學(xué)課件全套電子教案
- 《跨境電商B2B操作實(shí)務(wù)》教學(xué)大綱
- 河口區(qū)自然資源
- 精益改善項(xiàng)目管理制度
- 2012數(shù)據(jù)結(jié)構(gòu)英文試卷A及答案
- 第四章工具鋼
- 服裝購銷合同最新版
- 機(jī)翼結(jié)構(gòu)(課堂PPT)
- 二次回路施工驗(yàn)收
- 危險(xiǎn)廢物利用和處置方式代碼表
- 井下使用切割機(jī)安全技術(shù)措施
評論
0/150
提交評論