Linux雲計算運維之Shell

find 搜索文件名是完全匹配

find . -name “abc*” 查詢以abc開頭的文件
通配符與正則表達式的區別?
通配符 :用於匹配文件名
? :匹配一個任意字符

  • :匹配0個或任意多個任意字符,也就是可以匹配任何內容
    [] : 匹配中括號中任意一個字符。例如,[abc]代表一定匹配一個字符,或者是a,或者是b,或者是c
    [-] : 匹配中括號中任意一個字符,-代表一個範圍。例如,[a-z] 代表匹配一個小寫字母
    [^] : 邏輯非,表示匹配不是中括號內的一個字符。例如,[^0-9]代表匹配一個不是數字的字符

grep 搜索文件名中的字符串,包含匹配

grep -n “123” abc : 搜索文件中abc的字符串是123,並且顯示行號
grep -v “123” abc : 搜索文件abc中不是123的內容
grep --color=auto “123” abc :顯示在文件中匹配的“123”的顏色

管道符 :

  1. 行提取命令 grep
    grep [選項] “搜索內容” 文件名
    選項 :
    -A 數字 ;列出符合條件的行,並列出後續的n行
    -B 數字 :列出符合條件的行,並列出前面的n行
    -c :統計找到的符合條件的字符串的次數
    -i :忽略大小寫
    -n :輸出行號
    -v :反向查找
    –color=auto : 搜索出的關鍵字用顏色顯示

正則表達式 :用於匹配字符串,包含匹配
? :匹配前一個字符重複0次,或1次 : 只能用 egrep

  •  :匹配前一個字符重複0次,或任意多次
    

. : 匹配除了換行符外任意一個字符。
[] : 匹配中括號中任意一個字符。只匹配一個字符。例如,[abc]代表一定匹配一個字符,或者是a,或者是b,或者是c,[0-9] 匹配任意一位數字,[a-z][0-9]匹配小寫字母和一位數字構成的兩位字符。
[-] : 匹配中括號中任意一個字符,-代表一個範圍。例如 ,[a-z]代表匹配一個小寫字母。
[^] : 邏輯非,表示匹配不是中括號內的一個字符。例如,[0-9]代表匹配一個不是數字的字符。[a-z]表示任意一位非小寫字母。
\ : 轉義符。用於將特殊符號的含義取消。
{n} : 表示其前面的字符恰好出現n次。例如 :[0-9]{4} 匹配4位數字,[1][3-8][0-9]{9} 匹配手機號碼
^ :匹配行首。例如 :^hello會匹配以hello開頭的行。
$ : 匹配行位。例如 ;hello&會匹配以hello結尾的行。
{n,} : 表示其前面的字符出現不小於n次。例如 :[0-9]{2,} 表示兩位及以上的數字。
{n,m} : 表示其前面的字符至少出現n次,最多出現m次。例如 :[a-z]{6,8}匹配6到8位的小寫字母。

grep “^KaTeX parse error: Expected group after '^' at position 34: …空白行 grep -v "^̲” test.txt : 查詢出來的空白行取反。
grep “1” test.txt : 查詢數字開頭的

例如 :egrep “aaa?” abc :

netstat -an | grep “ESTABLISHED” | wc -l : 把所有鏈接服務轉換成一個文本流,傳遞到下一個grep裏面,並從這個文本流中搜索包含ESTABLISHED的字符串,再轉換成文本流,去統計文本流中的行數

echo “字符串” : 把字符串輸出到控制檯

標準錯誤輸出重定向
錯誤命令 2> 文件 :以覆蓋的方式,把命令的錯誤輸出到指定的文件或設備當中。
錯誤命令 2>> 文件 :以追加的方式,把命令的錯誤輸出到指定的文件或設備當中。

正確輸出和錯誤輸出同時保存
命令 > 文件 2>&1 以覆蓋的方式,把正確輸出和錯誤輸出都保存到同一個文件當中。
命令 >> 文件 2>&1 以追加的方式,把正確輸出和錯誤輸出都保存到同一個文件當中。
命令 &> 文件 以覆蓋的方式,把正確輸出和錯誤輸出都保存到同一個文件當中。
命令 &>> 文件 以追加的方式,把正確輸出和錯誤輸出都保存到同一個文件當中。
命令 >> 文件1 2>>文件2 把正確的輸出追加到文件1中,把錯誤的輸出追加到文件2中。

多命令執行符合 :
; 命令1 ; 命令2 多個命令順序執行,命令之間沒有任何邏輯聯繫
&& 命令1 && 命令2 當命令1正確執行(=021?=0),則命令2纔會執行;當命令1執行不正確(?不等於0)則命令2不會執行
|| 命令1 || 命令2 當命令1執行不正確(?021?不等於0),則命令2纔會執行;當命令1正確執行(?=0),則命令2不會執行

Bash中其他特殊符合 :
‘’ : 單引號。在單引號中所有的特殊符合,如“”和“`”(反引號)都沒有特殊含義。就是隻是字符串了。 “” :雙引號。在雙引號中特殊符合都沒有特殊含義,但是“"、”`“(反引號)和”\“是例外,擁有”調用變量的值“、”引用命令“和”轉義符“的特殊含義。
`` :反引號。反引號括起來的內容是系統命令,在Bash中會先執行它。和()使()作用一樣,不過推薦使用(),因爲反引號非常容易看錯。
$() : 和反引號作用一樣,用來引用系統命令。
() : 用於一串命令執行時,()中的命令會在Shell中運行。
{} :用於一串命令執行時,{}中的命令會在當前Shell中執行。也可以用於變量變形與替換。
[] : 用於變量的測試。
# : 在Shell腳本中,#開頭的行代表註釋。
$ : 用於調用變量的值,如需要調用變量name的值時,需要用$name 的方式得到變量的值。
\ : 轉義符,跟在\之後的特殊符號將失去特殊含義,變爲普通字符。如$將輸出“$”符號,而不當做是變量引用。

如果是把命令的結果作爲變量值賦予變量,則需要使用反引號或()test=()包含命令。 例如 :test=(date)
echo $test

變量分類 :

用戶自定義變量 :名稱:自定義 作用:自定義 內容:自定義
環境變量 :
用戶自定義環境變量 :名稱:自定義 作用:自定義 內容:自定義
系統自帶環境變量 :名稱:確定 作用:確定 內容:自定義
位置參數變量 :名稱:確定 作用:確定 內容:自定義
預定義變量 :名稱:確定 作用:確定 內容:自定義

變量查看 :

set [選項]

選項 :
-u 如果設定此選項,調用未聲明變量時會報錯(默認無任何提示)
-x 如果設定此選項,在命令執行之前,會把命令先輸出一次

刪除變量 :unset 變量名稱

環境變量

環境變量設置
export age=“18”
環境變量查詢和刪除
env命令和set命令的區別是,set命令可以查看所有變量(包括本地變量和環境變量),而env命令只能查看環境變量

PATH變量 :系統查找命令的路徑

通過echo KaTeX parse error: Expected 'EOF', got '#' at position 208: …hello.sh /bin/ #̲ 拷貝hello.sh到/bi…PATH":/root/sh # 在變量的PATH的後面,加入/root/sh目錄
查看echo $PATH #查詢PATH的值,變量疊加生效了
現在的PATH變量只是臨時生效,一旦重啓或註銷就會消失,如果想要永久生效,需要寫入環境變量配置文件中。

PS1變量 :命令提示符設置

通過set命令可以查看
PS1用來定義命令行的提示符的,可以按照自己的需要定義自己喜歡的提示符。PS1支持以下這些選項 :
\d: 顯示日期,格式爲”星期 月 日“
\H: 顯示完整的主機名。如默認主機名“localhost.localdomain”
\h: 顯示簡寫主機名。如默認主機名 “localhost”
\t: 顯示24小時制時間,格式爲“HH:MM:SS”
\T: 顯示12小時制時間,格式爲“HH:MM:SS”
\A: 顯示24小時制時間,格式爲“HH:MM”
@: 顯示12小時制時間,格式爲“HH:MM am/pm”
\u: 顯示當前用戶名
\v: 顯示Bash的版本信息
\w: 顯示當前所在目錄的完整名稱
\W: 顯示當前所在目錄的最後一個目錄
#: 執行的第幾個命令
$: 提示符。如果是root用戶會顯示提示符爲“#”,如果是普通用戶會顯示提示符爲$

例如 :PS1=’[\u@\H:\A \w]# ’

位置參數變量 :

$n : n爲數字,$0代表命令本身,$1-99代表第一到第九個參數,十以上的參數需要用大括號包含,如{10}.
:* : 這個變量代表命令行中所有的參數,*把所有的參數看成一個整體
@:@ : 這個變量也代表命令行中所有的參數,不過@把每個參數區分對待
$# : 把這個變量代表命令行中所有參數的個數

例如 :./count.sh 22 23 #$0 就是輸出的是./count.sh

預定義變量 :

$? : 最後一次執行的命令的返回狀態。如果這個變量的值爲0,證明上一個命令正確執行;如果這個變量的值爲非0(具體是哪個數,由
命令自己來決定),則證明上一個命令執行不正確了。
$$ : 當前進程的進程號(PID)
$! : 後臺運行的最後一個進程的進程號(PID)

Shell 的運算符

需要進行數值運算,採用以下三種方法中的任意一種 :
使用declare聲明變量類型 :
既然所有變量的默認類型是字符串型,使用declare命令就可以實現聲明變量的類型 :
declare [+/-][選項] 變量名
選項 :

  • :給變量設定類型屬性
  • :取消變量的類型屬性
    -a : 將變量聲明爲數組類型
    -i : 將變量聲明爲整數型(integer)
    -r : 將變量聲明爲只讀變量。注意,一旦設置爲只讀變量,既不能修改變量的值;
    也不能刪除變量,甚至不能通過 + r 取消只讀屬性
    -x : 將變量聲明爲環境變量
    -p : 顯示指定變量的被聲明的類型
    例如 :a=11 b=22 declare -i c=a+a+b echo $c

變量的測試與內容置換

變量置換方式 變量y沒有設置 變量y爲空值 變量y設置值

x=yx=xx={y-新值} x=新值 x爲空 x=y
x=y:x=x=x={y:-新值} x=新值 x=新值 x=y
x=y+xx=x=x={y+新值} x爲空 x=新值 x=新值 x={y:+新值} x爲空 x爲空 x=新值
x=y=x=y=xyx={y=新值} x=新值 y=新值 x爲空 y值不變 x=y y值不變
x=y:=x=y=x=y=x={y:=新值} x=新值 y=新值 x=新值 y=新值 x=y y值不變
x=y?xx={y?新值} 新值輸出到標準錯誤輸出(就是屏幕) x爲空 x=y
x=y:?x={y:?新值} 新值輸出到標準錯誤輸出 新值輸出到標準錯誤輸出 x=y

環境變量配置文件

  1. source 命令 : 不用系統重啓,直接加載配置文件
    source 配置文件 或者 . 配置文件

  2. 環境變量配置文件
    1)。登錄時生效的環境變量配置文件
    在Linux系統登陸時主要生效的環境變量配置文件有以下五個 :
    /etc/profile
    /etc/profile.d/*.sh
    ~/.bash_profile
    /etc/bashrc

在etc目錄下的對所有用戶生效,在家目錄下的只對當前用戶生效

在用戶登陸過程先調用/etc/profile文件
在這個環境變量配置文件中會定義這些默認環境變量 :
USER : 根據登錄的用戶,給這個變量賦值(就是讓USER變量的值是當前用戶)
LOGNAME變量 :根據USER變量的值,給這個變量賦值。
MAIL變量 :根據登錄的用戶,定義用戶的郵箱爲/var/spool/mail/用戶名
PATH變量 :根據登錄的用戶的UID是否爲0,判斷PATH變量是否包含/sbin、/usr/sbin和/usr/local/sbin這三個系統命令目錄。
HOSTAME變量 :更加主機名,給這個變量賦值。
HISTSIZE變量 :定義歷史命令的保存條數。
umask :定義umask默認權限。注意/etc/profile文件中的umask權限是在“有用戶登錄過程(也就是輸入了用戶名和密碼)”時纔會生效。
調用/etc/profile.d/*.sh文件,也就是調用/etc/profile.d/目錄下所有以.sh結尾的文件。

由/etc/profile 文件調用/etc/profile.d/*.sh文件
這個目錄中所有以.sh結尾的文件都會被/etc/profile文件調用,這裏最常用的就是lang.sh文件,而這個文件又會調用/etc/sysconfig/i18n文件。這是默認語系配置文件。

由/etc/profile文件調用~/.bash_profile文件
~/.bash_profile文件就沒有那麼複雜了,這個文件主要實現了兩個功能L:
調用了~/.bashrc文件
在PATH變量後面加入了“:$HOME/bin”這個目錄。那也就是說,如果我們在自己的家目錄中建立bin目錄,然後把自己的腳本放入“~/bin”目錄,就可以直接執行腳本,而
不用通過目錄執行了。
/.bash_profile文件調用/.bashrc文件
在~/.bashrc文件中主要實現了 :
定義默認別名,所以把自己定義的別名也放入了這個文件。
調用/etc/bashrc
由~/.bashrc 調用了/etc/bashrc文件
在/etc/bashrc文件中主要定義了這些內容 :
PS1變量 :也就是用戶的提示符,如果我們想要永久修改提示符,就要在這個文件中修改
umask : 定義umask默認權限。這個文件中定義的umask是針對“沒有登錄過程”(也就是不需要輸入用戶名和密碼時,比如從一個終端切換到另一個終端,或進入子Shell)“
時生效的。如果是”有用戶登錄過程“,則是/etc/profile文件中的umask生效。
PATH變量 :會給PATH變量追加值,這也是在”沒有用戶登錄過程“是才調用。在”有用戶登錄過程“時,/etc/profile.d/*.sh文件已經被/etc/profile文件調用過。
如果打算對所有用戶生效,可以修改/etc/profile環境變量配置文件;如果你的修改只是給自己使用的,那麼可以放入~/.bash_profile或!/。bashrc這兩個配置文件
中的任一個。
可是如果我們誤刪除了這些環境變量,比如刪除了/etc/bashrc文件,或刪除了/.bashrc文件,那麼這些文件中配置就會失效(/.bashrc文件會調用/etc/bashrc文件)。那麼
我們的提示符就會變成 : -bash-4.#

註銷時生效的環境變量配置文件
在用戶退出登錄時,只會調用一個環境變量配置文件,就是~/.bash_logout,這個文件默認沒有寫入任何內容,可是如果我們希望再退出登錄時執行一些操作,比如清除歷史命令,備份某些數據,就可以把命令寫入這個文件。
~/.bash_history文件,保存的是歷史命令

字符串截取和替換命令

cut列提取命令
cut [選項] 文件名
選項 :
-f 列號 :提取第幾列
-d 分隔符 :按照指定分隔符分割列
-c 字符範圍 :不依賴分隔符來區分列,而是通過字符範圍(行首爲0)來進行字段提取。”n-“表示從第n個字符到行尾;”n-m“從第n個字符到第m個字符:”-m“表示從第1個字符到第m個字符。

cut命令的默認分隔符是製表符,也就是”tab“鍵,不過對空格符可是支持的不好,我們先建立一個測試文件,然後看看cut命令的作用吧 :
vi student.txt
ID Name gender Mark
1 Liming M 86
2 Sc M 90
3 Tg M 83

awk ‘{printf $2 “\t” $6 “\n”}’ student.txt : 輸出第二列和第六列 (printf輸出需要換行符,print輸出不需要換行符
awk的條件 :
條件的類型 條件 說明
awk保留字 BEGIN 在awk程序一開始時,尚未讀取任何數據之前執行。BEGIN後的動作只在程序開始時執行一次
END 在awk程序處理完所有數據,即將結束時執行。END後的動作只在程序結束時執行一次
關係運算符 > 大於
< 小於

= 大於等於
<= 小於等於
== 等於。用於判斷兩個值是否相等,如果是給變量賦值,請使用“=”號
!= 不等於
A~B 判斷字符串A中是否包含能匹配B表達式的子字符串
A !~ B 判斷字符串A中是否不包含能匹配B表達式的子字符串
正則表達式 /正則/ 如果在“//” 中可以寫入字符,也可以支持正則表達式
BEGIN是awk的保留字,是一種特殊的條件類型。BEGIN的執行時機是“在awk程序一開始時,尚未讀取任何數據之前執行”。一旦BEGIN後的動作執行一次,當awk開始從文件中讀入數據,BEGIN的條件
就不再成立,所以BEGIN定義的動作只能被執行一次。
例如 :awk ‘BEGIN{printf “This is a transcript \n”} {printf “\t” $4 “\n”}’ student.txt

關係運算符
舉幾個例子。假設看看平均成績大於等於87分的學員是誰,就可以這樣輸入命令 ;
cat student.txt | grep -v Name | awk ‘$4 >= 87 {printf $2 “\n”}’

awk編程

printf格式化輸出

printf ‘輸出類型輸出格式’ 輸出內容
輸出類型 :
%ns :輸出字符串。n是數字指代輸出幾個字符
%ni :輸出整數。n是數字指代輸出幾個數字
%m.nf : 輸出浮點數。m和n是數字,指代輸出的整數位數和小數位數。如%8.2f
代表共輸出8位數,其中2位是小數,6位是整數。
輸出格式 :
\a : 輸出警告聲音
\b : 輸出退格鍵,也就是Backspace鍵
\f : 清楚屏幕
\n : 換行

awk 基本使用

awk ‘條件1{動作1} 條件2{動作2}…’ 文件名
條件(Pattern):
一般使用關係表達式作爲條件。這些關係表達式非常多,具體參考表12-3所示,例如 :
x > 10 判斷變量x是否大於10
x == y 判斷變量x是否等於變量y
A ~ B 判斷字符串A中是否包含能匹配B表達式的子字符串
A !~ B 判斷字符串A中是否不包含能匹配B表達式的子字符串
動作(Action):
格式化輸出
流程控制語句

sed命令

sed主要是用來將數據進行選取、替換、刪除、新增的命令,我們看看命令的語法 :
sed 【選項】‘【動作】’ 文件名
選項 :
-n 一般sed命令會 把所有數據都輸出到屏幕,如果加入此選擇,則只會把經過sed命令處理的行輸出到屏幕。
-e 允許對輸入數據英語多條sed命令編輯。
-f 腳本文件名 :從sed腳本中讀入sed操作,和awk命令的-f非常類似,
-r 在sed的修改結果直接修改讀取數據的文件,而不是由屏幕輸出
動作 :
a : 追加,在當前行後添加一行或多行。添加多行時,除最後一行外,每行末尾需要用“\”代表數據未完結。
c : 行替換,用c後面的字符串替換原數據行,替換多行時,除最後一行外,每行末尾需用“\”代表數據未完結。
i : 插入,在當期行前插入一行或多行。插入多行時,除最後一行外,每行末尾需要用“\”代表數據未完結。
d : 刪除,刪除指定的行。
p :打印,輸出指定的行。
s :字串替換,用一個字符串替換另外一個字符串。格式爲“行範圍 s/
舊字串/新字串/g“ (和vim中的替換格式類似)
對sed命令要注意,sed所做的修改並不會直接改變文件的內容(如果是用管道符接收的命令的輸出,這種情況連文件都沒有),而是把修改結果只是顯示到屏幕上,除非用“-i”選項纔會直接修改文件

字符處理命令

排序命令 sort
sort 【選項】 文件名
選項 :
-f :忽略大小寫
-b :忽略每行前面的空白部分
-n :以數值型進行排序,默認使用字符串型排序
-r :反向排序
-u :刪除重複行。就是uniq命令
-t :指定分隔符,默認是分隔符是製表符
-k n[m] : 按照指定的字段範圍排序。從第n字段開始,m字段結束(默認到行末尾)
sort 命令默認是用每行開頭第一個字符來進行排序的,比如 :
sort -n -t “:” k 3,3 /etc/passwd
當然“-k” 選項可以直接使用 “-k 3”,代表從第三字段到行尾都排序(第一個字符先排序,如果一致,第二個字符再排序,直到行尾)
uniq
unid命令是用來取消重複行的命令,其實和“sort -u”選項是一樣的。命令格式如下 :
uniq 【選項】文件名
-i :忽略大小寫
統計命令 wc
wc 【選項】文件名
選項 :
-l :只統計行數
-w :只統計單詞數
-m :只統計字符數

條件判斷

1. 按照文件類型進行判斷

測試選項 作用
-b 文件 判斷該文件是否存在,並且是否爲塊設備文件(是塊設備文件爲真)
-c 文件 判斷該文件是否存在,並且是否爲字符設備文件(是字符設備文件爲真
-d 文件 判斷該文件是否存在,並且是否爲目錄文件(是目錄爲真)
-e 文件 判斷該文件是否存在(存在爲真)
-f 文件 判斷該文件是否存在,並且是否爲普通文件(是普通文件爲真)
-L 文件 判斷該文件是否存在,並且是否爲符號鏈接文件(是符號鏈接文件爲真
-p 文件 判斷該文件是否存在,並且是否爲管道文件(是管道文件爲真)
-s 文件 判斷該文件是否存在,並且是否爲非空(非空爲真)
-S 文件 判斷該文件是否存在,並且是否爲套接字文件(是套接字文件爲真)

2. 按照文件權限進行判斷

test是非常完善的判斷命令,還可以判斷文件的權限。

測試選項 作用
-r 文件 判斷該文件是否存在,並且是否該文件擁有讀權限(有讀權限爲真)
-w 文件 判斷該文件是否存在,並且是否該文件擁有寫權限(有寫權限爲真)
-x 文件 判斷該文件是否存在,並且是否該文件擁有執行權限(有執行權限爲真)
-u 文件 判斷該文件是否存在,並且是否該文件擁有SUID權限(有SUID權限爲真)
-g 文件 判斷該文件是否存在,並且是否該文件擁有SGID權限(有SGID權限爲真)
-k 文件 判斷該文件是否存在,並且是否該文件擁有SBit權限(有SBit權限爲真)

3. 兩個文件之間進行比較

測試選項 作用
文件 1 -nt 文件 2 判斷文件 1 的修改時間是否比文件 2 的新(如果新則爲真)
文件 1 -ot 文件 2 判斷文件 1 的修改時間是否比文件 2 的舊(如果舊則爲真)
文件 1 -ef 文件 2 判斷文件 1 是否和文件 2 的Inode號一致,可以理解爲兩個文件是否爲同一個文件。這個判斷用於判斷硬鏈接是很好的方法

4.兩個整數之間比較

測試選項 作用
整數 1 -eq 整數 2 判斷整數 1 是否和整數 2 相等(相等爲真)
整數 1 -ne 整數 2 判斷整數 2 是否和整數 2 不相等(不相等位置)
整數 1 -gt 整數 2 判斷整數 1 是否大於整數 2 (大於爲真)
整數 1 -lt 整數 2 判斷整數 1 是否小於整數 2(小於爲真)
整數 1 -ge 整數 2 判斷整數 1 是否大於等於整數 2(大於等於爲真)
整數 1 -le 整數 2 判斷整數 1 是否小於等於整數 2(小於等於爲真)

5. 字符串的判斷

測試選項 作用
-z 字符串 判斷字符串是否爲空(爲空返回真)
-n 字符串 判斷字符串是否爲非空(非空返回真
字符串1 == 字串2 判斷字符串1是否和字符串2相等(相等返回真)
字串 1 != 字串 2 判斷字符串1是否和字符串2不相等(不相等返回真)

6. 多重條件判斷

測試選項 作用
判斷 1 -a 判斷 2 邏輯與,判斷 1 和判斷 2 都成立,最終的結果才爲真
判斷 1 -o 判斷 2 邏輯或,判斷 1 和 判斷 2 有一個成立,最終的結果就爲真
!判斷 邏輯非,使原始的判斷式取反

流程控制

1. if條件判斷

1)單分之if條件語句
單分之條件語句最爲簡單,就是隻有一個判斷條件,如果符合條件則執行某個程序,否則什麼事情都不做。語法如下 :
if [ 條件判斷式 ] ; then
程序
fi
單分之條件語句需要注意幾個點 :

  1. if語句使用fi結尾,和一般語言使用大括號結尾不同
  2. [ 條件表達式 ] 就是使用 test 命令判斷,所以中括號和條件判斷式之間必須有空格
  3. then 後面跟符合條件之後執行的程序,可以放在[] 之後,用“:”分割。也可以換行斜日,就不需要“;”了,比如單分支if語句還可以這樣寫 :
    if [ 條件判斷式 ]
    then
    程序
    fi
    案例1 :
#!/bin/bash

aa=$( jps | grep TestDemo  | awk '{print $2}' )

if [ "$aa" != "TestDemo" ]
	then
		java -cp /root/test-demo-0.0.1-SNAPSHOT.jar com.example.testdemo.TestDemo
	else
		echo "java is ok"
fi

2)雙分支if條件語句
if [ 條件判斷式 ]
then
條件成立時,執行的程序
else
條件不成立時,執行的另一個程序
fi
案例2 :

#!/bin/bash

aa=$( jps | grep TestDemo  | awk '{print $2}' )

if [ "$aa" != "TestDemo" ]
	then
		java -cp /root/test-demo-0.0.1-SNAPSHOT.jar com.example.testdemo.TestDemo
	else
		echo "java is ok"
fi

3)多分支if條件語句
if [ 條件判斷式 1 ]
then
當條件判斷式 1 成立時,執行程序1
elif [ 條件判斷式 2 ]
then
當條件判斷式 2 成立時,執行程序 2
else
當所有條件都不成立時,最後執行此程序
fi
案例3 :

#!/bin/bash

read -p "Please input a filename: " filename

if [ -z $filename ]
	then
		echo "11111"
		exit 101
elif [ ! -e $filename ]
	then
		echo "2222222"
		exit 102
elif [ -f $filename ]
	then
		echo "$filename is putong"
elif [ -d $filename ]
	then
		echo "$filename is dire"
else
	echo "$filename is other file"
fi

案例4 :

#!/bin/bash
#字符界面加減乘除計算器

read -t 30 -p "Please input num1 : " num1
read -t 30 -p "Please input num2 : " num2
#通過 read 命令接收要計算的數值,並賦予變量num1和num2
read -t 30 -p "Please input a operator : " ope
# 通過 read 命令接收要計算的符號,並賦予變量ope

if [ -n "$num1" -a -n "$num2" -a -n "$ope" ]
#第一層判斷,用來判斷num1、num2和ope中都有值
	then
	test1=$(echo $num1 | sed ' s/[0-9]//g')
	test2=$(echo $num2 | sed 's/[0-9]//g')
	#定義變量test1和test2的值爲$(命令)的結果
	#後續命令作用是,把變量test1的值替換爲空。如果能替換爲空,證明num1的值爲數字
	#如果不能替換爲空,證明num1的值爲非數字。我們使用這種方法判斷變量num1的值爲數字
	#用同樣的方法測試test2變量
	if [ -z "$test1" -a -z "$test2" ]
	# 第二層判斷,用來判斷num1和num2爲數值
	#如果變量test1和test2的值爲空,則證明num1和num2是數字
		then
		#如果 test1和test2是數字,則執行以下命令
			if [ "$ope" == '+' ]
			#第三層判斷用來確認運算符
			#測試變量$ope中是什麼運算符
				then
				value=$(( $num1 + $num2 ))
				#如果是加號則執行加法運算
			elif [ "$ope" == '-' ]
				then
				value=$(( $num1 - $num2 ))
				#如果是減號,則執行減法運算
			elif [ "$ope" == '*' ]
				then
				value=$(( $num1 * $num2 ))
			elif [ "$ope" == '/' ]
				then
				value=$(( $num1 / $num2 ))
			else
				echo "Please enter a valid symbol"
				#如果運算符不匹配,提示輸入有效的符號
				exit 10
				# 並退出程序,返回錯誤代碼10
			fi
	else
	# 如果test1和test2不爲空,說明num1和num2不是數字
		echo "Please enter a valid value"
		#則提示輸入有效的數值
		exit 11
		#並退出程序,返回錯誤代碼 11
	fi
else
	echo "qing shuru neirong"
	exit 12
fi
echo "$num1 $ope $num2 : $value"

4)多分支 case 條件語句
case 語句和if … elif … else 語句一樣都是多分支條件語句,不過和if多分支條件語句不同的是,case語句只能判斷一種條件關係,而if語句可以判斷多種條件關係。case語句語法如下 :
case $變量名 in
“值 1” )
如果變量的值等於值1,則執行程序 1
;;
“值 2” )
如果變量的值等於值2,則執行程序 2
;;
… 省略其他分支…
* )
如果變量的值都不是以上的值 則執行此程序
;;
esac
這個語句需要注意以下內容 :
case 語句,會取出變量中的值,然後與語句體中的值逐一比較。如果數值符合,則執行對應的程序,如果數值不符,則依次比較下一個值。如果所有的值都不符合,則執行“)” (“”代表所有其他值)中的程序
case語句以“case” 開頭,以 “esac” 結尾。
案例5 :

#!/bin/bash

echo "want to beijing,please input 1"
echo "want to shanghai,please input 2"
echo "want to chendu,please input 3"

read -t 30 -p "please input your choice: " cho

case $cho in
	"1")
		echo "beijing111111111"
		;;
	"2")
		echo "shanghai22222222"
		;;
	"3")
		echo "chendu333333333"
		;;
	*)
		echo "error input"
		;;
esac

3 for 循環
for 循環是固定循環,也就是在循環時已經知道需要進行幾次的循環,有時也把for循環稱爲計數循環。for的語法有如下兩種 :
語法一 :
for 變量 in 值1 值2 值3 …
do
程序
done
這種語法中 for 循環的次數,取決於in後面值的個數(空格分隔),有幾個值就循環幾次,並且每次循環都把值賦予變量。也就是說,假設in後面有三個值,for 會循環三次,第一次循環會把值 1 賦予變量,第二次循環會把值 2 賦予變量,依次類推。
語法二 :
for (( 初始值 ;循環控制條件 ;變量變化 ))
do
程序
done
語法二中需要注意 :
初始值 :在循環開始時,需要給某個變量賦予初始值,如 i = 1;
循環控制條件 :用於指定變量循環的次數,如 i <= 100,則只要i的值小於等於100,循環就會繼續;
案例6 :

#!/bin/bash

cd /root/sh/

ls *.tar.gz > tar.log
ls * .tgz >> tar.log & >/dev/null

aa=$( cat tar.log | wc -l )

for (( i = 1; i <= "$aa"; i=i+1 ))
	do
		bb=$( cat tar.log | awk 'NR=='$i' {print $1}' )
		tar -zxvf $bb -C /root/sh
	done

案例7 :

#!/bin/bash

cd /root/sh/

ls *.tar.gz > tar.log
ls *.tgz >> tar.log &>/dev/null
ls *.tar.bz2 >> tar.log &>/dev/null


for i in $( cat tar.log )
	do
		tar -zxvf $i
	done

rm -rf tar.log

案例8 :

#!/bin/bash

grep "^[0-9]\{1,3}\.[0-9]\{1,3}\.[0-9]\{1,3}\.[0-9]\{1,3\}$" /root/ip.txt > /root/ip_test1.txt

#先通過正則,把明顯不符合規則的ip過濾,把結果保存在ip_test1.txt臨時文件中

line=$( wc -l /root/ip_test1.txt | awk '{print $1}' )
# 統計 test1中有幾行IP
echo "" >/root/ip_test.txt
#清空最終數據文件

for (( i=1; i<=$line;i=i+1 ))
	#有幾行,循環幾次
	do
		cat/root/ip_test1.txt | awk 'NR=='$i'{print}' >/root/ip_test2.txt	#第幾次循環,就把第幾行讀入 ip_test2.txt文件(此文件中只有一行IP)
		a=$( cat /root/ip_test2.txt | cut -d '.' -f 1 )
		b=$( cat /root/ip_test2.txt | cut -d '.' -f 2 )
		c=$( cat /root/ip_test2.txt | cut -d '.' -f 3 )
		d=$( cat /root/ip_test2.txt | cut -d '.' -f 4 )
		#分別把IP地址的四個數值分別讀入變量a、b、c、d

		if [ "$a" -lt 1 -o "$a" -gt 255 ]
		#如果第一個數值小於1或大於等於255
			then
				continue
				#則退出本次循環
		fi

		if [ "$b" -lt 0 -o "$b"  -gt 255 ]
			then
				continue
		fi

		if[ "$c" -lt 0 -o "$c" -gt 255 ]
			then
				continue
		fi

		if [ "$d" -lt 0 -o "$d" -gt 255 ]
			then
				continue
		fi
		#依次判斷四個ip數值是否超出範圍,如果超出,退出本次循環

		cat /root/ip_test2.txt >> /root/ip_test.txt
		#如果四個IP數值都符合要求,則把合法IP記錄在文件中
	done

	rm -rf /root/ip_test1.txt

案例9 :

#!/bin/bash
i=1
s=0
#給變量i和變量s複製
while [ $i -le 100 ]
	#如果變量i的值小於等於100,則執行循環
		do
			s=$(( $s+$i ))
			i=$(( $i+1 ))
		done
echo "The sum is : $s"

案例 :10

#!/bin/bash
read -p "Please input a number : " -t 30 num
#接收用戶的輸入,並把輸入賦予變量num
y=$( echo $num | sed 's/[0-9]//g' )
#如果變量num的值是數字,則把num的值替換爲空,否則不替換
#把替換之後的值賦予變量y
[ -n "$y" ] && echo "Error,Please input a number!" && exit 18
#判斷變量y的值如果不爲空,輸出報錯信息,退出腳本,退出返回值爲18
echo "The number is : $num"
#如果沒有退出,則打印變量num中的數字

案例11 :

#!/bin/bash
i=1
s=0
until [ $i -gt 100 ]
	do
		s=$(( $s+$i ))
		i=$(( $i+1 ))
	done
echo "This is sum : $s"

案例12 :

#!/bin/bash
for (( i=1;i<=10;i=i+1 ))
	do
		if [ "$i" -eq 4 ]
		then
			break
		fi
	echo $i
done

  1. 0-9 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章