版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1.進(jìn)程管理01進(jìn)程概述02進(jìn)程管理03作業(yè)控制本章內(nèi)容要點01理解進(jìn)程相關(guān)概念02掌握如何運行后臺進(jìn)程及注銷后繼續(xù)執(zhí)行03掌握進(jìn)程管理命令的使用本章學(xué)習(xí)目標(biāo)04掌握作業(yè)控制的命令及快捷鍵的使用程序、進(jìn)程和作業(yè)程序(program)程序是機(jī)器指令的集合,文件形式存儲進(jìn)程(process)進(jìn)程是一個程序在其自身的虛擬地址空間中的一次執(zhí)行活動程序、進(jìn)程和作業(yè)作業(yè)/任務(wù)(job/task)用戶通過操作系統(tǒng)用戶接口(Shell或X環(huán)境)提交給計算機(jī)進(jìn)行加工處理的程序。如用戶發(fā)出一個打印命令,就產(chǎn)生一個打印作業(yè)/任務(wù)進(jìn)程和程序概念的比較程序進(jìn)程一個靜態(tài)的指令集合。是一個程序的動態(tài)執(zhí)行過程,它具有生命期,是動態(tài)的產(chǎn)生和消亡的。進(jìn)程和程序概念的比較進(jìn)程資源申請、調(diào)度和獨立運行的單位,因此,它使用系統(tǒng)中的運行資源。程序不能申請系統(tǒng)資源、不能被系統(tǒng)調(diào)度、也不能作為獨立運行的單位,因此,它不占用系統(tǒng)的運行資源。進(jìn)程和程序概念的比較進(jìn)程一方面一個程序可以由多個進(jìn)程所共用,即一個程序在運行過程中可以產(chǎn)生多個進(jìn)程。程序另一方面,一個進(jìn)程在生命期內(nèi)可以順序的執(zhí)行若干個程序。程序和進(jìn)程無一一對應(yīng)的關(guān)系進(jìn)程進(jìn)程是一個動態(tài)實體進(jìn)程是處理器通過操作系統(tǒng)調(diào)度的基本單位每個進(jìn)程的執(zhí)行都獨立于系統(tǒng)中的其它進(jìn)程進(jìn)程之間可以通過稱為進(jìn)程間通信(IPC)的機(jī)制進(jìn)行交互當(dāng)進(jìn)程之間共享數(shù)據(jù)時,操作系統(tǒng)使用了同步技術(shù)來保證共享的合法性Linux是多用戶多任務(wù)系統(tǒng)當(dāng)多個用戶同時在一個系統(tǒng)上工作時,Linux要能夠同時滿足用戶們的要求,而且還要使用戶感覺不到系統(tǒng)在同時為多個用戶服務(wù),就好像每一個用戶都單獨擁有整個系統(tǒng)一樣。每個用戶均可同時運行多個程序。為了區(qū)分每一個運行的程序,Linux給每個進(jìn)程都做了標(biāo)識,稱為進(jìn)程號(processID),每個進(jìn)程的進(jìn)程號是唯一的。Linux是多用戶多任務(wù)系統(tǒng)Linux給每個進(jìn)程都打上了運行者的標(biāo)志,用戶可以控制自己的進(jìn)程:給自己的進(jìn)程分配不同的優(yōu)先級,也可以隨時終止自己的進(jìn)程。進(jìn)程從執(zhí)行它的用戶處繼承UID、GID,從而決定對文件系統(tǒng)的存取和訪問。Linux的多任務(wù)實現(xiàn)——分時技術(shù)Linux不可能在一個CPU上同時處理多個任務(wù)(作業(yè))請求,而是采用“分時”技術(shù)來處理這些任務(wù)請求分時技術(shù)所有的任務(wù)請求被排除一個隊列,系統(tǒng)按順序每次從這個隊列中抽取一個任務(wù)來執(zhí)行,這個任務(wù)執(zhí)行很短的時間(幾毫秒)后,系統(tǒng)就將它排到任務(wù)隊列的末尾,然后讀入隊列中的下一個任務(wù),以同樣的方式執(zhí)行。這樣經(jīng)過一段時間后,任務(wù)隊列中的所有任務(wù)都被執(zhí)行一次,然后又開始下一輪循環(huán)。Linux中的進(jìn)程識別使用PID區(qū)分不同的進(jìn)程系統(tǒng)啟動后的第一個進(jìn)程是init,它的PID是1init是唯一一個由系統(tǒng)內(nèi)核直接運行的進(jìn)程除了init之外,每個進(jìn)程都有父進(jìn)程(PPID標(biāo)識)Linux中的進(jìn)程識別每個進(jìn)程還有四個與用戶和組相關(guān)的識別號實際用戶識別號
(realuserID,RUID)實際組識別號
(realgroupID,RGID)有效用戶識別號
(effectuserID,EUID)有效組識別號
(effectgroupID,EGID)用戶、進(jìn)程與權(quán)限RUID和RGID的作用識別正在運行此進(jìn)程的用戶和組一個進(jìn)程的RUID和RGID就是運行此進(jìn)程的UID和GIDEUID和EGID的作用確定一個進(jìn)程對其訪問的文件的權(quán)限除了產(chǎn)生進(jìn)程的程序被設(shè)置SUID和SGID權(quán)限位之外,一般EUID、EGID和RUID、RGID相同若程序被設(shè)置了SUID或SGID權(quán)限位,則此進(jìn)程相應(yīng)的EUID和EGID,將和運行此進(jìn)程的文件的所屬用戶的UID或所屬組的GID相同進(jìn)程類型交互進(jìn)程由一個Shell啟動的進(jìn)程。交互進(jìn)程既可以在前臺運行,也可以在后臺運行批處理進(jìn)程不與特定的終端相關(guān)聯(lián),提交到等待隊列種順序執(zhí)行的進(jìn)程守護(hù)進(jìn)程(Daemon)在Linux在啟動時初始化,需要時運行于后臺的進(jìn)程進(jìn)程的啟動方式手工方式:使用操作系統(tǒng)提供的用戶接口前臺后臺(&)調(diào)度方式:按照預(yù)先指定的時間執(zhí)行atbatchcron前臺與后臺前臺進(jìn)程指一個程序控制著標(biāo)準(zhǔn)輸入/輸出,在程序運行時,shell被暫時掛起,直到該程序運行結(jié)束后,才退回到shell。在這個過程中,用戶不能再執(zhí)行其它程序。后臺進(jìn)程用戶不必等待程序運行結(jié)束就可以執(zhí)行其它程序。運行后臺進(jìn)程的方法是在命令行最后加上“&”例如:$sleep10000&查看系統(tǒng)中的進(jìn)程使用ps命令查看進(jìn)程狀態(tài)信息顯示哪些進(jìn)程正在執(zhí)行和執(zhí)行的狀態(tài)進(jìn)程是否結(jié)束、進(jìn)程有沒有僵死哪些進(jìn)程占用了過多的系統(tǒng)資源等ps(ProcessStatus)命令格式ps[選項]不帶任何選項的ps命令顯示當(dāng)前用戶所在終端中的所有進(jìn)程輸出項包括:識別號(PID)、終端(TTY)、運行時間(TIME)、產(chǎn)生該進(jìn)程所運行的命令(CMD)ps命令的常用選項選項說明-e顯示所有進(jìn)程,等價于-A。-f完全(FULL)顯示。增加顯示用戶名、PPID、進(jìn)程起始時間。f/-H顯示進(jìn)程樹,等價于--forest。a顯示終端上的所有進(jìn)程,包括其他用戶地進(jìn)程。x顯示沒有控制終端地進(jìn)程。u面向用戶的顯示格式。增加顯示用戶名,進(jìn)程起始時間,CPU和內(nèi)存占用百分比等信息。-u<username>僅顯示指定用戶的進(jìn)程。l/-l長格式顯示。增加顯示進(jìn)程的UID、PPID和優(yōu)先權(quán)值。w[w]/-w[w]加寬顯示。通常用于顯示完整的命令行。o/-o<format>由用戶自定義輸出列。--sort<order>指定按哪/哪些列排序,order格式為:[+|-]key[,[+|-]key[,...]]ps命令使用舉例$ps-e$ps-ef$ps-eH$ps-elw$psau$psaux$psaxf$psauxwps常見的輸出標(biāo)記ps的輸出依賴于用戶所給的選項UID用戶IDSTART進(jìn)程啟動時間USER用戶名TIME執(zhí)行時間PID進(jìn)程IDSTAT進(jìn)程狀態(tài)PPID父進(jìn)程的IDNI優(yōu)先權(quán)值/nice值TTY啟動進(jìn)程的終端CMD命令名(COMMAND)RSS進(jìn)程所用內(nèi)存塊數(shù)%CPU進(jìn)程所用CPU時間百分比(pcpu)VSZ進(jìn)程所用虛擬內(nèi)存塊數(shù)%MEM進(jìn)程所有MEM百分比(pmem)ps命令的進(jìn)程狀態(tài)列"STAT"或"S"列的輸出R正在運行或處在運行隊列中S休眠T停止或被追蹤W進(jìn)程在RAM中沒有駐留頁(2.6.xx
的內(nèi)核無效)D不可中斷的睡眠,通常指I/OZ僵尸進(jìn)程(已結(jié)束但未被父進(jìn)程收回)X已死進(jìn)程(這個狀態(tài)不會出現(xiàn))ps命令使用舉例(2)指定輸出列$psouser,pid,ppid,pcpu,pmem,nice,cmd$ps-eopid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm$psaxostat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm$ps-eo“%p%y%x%n%c“——AIX風(fēng)格對指定列排序$ps-ef--sortuser,-time$psaux--sort-pcpu$psaux--sort-pmem$psouser,pid,ppid,pcpu,pmem,nice,cmd--sortnice搜索進(jìn)程搜索指定的進(jìn)程$psaux|grephttpd$ps-fp$(pgrep-d,-xhttpd)查找符合條件的進(jìn)程PID$pgrephttpd$pidofhttpd$ps-Chttpd-opid=$pgrep-Uapachehttpd$pgrep-Gstudent-l注銷后繼續(xù)運行進(jìn)程通常當(dāng)用戶注銷后,所有屬于該用戶的進(jìn)程將全部被終止如果希望程序在退出系統(tǒng)后仍然能夠繼續(xù)運行,可以使用nohup命令啟動該進(jìn)程例如:$nohup~/bin/mirror_yumrepo_with_rsync.sh--centos\--archi386--exclude-iso&若程序有結(jié)果輸出,輸出結(jié)果將會被保存到當(dāng)前目錄下的一個文件名為nohup.out的文件中,若用戶在當(dāng)前目錄沒有寫的權(quán)限,則結(jié)果將會被保存到用戶主目錄下的nohup.out文件中。nohup命令[選項][參數(shù)][輸出文件]&進(jìn)程調(diào)度的優(yōu)先權(quán)進(jìn)程的優(yōu)先權(quán)決定對CPU的使用進(jìn)程在運行時可以享有不同等的優(yōu)先權(quán)進(jìn)程的優(yōu)先權(quán)受進(jìn)程的nice值的影響這個值的范圍是-20到19,默認(rèn)是0值越小說明對CPU的使用越優(yōu)先查看進(jìn)程優(yōu)先級(看NI列的值)ps-lps-ocomm,nice改變進(jìn)程調(diào)度優(yōu)先權(quán)——在啟動進(jìn)程時指定在啟動進(jìn)程時就指定優(yōu)先級:nicenice–優(yōu)先級改變量命令[&]是指優(yōu)先級的增量若為正,表示增加nice值,即降低進(jìn)程優(yōu)先權(quán)若為負(fù),表示減小nice值,即提高優(yōu)先權(quán)若缺省,則默認(rèn)為10,即nice值增加10nice命令舉例例:nice–5lppaper.pdf&注:使用nice
同樣可以改變前臺任務(wù)的優(yōu)先級。例:超級用戶(root)忙著打印一份演講稿:nice–-10lpreport.pdf注:只有root才有權(quán)限提高一個進(jìn)程的優(yōu)先權(quán)。改變進(jìn)程調(diào)度優(yōu)先權(quán)——在進(jìn)程運行過程中調(diào)整進(jìn)程運行后調(diào)整優(yōu)先級:renice在系統(tǒng)資源緊張時,可以通過降低其它不著急的進(jìn)程的優(yōu)先權(quán),從而使得急用的進(jìn)程能分得更多的CPU時間root可以提高進(jìn)程的優(yōu)先權(quán),但普通用戶沒這個權(quán)限調(diào)整指定進(jìn)程的優(yōu)先級renice優(yōu)先級[-ppid][-uuser][-ggid]renice5–p2345#-p可以省略注:普通用戶一旦增加某個進(jìn)程的優(yōu)先級(即降低優(yōu)先值)后,就無法再回復(fù)到原來的優(yōu)先級。進(jìn)程信號(signal)進(jìn)程信號是在軟件層次上對中斷機(jī)制的一種模擬,在原理上,一個進(jìn)程收到一個信號與處理器收到一個中斷請求可以說是一樣的進(jìn)程信號是最基本的進(jìn)程間通訊方式可以在進(jìn)程之間直接發(fā)送,而不需要用戶界面可以在Shell中通過kill命令發(fā)送給進(jìn)程Linux對每種進(jìn)程信號都規(guī)定了默認(rèn)關(guān)聯(lián)動作。查看可用的進(jìn)程信號$kill-l$man7signal進(jìn)程信號和信號發(fā)送常見的進(jìn)程信號SIGTERM|TERM(15)——正常終止(默認(rèn))SIGKILL|KILL(9)——立即終止SIGHUP|HUP(1)——重讀配置文件給進(jìn)程發(fā)送信號按PID:kill[信號]PID…按名稱:killall[信號]COMM…按模式:pkill[-信號]模式發(fā)送信號可以使用名稱或數(shù)字號碼殺死進(jìn)程為什么要殺死進(jìn)程該進(jìn)程占用了過多的CPU時間該進(jìn)程鎖住了一個終端,使其他前臺進(jìn)程無法運行運行時間過長,但沒有預(yù)期效果或無法正常退出產(chǎn)生了過多到屏幕或磁盤文件的輸出kill/killall命令舉例$kill1234OR$kill-91234$killallmyprogOR$killall-9myprog注:(1)使用kill前需要先用ps查看需要終止的進(jìn)程的pid;(2)kill–9很霸道,它在殺死一個進(jìn)程的同時,將殺死其所有子進(jìn)程,使用時要謹(jǐn)慎。如錯殺login進(jìn)程或shell進(jìn)程等。作業(yè)控制作業(yè)控制是指控制當(dāng)前正在運行的進(jìn)程的行為,也被稱為進(jìn)程控制。暫時停止某個運行程序使用Ctrl-z或發(fā)送信號17(STOP)管理后臺作業(yè)或暫停的作業(yè)列舉作業(yè)號碼和名稱:jobs在后臺恢復(fù)運行:bg[%作業(yè)號碼]在前臺恢復(fù)運行:fg[%作業(yè)號碼]發(fā)送信號:kill-[信號][%作業(yè)號碼]本章思考題Linux系統(tǒng)是如何標(biāo)識用戶和組的?什么是標(biāo)準(zhǔn)組?什么是私有組?為什么使用了私有組?什么是主組?什么是附加組?以主組登錄后如何切換到附加組?簡述私有組和主組的關(guān)系,簡述標(biāo)準(zhǔn)組和附加組的關(guān)系。簡述Linux的4個賬戶系統(tǒng)文件及其各個字段的含義。舉例說明創(chuàng)建一個用戶賬號的詳細(xì)過程。舉例說明如何將一個用戶賬號添加到一個當(dāng)前還不存在的組中。如何設(shè)置用戶口令?如何鎖定用戶賬號?如何設(shè)置用戶口令時效?本章思考題Linux文件系統(tǒng)的三種基本權(quán)限是什么?Linux文件系統(tǒng)的三種特殊權(quán)限是什么?何時使用它們?簡述chmod命令的兩種設(shè)置權(quán)限的方法。如何更改文件或目錄的屬主和/或同組人?為什么使用ACL?ACL的兩種類型及其作用。本章思考題什么是進(jìn)程?它與程序有何關(guān)系?進(jìn)程的類型?進(jìn)程的啟動方式?什么是前臺進(jìn)程?什么是后臺進(jìn)程?如何查看進(jìn)程?如何刪除進(jìn)程?如何更改進(jìn)程優(yōu)先級?什么是作業(yè)控制?本章思考題學(xué)會管理用戶和組賬號。學(xué)會設(shè)置用戶口令并管理用戶口令時效。學(xué)會設(shè)置文件和目錄的操作權(quán)限。學(xué)會設(shè)置和使用ACL權(quán)限。學(xué)會顯示和殺死進(jìn)程。學(xué)會顯示和管理守護(hù)進(jìn)程。學(xué)會實施作業(yè)控制。本章思考題學(xué)習(xí)SUN的集中式的賬戶系統(tǒng)NIS服務(wù)的配置和使用學(xué)習(xí)使用OpenLDAP實現(xiàn)的集中式賬戶管理和應(yīng)用2.Shell腳本編程01Shell腳本的編制、執(zhí)行和調(diào)試02Shell腳本的成分和編碼規(guī)范03Shell變量替換擴(kuò)展、數(shù)值計算、輸入輸出04變量分類,位置參數(shù)變量和特殊參數(shù)變量05條件測試(文件測試、字符串測試、整數(shù)測試)06分支流程控制(if、case)07循環(huán)流程控制(for、while、until、select)08函數(shù)的定義和調(diào)用、返回值09使用循環(huán)分析命令行參數(shù)學(xué)習(xí)目標(biāo)熟悉Shell腳本的編碼規(guī)范,掌握執(zhí)行和調(diào)試方法01掌握對變量進(jìn)行整數(shù)運算和間接引用的方法02理解位置參數(shù)變量和特殊參數(shù)變量的用途03掌握條件測試的使用[]、[[]]、(())04學(xué)習(xí)目標(biāo)掌握各種流程控制語句的使用if、casefor、while、until、select、break、continue05掌握函數(shù)的定義、調(diào)用和傳遞返回值的方法06掌握命令行參數(shù)、位置參數(shù)的操作(shift、getopts)07Shell腳本和Shell編程當(dāng)命令不在命令行中執(zhí)行,而是從一個文件中執(zhí)行時,該文件就稱為Shell腳本。01
0203Shell腳本是純文本文件。Shell腳本通常以.sh作為后綴名,但不是必須。Shell腳本是以行為單位的,在執(zhí)行腳本的時候會分解成一行一行依次執(zhí)行。Shell腳本和Shell編程Shell是一種功能強(qiáng)大的解釋型編程語言通常用于完成特定的、較復(fù)雜的系統(tǒng)管理任務(wù)01Shell腳本語言非常擅長處理文本類型的數(shù)據(jù)02Shell腳本的成分程序元素保留字、運算符、表達(dá)式變量、數(shù)組、輸入輸出控制結(jié)構(gòu)(順序、分支、循環(huán)、子程序調(diào)用)Shell腳本的成分Shell功能【參見第2、3章內(nèi)容】執(zhí)行命令(內(nèi)置命令、外部命令、自編程序)重定向、管道、命令替換、命令聚合通配符、注釋符、……Shell環(huán)境Shell腳本的建立Shell
腳本的建立使用文本編輯器編輯腳本文件$viscript-file為腳本文件添加可執(zhí)行權(quán)限$chmod+xscript-fileShell腳本的執(zhí)行Shell
腳本的執(zhí)行在子Shell中執(zhí)行$bashscript-file$script-file在當(dāng)前Shell中執(zhí)行$sourcescript-file$.script-filePATH
環(huán)境變量的默認(rèn)值不包含當(dāng)前目錄,若腳本文件在當(dāng)前目錄,應(yīng)使用./script-filePATH
環(huán)境變量的默認(rèn)值包含~/bin目錄,用戶可以將自己的腳本文件存放在~/bin目錄,之后即可直接調(diào)用腳本文件名執(zhí)行腳本了Shell腳本的編碼規(guī)范以#!開頭:通知系統(tǒng)用何解釋器執(zhí)行此腳本#!/bin/bash#!/bin/ksh以注釋形式說明如下的內(nèi)容:#腳本名稱#腳本功能#作者及聯(lián)系方式#版本更新記錄#版權(quán)聲明#對算法做簡要說明(如果是復(fù)雜腳本)Shell腳本舉例(1)#!/bin/bash#ThisisthefirstBashshellprogram#Scriptname:greetings.shechoecho
-e"Hello$LOGNAME,\c"echo"it'snicetalkingtoyou."echo
-n"Yourpresentworkingdirectoryis:"pwd
#Showthenameofpresentdirectoryechoecho
-e"Thetimeis`date+%T`!.\nBye"echoShell腳本舉例(2)#!/bin/bash##ScriptName:/etc/cron.daily/ntpdate#使用NTP的客戶端命令ntpdate與遠(yuǎn)程N(yùn)TP服務(wù)器進(jìn)行同步#
也可以用局域網(wǎng)內(nèi)的NTP服務(wù)器替換/usr/sbin/ntpdate
-s#
更改硬件時鐘時都會記錄在/etc/adjtime文件中#
使hwclock根據(jù)先前的記錄來估算硬件時鐘的偏差,#
并用來校正目前的硬件時鐘/sbin/hwclock
--adjust#
將系統(tǒng)時鐘同步到硬件時鐘/sbin/hwclock
–systohc
腳本調(diào)試方法在bash調(diào)用腳本時使用參數(shù)$bash[-x][-n][-v]scriptName在腳本中使用bash內(nèi)置的set命令使整個或部分腳本處于調(diào)試模式開啟:set[-x][-n][-v]結(jié)束:set[+x][+n][+v]腳本調(diào)試1sh–x腳本名該選項可以使用戶跟蹤腳本的執(zhí)行,此時shell
對腳本中每條命令的處理過程為:先執(zhí)行替換,然后顯示,再執(zhí)行它。shell
顯示腳本中的行時,會在行首添加一個加號“+”。sh–v腳本名在執(zhí)行腳本之前,按輸入的原樣打印腳本中的各行。sh–n腳本名對腳本進(jìn)行語法檢查,但不執(zhí)行腳本。如果存在語法錯誤,shell
會報錯,如果沒有錯誤,則不顯示任何內(nèi)容。腳本調(diào)試舉例1對腳本進(jìn)行語法檢查$bash-ngreetings.sh顯示腳本中每個原始命令行及其執(zhí)行結(jié)果$bash-vgreetings.sh以調(diào)試模式執(zhí)行腳本$bash-xgreetings.sh腳本調(diào)試2——set命令01在腳本內(nèi)使用set命令開啟調(diào)試選項set-x:顯示由shell執(zhí)行的命令及其參數(shù)set-v:顯示由shell讀入的命令行set-n:讀取命令但不執(zhí)行他們,用于語法檢查02在腳本內(nèi)使用set命令關(guān)閉已開啟的調(diào)試選項set+xset+vset+n腳本調(diào)試舉例2$bashgreetings.sh./greetings.sh$sourcegreetings.sh#!/bin/bash#ThisisthefirstBashshellprogram#Scriptname:greetings.shset-x###TurnONdebugmode###echoecho-e"Hello$LOGNAME,\c"echo"it'snicetalkingtoyou."echo-n"Yourpresentworkingdirectoryis:"pwd#Showthenameofpresentdirectoryechoset+x###TurnOFFdebugmode###echo-e"Thetimeis`date+%T`!.\nBye"echoShell腳本的類型030201非交互式腳本不需要讀取用戶的輸入,也不用向用戶反饋某些信息每次執(zhí)行都是可預(yù)見的,因為它不讀取用戶輸入,參數(shù)是固定的可以在后臺執(zhí)行Shell腳本的類型腳本可以讀取用戶的輸入,實時向用戶反饋信息(輸出某些信息)這樣的腳本更靈活,每次執(zhí)行時的參數(shù)可由用戶動態(tài)設(shè)定交互式腳本用戶界面更友好,但不適用于自動化任務(wù)(如cron任務(wù))學(xué)習(xí)Shell編程的前提01掌握一種文本編輯器的使用(Vi)02熟悉Linux文件系統(tǒng)的布局03學(xué)習(xí)Shell的各種功能重定向、管道、命令替換、命令聚合學(xué)習(xí)Shell編程的前提04學(xué)習(xí)各種管理和監(jiān)視命令的使用用戶管理、權(quán)限管理、進(jìn)程管理、包管理……系統(tǒng)監(jiān)視、網(wǎng)絡(luò)監(jiān)視……05學(xué)習(xí)各種文本文件工具的使用cat、grep、tr、sed、awk……正則表達(dá)式系統(tǒng)的配置文件幾乎都是純文本文件Shell變量操作變量替換擴(kuò)展變量測試變量的字符串操作變量的間接引用變量的數(shù)值計算$[expression]$((expression))exprletdeclare-i輸入變量賦值name=valuereadonly從標(biāo)準(zhǔn)輸入讀取read輸出echoprintf變量替換擴(kuò)展——變量測試UseDefaultValues${var:-word}若var存在且非空,則值為$var;若var未定義或為空值,則值為word,但var的值不變。AssignDefaultValues${var:=word}若var存在且非空,則值為$var;若var未定義或為空值,則值為word,且var被賦值word。DisplayErrorifNullorUnset${var:?word}若var存在且非空,則值為$var;若var未定義或為空值,則輸出信息word,并終止腳本。UseAlternateValue${var:+word}若var存在且非空,則值為word;否則返回空值,但var的值不變。變量測試舉例color=bluenewcolor=${color:-grey}unsetcolorecho"Theskyis${color:-grey}today"echo
$colorecho"Theskyis${color:=grey}today"echo
$colorecho"Theskyis${color:?error}today"echo
$colorecho"Theskyis${color:+blue}today"echo
$color變量替換擴(kuò)展——字符串計數(shù)、截取${#var}返回字符串變量var
的長度${var:m}返回${var}中從第m個字符到最后的部分${var:m:len}返回${var}中從第m個字符開始,長度為len的部分${var#pattern}刪除${var}中開頭部分與pattern匹配的最小部分${var##pattern}刪除${var}中開頭部分與pattern匹配的最大部分${var%pattern}刪除${var}中結(jié)尾部分與pattern匹配的最小部分${var%%pattern}刪除${var}中結(jié)尾部分與pattern匹配的最大部分m的取值從0到${#var}-1注:pattern中可以使用通配符。字符串變量替換擴(kuò)展舉例1str='Ilovelinux.IloveUNIXtoo.’echo${#str}30echo${#str:13}IloveUNIXtoo.echo
${#str:7:5}linuxecho
${str#Ilove}linux.IloveUNIXtoo.echo
${str#I*.}IloveUNIXtoo.echo
${str##I*}變量替換擴(kuò)展——字符串替換${var/old/new}用new替換${var}中第一次出現(xiàn)的old${var//old/new}用new替換${var}中所有的old(全局替換)${var/#old/new}用new替換${var}中開頭部分與old匹配的部分${var/%old/new}用new替換${var}中結(jié)尾部分與old匹配的部分注:(1)old
中可以使用通配符。(2)var
可以是@
或*,表示對每個位置參數(shù)進(jìn)行替換字符串變量替換擴(kuò)展舉例2str='Ilovelinux.IloveUNIXtoo.’echo${str/love/like}Ilikelinux.IloveUNIXtoo.echo${str//love/like}Ilikelinux.IlikeUNIXtoo.echo
${str/I*linux/IlikeFreeBSD}IlikeFreeBSD.IloveUNIXtoo.echo${str/#Ilove/"J'aime"}J'aime
linux.IloveUNIXtoo.echo${str//Ilove/"J'aime"}J'aimelinux.J'aimeUNIXtoo.echo
${str/%too./also.}Ilovelinux.IloveUNIXalso.字符串變量替換擴(kuò)展舉例3set1v11v21v31v4echo
$@1v11v21v31v4echo
${@/1/a}av1av2av3av4echo
${@//1/a}avaav2av3av4echo${@/%1/a}1va1v21v31v4變量的間接引用通過str2
的值來引用str1
的值str1="HelloWorld"str2=str1echo
$str2#bash2.0以上才支持newstr=${!str2}echo$newstrHelloWorld或echo${!str2}HelloWorld
eval
newstr=\$$str2echo$newstrHelloWorld或evalecho\$$str2HelloWorld
?變量的間接引用(續(xù))通過x
的值來引用CENTOS_URL
的值x="CENTOS"CENTOS_URL="/centos/"#bash2.0以上才支持newstr=${x}_URLecho
$newstrCENTOS_URLecho${!newstr}/centos/eval
newstr=\$${x}_URLecho
$newstr或eval
echo\$${x}_URLShell內(nèi)置命令——evallistpage="ls-l|more"eval
$listpageeval
$(ssh-agent)eval
newstr=\$$str2eval
echo
\$${x}_URLeval
arg1[arg2]...[argN]對參數(shù)進(jìn)行兩次掃描和替換將所有的參數(shù)連接成一個表達(dá)式,并計算或執(zhí)行該表達(dá)式參數(shù)中的任何變量都將被展開Shell變量的分類專用參數(shù)變量(SpecialParameters)用戶自定義變量由系統(tǒng)維護(hù),用于設(shè)置用戶的Shell工作環(huán)境只有少數(shù)的變量用戶可以修改其值Shell環(huán)境變量Shell變量的分類通過命令行給程序傳遞執(zhí)行參數(shù)可用shift命令實現(xiàn)位置參數(shù)的遷移位置參數(shù)變量(PositionalParameters)Bash預(yù)定義的特殊變量用戶不能修改其值專用參數(shù)變量(SpecialParameters)位置參數(shù)變量是一組特殊的內(nèi)置變量位置參數(shù)的用途跟在腳本名后面的用空格隔開的每個字符串$1表示第1個參數(shù)值,……,$9表示第9個參數(shù)值${10}表示第10個參數(shù)值,
${11}表示第11個參數(shù)值,……從shell命令/腳本的命令行接受參數(shù)在調(diào)用shell函數(shù)時為其傳遞參數(shù)專用參數(shù)變量$*將所有位置參量看成一個字符串(以空格間隔)$@將每個位置參量看成單獨的字符串(以空格間隔)“$*”將所有位置參量看成一個字符串(以$IFS間隔)“$@”將每個位置參量看成單獨的字符串(以空格間隔)$0命令行上輸入的Shell程序名$#
表示命令行上參數(shù)的個數(shù)命令行參數(shù)相關(guān)專用參數(shù)變量$?表示上一條命令執(zhí)行后的返回值$$當(dāng)前進(jìn)程的進(jìn)程號$!顯示運行在后臺的最后一個作業(yè)的PID$_在此之前執(zhí)行的命令或腳本的最后一個參數(shù)進(jìn)程狀態(tài)相關(guān)位置參數(shù)和專用參數(shù)舉例執(zhí)行腳本$./vartest.sh1‘23’45abcdefg#!/bin/bash#ScriptName:vartest.sh#TotestPositionalParameters&SpecialParameters.echo"Hello,$USER,theoutputofthisscriptareasfollows:"echo"Thescriptnameis:$(basename$0)"echo"Thefirstparamofthescriptis:$1"echo"Thesecondparamofthescriptis:$2"echo"Thetenthparamofthescriptis:${10}"echo"Alltheparamsyouinputare:$@"echo"Alltheparamsyouinputare:$*"echo"Thenumberoftheparamsyouinputare:$#"echo"TheprocessIDforthisscriptis:$$"echo"Theexitstatusofthisscriptis:$?”$@、$*和環(huán)境變量IFS執(zhí)行腳本$./ifsargs.sh1‘23’45abcdefg#!/bin/bash#ScriptName:ifsargs.sh####SettheIFSto|####IFS='|'echo"Command-LineArgumentsDemo"echo"*Allargsdisplayedusing\$@positionalparameter*"echo$@echo"*Allargsdisplayedusing\$*positionalparameter*"echo$*echo'*Allargsdisplayedusing"$@"positionalparameter*'echo"$@"#***doublequoteadded***#echo'*Allargsdisplayedusing"$*"positionalparameter*'echo"$*"#***doublequoteadded***#位置參數(shù)和shift命令將位置參量列表依次左移n次,缺省為左移一次一旦位置參量列表被移動,最左端的那個參數(shù)就會從列表中刪除經(jīng)常與循環(huán)結(jié)構(gòu)語句一起使用,以便遍歷每一個位置參數(shù)shift
[n]#!/bin/sh#ScriptName:pp_shift.sh#TotestPositionalParameters&Shift.echo"Thescriptnameis:$0"echo'$1'=$1,'$2'=$2,'$3'=$3,'$4'=$4--'$#'="$#"echo'$@':"$@"shift
#向左移動所有的位置參數(shù)1次echo'$1'=$1,'$2'=$2,'$3'=$3,'$4'=$4--'$#'="$#"echo'$@':"$@"shift2
#向左移動所有的位置參數(shù)2次echo'$1'=$1,'$2'=$2,'$3'=$3,'$4'=$4--'$#'="$#"echo'$@':"$@"$./pp_shift.sh1b3d4f退出/返回狀態(tài)$?:返回上一條語句或腳本執(zhí)行的狀態(tài)0:成功1-255:不成功exit命令exit
命令用于退出腳本或當(dāng)前Shell
n
是一個從0到255的整數(shù)0表示成功退出,非零表示遇到某種失敗返回值
被保存在狀態(tài)變量$?中exitn常見的返回狀態(tài)碼0:執(zhí)行正確1:通用錯誤126:命令或腳本沒有執(zhí)行權(quán)限127:命令沒找到$
echo$$#顯示當(dāng)前進(jìn)程的PID9245$
echo$?#顯示在此之前執(zhí)行的命令的返回值0$bash
#調(diào)用子Shell$echo$$#顯示當(dāng)前進(jìn)程的PID9474$
exit1#指定返回值并返回父Shell$
echo$?
#顯示上一個Shell/腳本的返回值1$list
#執(zhí)行不存在的命令bash:list:commandnotfound$
echo$?127$
touchbbb.sh$
./bbb.sh#執(zhí)行不具有執(zhí)行權(quán)限的命令bash:./bbb.sh:Permissiondenied$echo$?126read從鍵盤輸入內(nèi)容為變量賦值read[-p
"信息"][var1var2...]若省略變量名,則將輸入的內(nèi)容存入REPLY變量結(jié)合不同的引號為變量賦值雙引號””:允許通過$符號引用其他變量值單引號’’:禁止引用其他變量值,$視為普通字符反撇號
``
:將命令執(zhí)行的結(jié)果輸出給變量更多read的用法參見/guide/Getting_User_Input_Via_Keyboardread舉例#!/bin/bash#Thisscriptistotesttheusageofread#Scriptname:ex4read.shecho"===examplesfortestingread==="echo-e
"Whatisyourname?\c"readnameecho"Hello$name"echoecho-n"Wheredoyouwork?"readecho"Iguess$REPLYkeepsyoubusy!"echoread-p
"Enteryourjobtitle:"echo"Ithoughtyoumightbean$REPLY."echoecho"===Endofthescript==="只讀變量舉例
只讀變量:是指不能被清除或重新賦值的變量。readonly
variable[lrj@centos1~]$myname=Osmond[lrj@centos1~]$echo$mynameOsmond[lrj@centos1~]$readonly
myname[lrj@centos1~]$unsetmyname-bash:unset:myname:cannotunset:readonlyvariable[lrj@centos1~]$myname="OsmondLiang"-bash:myname:readonlyvariable[lrj@centos1~]$同時輸出多行信息使用echoecho
"Line1Line2Line3"cat<<_END_Line1Line2Line3_END_多行內(nèi)容中不能出現(xiàn)雙引號,否則echo
提前結(jié)束若確實需要使用雙引號,需使用轉(zhuǎn)義字符:\"_END_可以是任意字符串,只要上下一致即可多行內(nèi)容中不能出現(xiàn)內(nèi)容為_END_開始的行,否則cat提前結(jié)束使用herefile整數(shù)運算Bash變量沒有嚴(yán)格的類型定義本質(zhì)上Bash變量都是字符串若一個字面常量或變量的值是純數(shù)字的,不包含字母或其他字符,Bash可以將其視為長整型值,并可做算數(shù)運算和比較運算。Bash也允許顯式地聲明整型變量declare-i變量名算數(shù)運算符+、-、*、/(四則運算)**、%(冪運算和模運算,取余數(shù))<<、>>(按位左移和按位右移)&、^、|(按位與、按位異或和按位或)=、+=、-=、*=、/=、%=
<<=、>>=、&=、^=、|=(賦值運算)<、>、<=、>=、==、!=(比較操作符)&&、||(邏輯與和邏輯或)注:按位運算是以二進(jìn)制形式進(jìn)行的。算術(shù)運算擴(kuò)展$[expression]
$((expression))num1=$[4+1];echo
$num1num1=$(($num1*2-3));echo
$num1注意${···},$(···),$[···],$((···))
的不同作用用$[···],$((···))
進(jì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)置命令——letlet內(nèi)置命令用于算術(shù)運算num2=1;echo
$num2letnum2=4+1;echo
$num2letnum2=$num2+1;echo
$num2賦值符號和運算符兩邊不能留空格!如果將字符串賦值給一個整型變量時,則變量的值為0如果變量的值是字符串,則進(jìn)行算術(shù)運算時設(shè)為0letnum2=4+1let"num2=4+1"#用引號忽略空格的特殊含義用let
命令進(jìn)行算術(shù)運算時,最好加雙引號。expr通用的表達(dá)式計算命令表達(dá)式中參數(shù)與操作符必須以空格分開。表達(dá)式中的運算可以是算術(shù)運算,比較運算,字符串運算和邏輯運算。man
exprexpr5%3expr5\*3#乘法符號必須被轉(zhuǎn)義expr2+5\*2-3%2expr
\(2+5\)\*2–3#括號必須被轉(zhuǎn)義浮點數(shù)運算bash
只支持整數(shù)運算可以通過使用bc
或
awk
工具來處理浮點數(shù)運算n=$(echo"scale=3;13/2"|bc)echo
$nm=`awk'BEGIN{x=2.45;y=3.123;\
printf"%.3f\n",x*y}'`echo
$mprintf命令
printf
可用來按指定的格式輸出變量printfformat輸出參數(shù)列表printf"%-12.5f\n"123.456format以%開頭flagfieldwidthprecision格式符-:左對齊+:輸出符號0:空白處添0空格:前面加一空格字段寬度小數(shù)點后輸出位數(shù)printf命令(續(xù))printf
命令的格式說明符c字符型g/G浮點數(shù)(自動)d十進(jìn)制整數(shù)o八進(jìn)制e/E浮點數(shù)(科學(xué)計數(shù)法)s字符串f浮點數(shù)(小數(shù)形式)x/X十六進(jìn)制printf命令(續(xù))format
中還可以使用\a警鈴\t水平制表符\b退后一格\v垂直制表符\n換行\(zhòng)\反斜杠\f換頁\”雙引號\r回車%%百分號printf命令舉例printf
"Thenumberis:%.2f\n"100printf
"%-20s|%12.5f|\n""Joy"10printf
"%-10d%010o%+10x\n"202020printf
"%6d\t%6o\"%6x\"\n"202020例:數(shù)組變量
Bash2.x
以上支持一維數(shù)組,下標(biāo)從0開始。variable=(item1item2item2...)variable[n]=valuedeclare
-a
variablevariable=(item1item2item2...)數(shù)組的引用${variable[n]}使用declare
聲明或直接給變量名加下標(biāo)來賦值。數(shù)組變量舉例declare
-a
stustu=(math1101math1102math1103)echo${stu[0]}
#列出stu的第一個元素echo
${stu[*]}
#列出stu的所有元素echo
${#stu[*]}
#給出數(shù)組stu中元素的個數(shù)
數(shù)組與數(shù)組元素的刪除unset
stu[1]#刪除stu的第二個元素unset
stu
#刪除整個數(shù)組
數(shù)組賦值時無須按順序賦值x[3]=100;echo${x[*]}state=(ME[3]=CA[2]=NT);echo${state[*]}Shell內(nèi)置命令——declare
內(nèi)置命令declare可用來聲明變量。declare[選項]
variable[=value]選項含義-r將變量設(shè)為只讀(
readonly
)-x將變量輸出到子shell中(export
為全局變量)-i將變量設(shè)為整型(integer
)-a將變量設(shè)置為一個數(shù)組(array
)-f列出函數(shù)的名字和定義(
function
)-F只列出函數(shù)名declare舉例declare–r
myname=osmondunsetmynamedeclare
myname=“OsmondLiang"declare–x
myname2=lrjmyname2=lrjdeclare–x
myname2declaredeclaremyname=osmond例:變量及相關(guān)命令小結(jié)1echo
$variable
或
echo
${variable}unset
variablesetreadonly
variableexport
variable=valueexport
-nvariableexport
-pdeclare[選項]
variable=value變量及相關(guān)命令小結(jié)2basename
dirname
let或expr${var:-word}、${var:=word}、${var:?word}、${var:+word}$0、$1-$9、${n}、$#、$*、$@、$$、$!、$?、$-eval
newstr=\$$str2
、newstr=${!str2}`hostname`、$(hostname)`basename
\`pwd\``、$(basename
$(pwd))$[expression]
、$((expression))變量及相關(guān)命令小結(jié)3輸入readvar1var2...readread–p
"提示"輸出printf"%-12.5f\t%d\n"123.458format以%開頭flagfieldwidthprecision格式符-:左對齊+:輸出符號0:空白處添0空格:前面加一空格字段寬度小數(shù)點后輸出位數(shù)cdefgsox\b\n\r\t\v\\\”%%
REPLY
REPLY輸出參數(shù)用空格隔開條件測試簡介條件測試可以判斷某個特定條件是否滿足測試之后通常會根據(jù)不同的測試值選擇執(zhí)行不同任務(wù)條件測試的種類命令成功或失敗表達(dá)式為真或假
條件測試簡介條件測試的值Bash中沒有布爾類型變量退出狀態(tài)為0表示命令成功或表達(dá)式為真非0則表示命令失敗或表達(dá)式為假狀態(tài)變量$?
中保存了退出狀態(tài)的值條件測試舉例(1)$
User=osmond$
grep
^$User/etc/passwd$
echo$?$
grep^$User/etc/passwd>/dev/null\
&&echo“$User
isauserin/etc/passwd.”\
||echo“$User
isn’tauserin/etc/passwd.”$
Host=centos1$
ping–c1$Host$
echo$?$
ping–c1$Host>/dev/null\
&&echo“$Host
isup.”\
||echo“$Host
isdown.”條件測試語句說明格式1和格式2是等價的,格式3是擴(kuò)展的test命令在[[]]中可以使用通配符進(jìn)行模式匹配&&,||,
<,
和>能夠正常存在于[[]]中,但不能在
[]中出現(xiàn)[和[[之后的字符必須為空格,]和]]之前的字符必須為空格要對整數(shù)進(jìn)行關(guān)系運算也可以使用(())進(jìn)行測試語句格式1
test<測試表達(dá)式>格式2[<測試表達(dá)式>]格式3
[<測試表達(dá)式>]條件測試操作符條件測試表達(dá)式中可用的操作符文件測試操作符字符串測試操作符整數(shù)二元比較操作符使用邏輯運算符文件測試[
-ffname
]fname
存在且是普通文件時,返回真(即返回0)[
-L
fname
]fname
存在且是鏈接文件時,返回真[
-d
fname
]fname
存在且是一個目錄時,返回真[
-e
fname
]fname(文件或目錄)存在時,返回真[
-s
fname
]fname
存在且大小大于0時,返回真[
-r
fname
]fname(文件或目錄)存在且可讀時,返回真[
-w
fname
]fname(文件或目錄)存在且可寫時,返回真[
-x
fname
]fname(文件或目錄)存在且可執(zhí)行時,返回真測試:文件是否存在,文件屬性,訪問權(quán)限等。更多文件測試符參見test
的在線幫助mantest使用lftp同步y(tǒng)um倉庫#!/bin/bash##ScriptName:sync_iredmail_yum_repo.shDIST=5ARCH="i386"EXCL_ARCH="x86_64"SRC=/yum/rpms/$DIST/DST=/var/ftp/yum/repos/iredmail/$DIST/$ARCH/[!-e$DST]
&&
mkdir-p$DSTexcludes="\"(${EXCL_ARCH})|(repodata)\""cd
$DSTlftp
-e"setmirror:exclude-regex$excludes&&\mirror--delete--only-newer--verbose&&exit"$SRCcreaterepo
.>/dev/null使用reposync同步倉庫#!/bin/bash##ScriptName:sync_atomic-repo_with_reposync.shARCH="i386"url="/channels/atomic/centos/5"release="atomic-release-1.0-13.el5.art.noarch.rpm"rpm-U$url/$ARCH/RPMS/$releaserpm--import/etc/pki/rpm-gpg/RPM-GPG-KEY.art.txt使用reposync同步倉庫之前首先要配置倉庫安裝atomic-release的RPM包導(dǎo)入其RPM公鑰對yum和reposync使用不同的配置文件yum
使用本地倉庫配置以加快更新速度/etc/yum.conf和/etc/yum.repos.d/atomic.reporeposync使用運程倉庫配置/etc/reposync.conf和/etc/yum/repos.d/atomic.repo使用reposync同步倉庫續(xù)1[!-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<<__END__>/etc/yum.repos.d/atomic.repo[atomic]name=CentOS/RedHatEnterpriseLinux\$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__)配置對yum和reposync使用不同的配置文件僅當(dāng)/etc/reposync.conf不存在時執(zhí)行一次(……)使用reposync同步倉庫續(xù)2若本地同步的目標(biāo)目錄不存在創(chuàng)建之,否則進(jìn)入之使用
reposync
同步倉庫的RPM文件-a,--arch:指定架構(gòu)(i386、x86_64)-r,--repoid:指定要同步的倉庫名-d,--delete:刪除本地存在而遠(yuǎn)程已經(jīng)不存在的文件-c,--config:指定reposync使用的配置文件使用createrepo創(chuàng)建倉庫(repodata)DST="/var/ftp/yum/repos/atomic/centos/5/$ARCH"[!-e$DST]
&&
mkdir-p$DST||
cd$DST/usr/bin/yumcleanall/usr/bin/reposync
--arch=$ARCH--repoid=atomic\
-d-c/etc/reposync.confcdatomic/usr/bin/createrepo
./usr/bin/yumcleanall字符串測試[
-z
string
]如果字符串string長度為0,返回真[
-n
string
]如果字符串string長度不為0,返回真[
str1
=
str2
]兩字符串相等(也可使用==)返回真[
str1
!=
str2
]兩字符串不等返回真[[
str1
==
str2
]]兩字符串相同返回真[[
str1
!=
str2
]]兩字符串不相同返回真[[
str1
=~
str2
]]str2是str1的子串返回真[[
str1
>
str2
]]str1大于str2返回真[[
str1
<
str2
]]str1小于str2返回真字符串按從左到右對應(yīng)字符的ASCII碼進(jìn)行比較字符串的空值檢查[-z"$name"][!
"$name"][
"X${name}"
=
"X"][-n"$name"
]["$name"][
"X${name}"
!=
"X"]檢查空值檢查非空值[
"$name"
=
""]["$name"!=
""]整數(shù)測試(1)[
int1
-eq
int2
]
int1等于
int2返回真[
int1
-ne
int2
]
int1不等于int2返回真[
int1
-gt
int2
]
int1大于
int2返回真[
int1
-ge
int2
]
int1大于或等于int2返回真[
int1
-lt
int2
]
int1小于
int2返回真[
int1
-le
int2
]
int1小于或等于int2返回真[[
int1
-eq
int2
]]
int1等于
int2返回真[[
int1
-ne
int2
]]
int1不等于int2返回真[[
int1
-gt
int2
]]
int1大于
int2返回真[[
int1
-ge
int2
]]
int1大于或等于int2返回真[[
int1
-lt
int2
]]
int1小于
int2返回真[[
int1
-le
int2
]]
int1小于或等于int2返回真操作符兩邊必須留空格!整數(shù)測試(2)((int1==int2))
int1等于
int2返回真((int1!=int2))
int1不等于int2返回真((int1
>
int2))
int1大于
int2返回真((int1
>=int2))
int1大于或等于int2返回真((int1
<
int2))
int1小于
int2返回真((int1<=int2))
int1小于或等于int2返回真操作符兩邊的空格可省略!條件測試舉例(2)$[$a!=$b];echo$?0$[[$a!=$b]];echo$?0$[$n-gt$m];echo$?1$[[$n>$m]];echo$?1$((n>m));echo$?1$(($n>$m));echo$?1$[[n>m]];echo$?0$a=linux;b=unix$n=5;m=7$[$a!=$b]&&echoT||echoFT$[[$a!=$b]]&&echoT||echoFT$[$n-gt$m]&&echoT||echoFT$[[$n>$m]]&&echoT||echoFF$((n>m))&&echoT||echoFF$(($n>$m))&&echoT||echoFF$[[n>m]]&&echoT||echoFT條件測試舉例(3)name=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$
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 租賃皮劃艇協(xié)議書
- 承辦位合作協(xié)議書
- 傭金返錢協(xié)議書
- 電梯分包合同范本
- 信用消費協(xié)議書
- 修改愛情協(xié)議書
- 企業(yè)所合同范本
- 俄烏輸氣協(xié)議書
- 信息員合同協(xié)議
- 窗門拆除合同范本
- 工商銀行貸款合同(標(biāo)準(zhǔn)版)
- 2026屆四川省涼山州西昌市九上物理期中學(xué)業(yè)質(zhì)量監(jiān)測試題含解析
- 激光切割機(jī)日常保養(yǎng)表
- 人力資源從業(yè)資格考試題及答案解析
- (必會)生殖健康管理師沖刺預(yù)測試題庫及答案(100題)
- 廣播電視安全播出工作總結(jié)
- 熒光腹腔鏡知識培訓(xùn)總結(jié)
- 兄弟BAS-311G電腦花樣機(jī)說明書
- 知道網(wǎng)課《微積分(I)(南昌大學(xué))》課后章節(jié)測試答案
- 機(jī)場場道維護(hù)員協(xié)同作業(yè)考核試卷及答案
- 學(xué)堂在線 雨課堂 學(xué)堂云 大數(shù)據(jù)機(jī)器學(xué)習(xí) 期末考試答案
評論
0/150
提交評論