四、文本處理工具及Shell腳本基礎(chǔ)

一、文本處理工具

查看類常用命令:
1.cat
命令所在路徑:/bin/cat
執(zhí)行權(quán)限:所有用戶
功能描述:標(biāo)準(zhǔn)輸出顯示文件內(nèi)容
語法:cat [OPTION]... [FILE]...
選項(xiàng):
-n 對(duì)顯示的每一行進(jìn)行編號(hào)
-b 對(duì)顯示的非空行進(jìn)行編號(hào)
-E 顯示行結(jié)束符$

范例1:
查看某個(gè)文件的內(nèi)容

命令:cat anaconda-ks.cfg

范例2:
結(jié)合重定向輸出文本內(nèi)容,如果文件已存在則只是將新內(nèi)容追加到最后而不會(huì)覆蓋原有的內(nèi)容。

命令:cat << EOF >> numer.txt
...
結(jié)尾以EOF結(jié)束

2.more
命令所在路徑:/bin/more
執(zhí)行權(quán)限:所有用戶
功能描述:分頁顯示文件內(nèi)容
語法:more [FILE]...
指令:

h or ? 顯示幫助信息
空格鍵 翻下一頁
b 翻上一頁
回車鍵 翻下一行
q or Q 退出分頁顯示模式

范例1:
分頁顯示某個(gè)文件的內(nèi)容

命令:more /etc/services
...

3.less
命令所在路徑:/bin/less
執(zhí)行權(quán)限:所有用戶
功能描述:分頁查看文件或標(biāo)準(zhǔn)輸出
語法:less [FILE]...
指令:

h or ? 顯示幫助信息
空格鍵 翻下一頁
b 翻上一頁
回車鍵 翻下一行
q or Q 退出分頁顯示模式
/string 搜索匹配的字符串,n 查找下一個(gè),N 查找上一個(gè)

范例1:
分頁顯示某個(gè)文件的內(nèi)容

命令:less /etc/services
...

4.head
命令所在路徑:/bin/head
執(zhí)行權(quán)限:所有用戶
功能描述:查看文件顯示前n行,不帶選項(xiàng)默認(rèn)為前10行
語法:head -n [FILE]...
選項(xiàng):
-c 獲取前n字節(jié)

范例1:
查看某個(gè)文件前5行的內(nèi)容

命令:head -5 /etc/services
執(zhí)行結(jié)果:
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10

5.tail
命令所在路徑:/bin/tail
執(zhí)行權(quán)限:所有用戶
功能描述:查看文件顯示后n行,不帶選項(xiàng)默認(rèn)為前10行
語法:tail -n [FILE]...
選項(xiàng):
-f 跟蹤顯示文件追加的內(nèi)容

范例1:
查看某個(gè)文件后5行的內(nèi)容

命令:tail -5 /etc/services
執(zhí)行結(jié)果:
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/tcp               # iqobject
iqobject        48619/udp               # iqobject
matahari        49000/tcp               # Matahari Broker

范例2:
動(dòng)態(tài)顯示某個(gè)文件追加的內(nèi)容

命令:tail -f /var/log/messages
執(zhí)行結(jié)果:
Apr 26 11:01:01 www systemd: Created slice User Slice of root.
Apr 26 11:01:01 www systemd: Started Session 90 of user root.
...
按crtl + c組合鍵可退出

過濾統(tǒng)計(jì)類常用命令:
1.grep
命令所在路徑:/usr/bin/grep
執(zhí)行權(quán)限:所有用戶
功能描述:文本搜索工具,根據(jù)用戶指定的“模式”對(duì)目標(biāo)文本逐行進(jìn)行匹配檢查;打印匹配到的行。
語法:grep [OPTIONS] PATTERN [FILE...]
選項(xiàng):
-v 反選
-A 顯示匹配關(guān)鍵字后面的后n行
-B 顯示匹配關(guān)鍵字的前n行
-C 顯示匹配關(guān)鍵字的前后n行
-e 指定包含多個(gè)or關(guān)鍵字
-E 使用擴(kuò)展的正則表達(dá)式
-W 匹配整個(gè)單詞
-F 直接搜索,不支持正則表達(dá)式;等價(jià)于fgrep
-f 指定格式文件

范例1:
過濾輸出某個(gè)文件中匹配關(guān)鍵字的行內(nèi)容

命令:grep root /etc/passwd
執(zhí)行結(jié)果:
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

范例2:
通過nmap根據(jù)指定的網(wǎng)段進(jìn)行掃描,結(jié)合grep過濾輸出顯示已啟動(dòng)的主機(jī)

命令:nmap -v -sP 172.16.77.0/24 |grep -B1 'is up'
執(zhí)行結(jié)果:
Nmap scan report for 172.16.77.1
Host is up (0.00017s latency).
--
Nmap scan report for 172.16.77.2
Host is up (0.00024s latency).
--
Nmap scan report for 172.16.77.254
Host is up (0.00017s latency).
--
Nmap scan report for 172.16.77.131
Host is up.

2.wc
命令所在路徑:/usr/bin/wc
執(zhí)行權(quán)限:所有用戶
功能描述:收集文本統(tǒng)計(jì)數(shù)據(jù)
語法:wc [OPTIONS] [FILE...]
選項(xiàng):
-l 只計(jì)數(shù)行數(shù)
-w 只計(jì)數(shù)單詞總數(shù)
-c 只計(jì)數(shù)字節(jié)總數(shù)
-m 只計(jì)數(shù)字符總數(shù)
-L 顯示文件中最長(zhǎng)行的長(zhǎng)度

范例1:
統(tǒng)計(jì)出/etc/passwd文件中其默認(rèn)shell為非/sbin/nologin的用戶個(gè)數(shù)

命令:grep -v '/sbin/nologin' /etc/passwd |wc -l
執(zhí)行結(jié)果:
21

范例2:
統(tǒng)計(jì)某個(gè)文件的單詞總數(shù)

命令:wc -w ~/number.txt
執(zhí)行結(jié)果:
7 /root/number.txt

3.sort
命令所在路徑:/usr/bin/sort
執(zhí)行權(quán)限:所有用戶
功能描述:文本排序
語法:sort [OPTIONS] [FILE...]
選項(xiàng):
-r 執(zhí)行反方向(由上至下)整理
-R 隨機(jī)排序
-n 執(zhí)行按數(shù)字大小整理
-f 選項(xiàng)忽略(fold)字符串中的字符大小寫
-u 選項(xiàng)(獨(dú)特,unique)刪除輸出中的重復(fù)行
-t c 選項(xiàng)使用c做為字段界定符
-k X 選項(xiàng)按照使用c字符分隔的X列來整理能夠使用多次

范例1:
指定:為分隔符,以:分隔的第3列作為條件將UID倒序排列,顯示用戶信息

命令:getent passwd |sort -t: -k 3 -nr
執(zhí)行結(jié)果:
xxx666:x:2014:2014::/home/xxx666:/bin/bash
xxx:x:2013:2013::/home/xxx:/bin/bash
y666:x:2012:2012::/home/y666:/bin/bash
z666:x:2011:2011::/home/z666:/bin/bash
...

4.cut
命令所在路徑:/usr/bin/cut
執(zhí)行權(quán)限:所有用戶
功能描述:剪切顯示文本內(nèi)容
語法:cut [OPTIONS1] [OPTIONS2] [FILE...]
選項(xiàng):
-d 指定分隔符
-f 第n個(gè)字段,多個(gè)字段組合使用逗號(hào),隔開
-c 按字符串切割

范例1:
指定:為分隔符,以:分隔的第1列作為條件顯示出/etc/passwd文件中其默認(rèn)shell為非/sbin/nologin的用戶

命令:grep -v '/sbin/nologin' /etc/passwd |cut -d: -f1
執(zhí)行結(jié)果:
root
sync
shutdown
...

范例2:
查出用戶UID最大值的用戶名、UID及shell類型

命令:sort -t: -k3 -rn /etc/passwd |cut -d: -f 1,3,7 |head -1
執(zhí)行結(jié)果:
xxx666:2014:/bin/bash

5.uniq
命令所在路徑:/usr/bin/uniq
執(zhí)行權(quán)限:所有用戶
功能描述:去掉連續(xù)且重復(fù)行的內(nèi)容
語法:uniq [OPTIONS1] [OPTIONS2]
選項(xiàng):
-c 統(tǒng)計(jì)次數(shù)
-d 只顯示重復(fù)的內(nèi)容
-u 只顯示不重復(fù)的內(nèi)容

范例1:
指定:統(tǒng)計(jì)當(dāng)前連接本機(jī)按從大到小排序的前3個(gè)遠(yuǎn)程主機(jī)IP連接數(shù)

命令:
netstat -nt |tr -s " " : |cut -d: -f6| uniq -c|sort -nr|head -3 |grep -v Foreign
執(zhí)行結(jié)果:
netstat -nt |tr -s " " : |cut -d: -f6| uniq -c|sort -nr|head -3 |grep -v Foreign
...

二、正則表達(dá)式

???????REGEXP,由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能
程序支持:grep,sed,awk,vim, less,nginx,varnish等
分兩類:
基本正則表達(dá)式:BRE
擴(kuò)展正則表達(dá)式:ERE
grep -E, egrep
正則表達(dá)式引擎:
采用不同算法,檢查處理正則表達(dá)式的軟件模塊
PCRE(Perl Compatible Regular Expressions)
元字符分類:字符匹配、匹配次數(shù)、位置錨定、分組

字符匹配:
. 匹配任意單個(gè)字符
[] 匹配指定范圍內(nèi)的任意單個(gè)字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范圍外的任意單個(gè)字符
[:alnum:] 字母和數(shù)字
[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z
[:lower:] 小寫字母
[:upper:] 大寫字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...)
[:digit:] 十進(jìn)制數(shù)字
[:xdigit:]十六進(jìn)制數(shù)字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標(biāo)點(diǎn)符號(hào)

匹配次數(shù):用在要指定次數(shù)的字符后面,用于指定前面的字符要出現(xiàn)的次數(shù)
* 匹配前面的字符任意次,包括0次
貪婪模式:盡可能長(zhǎng)的匹配
.* 任意長(zhǎng)度的任意字符
? 匹配其前面的字符0或1次
+ 匹配其前面的字符至少1次
{n} 匹配前面的字符n次
{m,n} 匹配前面的字符至少m次,至多n次
{,n} 匹配前面的字符至多n次
{n,} 匹配前面的字符至少n次

示例:
1.提取指定網(wǎng)口的ip地址信息

命令:ifconfig ens33 |grep -o '[0-9.]\{7,15\}' |head -1
執(zhí)行結(jié)果:
172.16.77.131

2.利用df和grep,取出磁盤各分區(qū)利用率,并從大到小排序

命令:df |grep -E -v "^/dev/sr|^/dev/cdrom" |grep -o '[[:digit:]]\+%' |tr -d % | sort -rn
執(zhí)行結(jié)果:
26
9
3
0
0
0
0

位置錨定:定位出現(xiàn)的位置
^ 行首錨定,用于模式的最左側(cè)
$ 行尾錨定,用于模式的最右側(cè)
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
< 或 \b 詞首錨定,用于單詞模式的左側(cè)
> 或 \b 詞尾錨定,用于單詞模式的右側(cè)
<PATTERN> 匹配整個(gè)單詞

示例:
1.提取操作系統(tǒng)大版本號(hào)

命令:grep -o '\<[0-9]\+\>' /etc/redhat-release |head -1
執(zhí)行結(jié)果:
7

分組:() 將一個(gè)或多個(gè)字符捆綁在一起,當(dāng)作一個(gè)整體處理,如:(root)+
分組括號(hào)中的模式匹配到的內(nèi)容會(huì)被正則表達(dá)式引擎記錄于內(nèi)部的變量中,這些變量的命名方式為: \1, \2, \3, ...
\1 表示從左側(cè)起第一個(gè)左括號(hào)以及與之匹配右括號(hào)之間的模式所匹配到的字符
示例: (string1(string2))
\1 :string1(string2)
\2 :string2
后向引用:引用前面的分組括號(hào)中的模式所匹配字符,而非模式本身
或者:|
如:a|b a或b
C|cat C或cat
(C|c)at Cat或cat

示例:
1.找出/etc/passwd用戶名和shell同名的行
命令:grep "([:]+):.*<\1$" /etc/passwd
執(zhí)行結(jié)果:
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:2003:2003::/home/bash:/bin/bash
nologin:x:2006:2006::/home/nologin:/sbin/nologin

命令名稱:egrep = grep -E
語法:egrep [OPTIONS] PATTERN [FILE...]
擴(kuò)展正則表達(dá)式的元字符:
字符匹配:
. 任意單個(gè)字符
[] 指定范圍的字符
[^] 不在指定范圍的字符

示例:
1.使用正則表達(dá)式統(tǒng)計(jì)當(dāng)前連接本機(jī)的每個(gè)遠(yuǎn)程主機(jī)IP連接數(shù),并按從大到小排序
命令:ss -nt |tr -s " "|cut -d " " -f5 |grep -Eo '[0-9.]{7,15}' |sort -rn |uniq -c
執(zhí)行結(jié)果:
2 172.16.77.1
2 127.0.0.1

三、Shell 腳本介紹
???????shell腳本是包含一些命令或聲明,并符合一定格式的文本文件。提供了編程能力,解釋執(zhí)行。
編程語言的基本結(jié)構(gòu):
各種系統(tǒng)命令的組合
數(shù)據(jù)存儲(chǔ):變量、數(shù)組
表達(dá)式:a + b
語句:if

格式要求:首行shebang機(jī)制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl

shell腳本的用途:

  • 自動(dòng)化常用命令
  • 執(zhí)行系統(tǒng)管理和故障排除
  • 創(chuàng)建簡(jiǎn)單的應(yīng)用程序
  • 處理文本或文件

shell腳本的工作過程
????第一步:使用文本編輯器來創(chuàng)建文本文件

  • 第一行必須包括shell聲明序列:#!
    示例:#!/bin/bash
  • 添加注釋
    注釋以#開頭

????第二步:運(yùn)行腳本

  • 給予執(zhí)行權(quán)限,在命令行上指定腳本的絕對(duì)或相對(duì)路徑
  • 直接運(yùn)行解釋器,將腳本作為解釋器程序的參數(shù)運(yùn)行

腳本代碼開頭約定
1、第一行一般為調(diào)用使用的語言
2、程序名,避免更改文件名為無法找到正確的文件
3、版本號(hào)
4、更改后的時(shí)間
5、作者相關(guān)信息
6、該程序的作用,及注意事項(xiàng)
7、最后是各版本的更新簡(jiǎn)要說明

腳本的基本結(jié)構(gòu)
#!SHEBANG
CONFIGURATION_VARIABLES(配置變量)
FUNCTION_DEFINITIONS(功能/函數(shù)定義)
MAIN_CODE(主要實(shí)現(xiàn)代碼)

編輯.vimrc配置文件,添加實(shí)現(xiàn)自動(dòng)生成腳本格式的內(nèi)容:
set ignorecase
set cursorline
set autoindent
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"#")
call setline(3,"#********************************************************************")
call setline(4,"#Author: zhangxuhao")
call setline(5,"#QQ: 335249105")
call setline(6,"#Date: ".strftime("%Y-%m-%d"))
call setline(7,"#FileName: ".expand("%"))
call setline(8,"#URL: http://www.itdecent.cn/u/d1eff6d1a4db")
call setline(9,"#Description: The test script")
call setline(10,"#Copyright (C): ".strftime("%Y")." All rights reserved")
call setline(11,"#********************************************************************")
call setline(12,"")
endif
endfunc
autocmd BufNewFile * normal G

檢測(cè)腳本中的語法錯(cuò)誤
bash -n /path/to/some_script
調(diào)試執(zhí)行
bash -x /path/to/some_script

3.1 變量

定義:命名的內(nèi)存空間
作用:
1、數(shù)據(jù)存儲(chǔ)方式
2、參與的運(yùn)算
3、表示的數(shù)據(jù)范圍
類型:字符
數(shù)值:整型、浮點(diǎn)型
弱類型語言:語言的運(yùn)行時(shí)會(huì)隱式做數(shù)據(jù)類型轉(zhuǎn)換。無須指定類型,默認(rèn)均為字符型;參與運(yùn)算會(huì)自動(dòng)進(jìn)行隱式類型轉(zhuǎn)換;變量無須事先定義可直接調(diào)用
如:bash 不支持浮點(diǎn)數(shù),php,javascript

根據(jù)變量的生效范圍等標(biāo)準(zhǔn)劃分下面變量類型
局部變量:生效范圍為當(dāng)前shell進(jìn)程;對(duì)當(dāng)前shell之外的其它shell進(jìn)程,包括當(dāng)前shell的子shell進(jìn)程均無效
環(huán)境變量:生效范圍為當(dāng)前shell進(jìn)程及其子進(jìn)程
本地變量:生效范圍為當(dāng)前shell進(jìn)程中某代碼片斷,通常指函數(shù)
位置變量:$1, $2, ...來表示,用于讓腳本在腳本代碼中調(diào)用通過命令行傳遞給它的參數(shù)
特殊變量:$?(返回值), $0(本身的文件名), $*(所有參數(shù),一個(gè)整體), $@(所有參數(shù),單一分隔),$#(參數(shù)個(gè)數(shù)),$$(本身的PID)

變量聲明、賦值:
export name=VALUE
declare -x name=VALUE
變量引用:
$name, ${name}
顯示所有環(huán)境變量:
env
printenv
export
declare -x
刪除變量:
unset name

進(jìn)程使用退出狀態(tài)來報(bào)告成功或失敗
0 代表成功,1-255代表失敗
$? 變量保存最近的命令退出狀態(tài)

3.2 bash算術(shù)運(yùn)算

let命令
+, -, *, /, %取模(取余), **(乘方),乘法符號(hào)有些場(chǎng)景中需要轉(zhuǎn)義
實(shí)現(xiàn)算術(shù)運(yùn)算:
(1) let var=算術(shù)表達(dá)式
(2) var=$[算術(shù)表達(dá)式]
(3) var=$((算術(shù)表達(dá)式))
(4) var=$(expr arg1 arg2 arg3 ...)
(5) declare -i var = 數(shù)值
(6) echo ‘算術(shù)表達(dá)式’ | bc
bash內(nèi)建的隨機(jī)數(shù)生成器變量:
$RANDOM(0-32767)

增強(qiáng)型賦值:
+=, -=, *=, /=, %=
let var OPER value
例如:let count+=3
自加3后自賦值
自增,自減:
let var+=1
let var++
let var-=1
let var--

3.3 邏輯運(yùn)算

true(真), false(假)
1??????????????????0


1 與 1 = 1
1 與 0 = 0
0 與 1 = 0
0 與 0 = 0


1 或 1 = 1
1 或 0 = 1
0 或 1 = 1
0 或 0 = 0

非:!
! 1 = 0 ! true
! 0 = 1 ! false

短路運(yùn)算

短路與
第一個(gè)為0,結(jié)果必定為0
第一個(gè)為1,第二個(gè)必須要參與運(yùn)算

短路或
第一個(gè)為1,結(jié)果必定為1
第一個(gè)為0,第二個(gè)必須要參與運(yùn)算

異或:^
異或的兩個(gè)值,相同為假,不同為真

3.4 條件測(cè)試

判斷某需求是否滿足,需要由測(cè)試機(jī)制來實(shí)現(xiàn)
專用的測(cè)試表達(dá)式需要由測(cè)試命令輔助完成測(cè)試過程
評(píng)估布爾聲明,以便用在條件性執(zhí)行中

  • 若真,則返回0
  • 若假,則返回1
    測(cè)試命令:
    ?test EXPRESSION
    ?[ EXPRESSION ]
    ?[[ EXPRESSION ]]
    注:EXPRESSION前后必須有空白字符

3.4.1 bash的數(shù)值測(cè)試

-v VAR
變量VAR是否設(shè)置
數(shù)值測(cè)試:
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于

3.4.2 bash的字符串測(cè)試

字符串測(cè)試:
= 是否等于
> ascii碼是否大于ascii碼
< 是否小于
!= 是否不等于
=~ 左側(cè)字符串是否能夠被右側(cè)的PATTERN所匹配
注:此表達(dá)式一般用于[[ ]]中;擴(kuò)展的正則表達(dá)式

-z "STRING“ 字符串是否為空,空為真,不空為假
-n "STRING“ 字符串是否不空,不空為真,空為假
注:用于字符串比較時(shí)的用到的操作數(shù)都應(yīng)該使用引號(hào)

3.4.3 bash文件測(cè)試

test命令
存在性測(cè)試
-a FILE:同 -e
-e FILE: 文件存在性測(cè)試,存在為真,否則為假

存在性及類別測(cè)試
-b FILE:是否存在且為塊設(shè)備文件
-c FILE:是否存在且為字符設(shè)備文件
-d FILE:是否存在且為目錄文件
-f FILE:是否存在且為普通文件
-h FILE 或 -L FILE:存在且為符號(hào)鏈接文件
-p FILE:是否存在且為命名管道文件
-S FILE:是否存在且為套接字文件

文件權(quán)限測(cè)試:
-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執(zhí)行

文件特殊權(quán)限測(cè)試:
-u FILE:是否存在且擁有suid權(quán)限
-g FILE:是否存在且擁有sgid權(quán)限
-k FILE:是否存在且擁有sticky權(quán)限

文件大小測(cè)試:
-s FILE: 是否存在且非空
-t fd: fd 文件描述符是否在某終端已經(jīng)打開,位置:/proc/<pid>/fd
-N FILE:文件自從上一次被讀取之后是否被修改過
-O FILE:當(dāng)前有效用戶是否為文件屬主
-G FILE:當(dāng)前有效用戶是否為文件屬組

雙目測(cè)試:
FILE1 -ef FILE2: FILE1是否是FILE2的硬鏈接
FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2: FILE1是否舊于FILE2

組合測(cè)試條件
第一種方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必須使用測(cè)試命令進(jìn)行,[[ ]] 不支持
第二種方式:
COMMAND1 && COMMAND2 并且,短路與,代表?xiàng)l件性的AND THEN
COMMAND1 || COMMAND2 或者,短路或,代表?xiàng)l件性的OR ELSE
! COMMAND 非
如:[ -f "$FILE" ] && [[ "$FILE"=~ .*.sh$ ]]

條件性的執(zhí)行操作符
示例:
grep -q no_such_user /etc/passwd || echo 'No such user'
No such user
ping -c1 -W2 station1 &> /dev/null \
> && echo "station1 is up"
> || (echo 'station1 is unreachable'; exit 1)
station1 is up

bash組合測(cè)試條件
示例:
test "$A" = "$B" && echo "Strings are equal"
test "$A"-eq "$B" && echo "Integers are equal"
[ "$A" = "$B" ] && echo "Strings are equal"
[ "$A" -eq "$B" ] && echo "Integers are equal“
[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
[ -z "$HOSTNAME" -o $HOSTNAME == "localhost.localdomain" ]
&& hostname www.magedu.com

短路與和短路或
[ [$RANDOM%6] -eq 0 ] && rm -rf /* || echo "click"

3.4.4 read命令接受鍵盤輸入

使用read來把輸入值分配給一個(gè)或多個(gè)shell變量
-p 指定要顯示的提示
-s 靜默輸入,一般用于密碼
-n N 指定輸入的字符長(zhǎng)度N
-d ‘字符’ 輸入結(jié)束符
-t N TIMEOUT為N秒
read 從標(biāo)準(zhǔn)輸入中讀取值,給每個(gè)單詞分配一個(gè)變量
所有剩余單詞都被分配給最后一個(gè)變量
例:read -p “Enter a filename: “ FILE

3.4.5 條件選擇if語句

選擇執(zhí)行:
注:if語句可嵌套
單分支
if 判斷條件;then
條件為真的分支代碼
fi
雙分支
if 判斷條件; then
條件為真的分支代碼
else
條件為假的分支代碼
fi

示例:編寫腳本createuser.sh,實(shí)現(xiàn)如下功能適用一個(gè)用戶名作為參數(shù),如果指定參數(shù)的用戶存在,就顯示其存在,否則添加之;顯示添加的用戶id號(hào)等信息

vi createuser.sh 
#!/bin/bash
result=`id $1 &>/dev/null;echo $?`
if [ $result -eq 0 ];then
        echo 該用戶已存在
else
        useradd $1 && id $1
fi

效果:

./createuser.sh zxh666
uid=2015(zxh666) gid=2015(zxh666) groups=2015(zxh666)
./createuser.sh zxh666
該用戶已存在

多分支
if 判斷條件1; then
條件1為真的分支代碼
elif 判斷條件2; then
條件2為真的分支代碼
elif 判斷條件3; then
條件3為真的分支代碼
else
以上條件都為假的分支代碼
fi

逐條件進(jìn)行判斷,第一次遇為“真”條件時(shí),執(zhí)行其分支,而后結(jié)束整個(gè)if語句。

3.4.6 條件判斷語句case

case 變量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默認(rèn)分支
;;
esac

case支持glob風(fēng)格的通配符:
*: 任意長(zhǎng)度任意字符
?: 任意單個(gè)字符
[]:指定范圍內(nèi)的任意單個(gè)字符
a|b: a或b

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,727評(píng)論 0 5
  • 第 2 章 SHELL 基礎(chǔ)知識(shí)2.1 shell腳本我們?cè)谏厦婧?jiǎn)單介紹了一下什么是shell腳本,現(xiàn)在我們來進(jìn)一...
    LiWei_9e4b閱讀 1,652評(píng)論 0 0
  • 概述 首先,咱們來了解一下,什么是Shell。操作系統(tǒng)內(nèi)核給我們提供了各種接口,同時(shí)也提供了各種用戶層的庫,理論上...
    keysaim閱讀 1,525評(píng)論 0 0
  • 建立一個(gè)腳本 Linux中有好多中不同的shell,但是通常我們使用bash (bourne again shel...
    某人在閱讀 2,120評(píng)論 0 0
  • 個(gè)人學(xué)習(xí)批處理的初衷來源于實(shí)際工作;在某個(gè)迭代版本有個(gè)BS(安卓手游模擬器)大需求,從而在測(cè)試過程中就重復(fù)涉及到...
    Luckykailiu閱讀 4,995評(píng)論 0 11

友情鏈接更多精彩內(nèi)容