天天看點

shell程式設計

(1)

輸出指令:echo [選項] [輸出内容]

-e 支援反斜線控制的字元轉換

接收鍵盤輸入:read [選項] [變量名]

-p “提示資訊”:在等待read輸入時,輸出提示資訊

-t 秒數: read指令會一直等待使用者輸入,使用此選項可以指定等待時間

-n 字元數:  read指令隻接受指定的字元數,就會執行

-s: 隐藏輸入的資料,适用于機密資訊的輸入

例:

#!/bin/bash

read -t 30 -p "Please input your name: " name

# 提示“請輸入姓名”并等待 30 秒,把使用者的輸入儲存入變量 name 中

echo "Name is $name "

read -s -t 30 -p "Please enter your age: " age

# 年齡是隐私,是以我們用“ -s ”選項隐藏輸入

echo -e "\n"

echo "Age is $age "

read -n 1 -t 30 -p "Please select your gender[M/F]: " gender

# 使用“ -n 1 ”選項隻接收一個輸入字元就會執行(都不用輸入回車)

echo "Sex is $gender"

(2)腳本

1.開頭需加:#!/bin/bash

2.給腳本賦予權限:chmod 755 hello.sh

3.執行:

  絕對路徑執行:./hello.sh

  通過bash:bash hello.sh

注:windows編輯的sh在linux無法執行,轉換格式:dos2unix hello.sh

(3)bash基本功能

1.曆史指令:history [選項] [曆史指令儲存檔案]

-c 清空曆史指令

-w 把緩存中的曆史指令修曆史指令儲存檔案 ~/.bash_history

曆史指令預設儲存1000條,可在環境變量配置檔案/etc/profile中修改

2.指令别名:

設定指令别名:alias 别名='原指令'

查詢指令别名:alias

讓别名永久生效:vi /root/.bashrc

删除别名:unalias 别名

3.快捷鍵

剪切光标前的内容:ctrl + u

剪切光标後的内容:ctrl + k

粘貼u,k内容:ctrl + y

把光标移到指令開頭:ctrl + a

把光标移到指令結尾:ctrl + e

強行終止指令:ctrl + c

清屏:ctrl + l

搜尋:ctrl + r

退出目前終端:ctrl + d

暫停,放入背景:ctrl + z

暫停螢幕輸出:ctrl + s

回複螢幕輸出:ctrl + q

4.輸出重定向

a.标準輸入輸出:

裝置    裝置檔案名    檔案描述符    類型

鍵盤    /dev/stdin        0        标準輸入

顯示器    /dev/sdtout        1        标準輸出

顯示器    /dev/sdterr        2        标準錯誤輸出

b.輸出重定向:

類型                    符号                作用

标準輸出重定向        指令>檔案            以覆寫的方式,把指令的正确輸出寫入指定檔案或裝置中

                    指令>>檔案            以追加的方式,把指令的正确輸出寫入指定檔案或裝置中

标準錯誤輸出重定向    錯誤指令 2>檔案        以覆寫的方式,把指令的錯誤輸出寫入指定檔案或裝置中

                    錯誤指令 2>>檔案    以追加的方式,把指令的錯誤輸出寫入指定檔案或裝置中

c、正确輸出和錯誤輸出同時儲存

指令 > 檔案 2>&1          以覆寫的方式,把正确輸出和錯誤輸出都儲存到同一個檔案中

指令 >> 檔案 2>&1         以追加的方式,把正确輸出和錯誤輸出都儲存到同一個檔案中    

指令 &> 檔案             以覆寫的方式,把正确輸出和錯誤輸出都儲存到同一個檔案中    

指令 &>> 檔案             以追加的方式,把正确輸出和錯誤輸出都儲存到同一個檔案中    

指令 >> 檔案1 2>> 檔案2    把正确的輸出追加到檔案1,把錯誤的輸出追加到檔案2中

丢棄:指令 &>/dev/null

5.輸入重定向:指令<檔案

統計:wc [選項] [檔案名]

-c 統計位元組數

-w 統計單詞數

-l 統計行數

結束:ctrl+d

例:wc < a.log

6.多指令順序執行

多指令執行符    格式                作用

;                指令1 ; 指令2        多指令順序執行,之間沒有邏輯聯系

&&                指令1 && 指令2        邏輯與 當指令1正确執行,則指令2才會執行;當指令1執行不正确,指令2不會執行

||                指令1 || 指令2        邏輯或 當指令1執行不正确,則指令2才會執行;當指令1正确執行,則指令2不會執行

例:指令 && echo yes || echo no

7.管道符:

指令1的正确輸出作為指令2的操作對象:指令1 | 指令2

顯示包含關鍵字的行:grep [選項] '搜尋内容' 檔案名

-i 忽略大小寫

-n 輸出行号

-v 反向查找

--color=auto 搜尋出的關鍵字用顔色顯示

8.通配符

? 比對一個任意字元

* 比對0個或多個任意字元,也就是可以比對任何内容

[] 比對中括号任意一個字元。例如:[abc]代表一定比對一個字元

[-] 比對中括号任意一個字元,-代表範圍。例如:[a-z]代表比對一個小寫字母

[^]邏輯非,表示比對不是中括号内的一個字元。例如:[^0-9]代表比對一個不是數字的字元

(3)bash的變量

1.使用者自定義變量

範圍:在目前shell中生效

    設定變量:變量名=變量值(等号左右不可有空格)

    檢視變量:echo $變量名

    檢視所有變量:set

    删除變量:unset 變量名

注:$(指令) 可以執行指令

$(( 數值運算 )) 可以進行運算

2.環境變量:儲存和作業系統環境相關的資料

範圍:在目前shell和子shell中生效,若寫入配置檔案則所有shell生效

    申明變量:export 變量名=變量值

    查詢變量:env

常見環境變量:

PATH:系統查找指令路徑

例:PATH="$PATH":/root/sh 變量疊加

PS1:定義系統提示符

3.位置參數變量:向腳本傳遞參數,變量名不能自定義

位置參數變量          作 用

    $n            n為數字,$0代表指令本身,$1-${10}代表第1到第10個參數

    $*            代表指令行中所有的參數,$*把所有的參數看成一個整體

    $@            代表指令行中所有的參數,不過$@把每個參數區分對待

    $#            代表指令行中所有參數的個數

例:

num1=$1 #$1代表傳入的第一個參數 不可加分号

num2=$2 #$2代表傳入的第二個參數

sum=$(($num1 + $num2))

# 變量 sum 的和是 num1 加 num2

echo $sum

#執行 ./sum.sh 3 7

#得到 10

4.預定義變量:Bsah中已經定義好的變量

預定義變量          作 用

    $?            最後一次執行的指令的傳回狀态。如果這個變量的值為0,證明上一個指令正确執行;如果這個變量的值為非0(具體是哪個數,由指令自己來決定),則證明上一個指令執行不正确

    $$            目前程序的程序号(PID)

    $!            背景運作的最後一個程序的程序号(PID)

5.數值運算

聲明變量類型:declare [+/-][選項] 變量名

- 給變量設定類型屬性

+ 取消變量的類型屬性

-i 将變量聲明為整數型(integer)

-x 将變量聲明為環境變量

-p 顯示指定變量的被聲明的類型

    cc=$(($aa+$bb)) #常用

    cc=$[ $aa+$bb ]

    cc=$(expr $aa + $bb)#“ + ”号左右兩側必須有空格

    declare -i cc=$aa+$bb

6.運算符

優先級(越大越高)  運算符              說明

13                  -, +            單目負、單目正

12                  !, ~              邏輯非、按位取反或補碼

11                  * , / , %          乘、除、取模

10                  +, -              加、減

9                      << , >>          按位左移、按位右移

8                  < =, > =, < , >     小于或等于、大于或等于、小于、大于

7                      == , !=          等于、不等于

6                          &              按位與

5                          ^              按位異或

4                          |              按位或

3                          &&          邏輯與

2                          ||          邏輯或

1    =,+=,-=,*=,/=,%=,&=, ^=,|=, <<=, >>=    指派、運算且指派

#雖然乘和除的優先級高于加,但是通過小括号可以調整運算優先級

 aa=$(( (11+3)*3/2 ))

#14 不能被 3 整除,餘數是 2

 bb=$(( 14%3 ))

# 邏輯與運算隻有想與的兩邊都是 1 ,與的結果才是 1 ,否則與的結果是0

 cc=$(( 1 && 0 ))

7.變量測試與内容替換

通過y判斷x:

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

x=${y-新值}          x=新值              x為空                  x=$y

x=${y:-新值}          x=新值              x=新值              x=$y

x=${y+新值}          x為空                  x=新值              x=新值

x=${y:+新值}          x為空                  x為空                  x=新值

x=${y=新值}        x=新值,y=新值        x為空,y值不變        x=$y,y值不變

x=${y:=新值}    x=新值,y=新值        x=新值,y=新值        x=$y,y值不變

x=${y?新值} 新值輸出到标準錯誤輸出(螢幕) x為空                x=$y

x=${y:?新值} 新值輸出到标準錯誤輸出 新值輸出到标準錯誤輸出  x=$y

測試x=${y-新值}

# 删除變量 y

unset y

# 進行測試

x=${y-new}

# 因為變量 y 不存在,是以 x=new

echo $x

# 給變量 y 指派為空

y=""

# 給變量 y 指派

y=old

#old

(4)環境變量配置檔案(後面覆寫前面)

1.配置檔案即時生效:source 配置檔案  或  . 配置檔案

2.定義:環境變量配置檔案中主要是定義對系統的操作環境生效的系統預設環境變量,比如PATH、HISTSIZE、PS1、HOSTNAME等預設環境變量。

3.位置

全局生效:

    /etc/profile

    /etc/profile.d/*.sh

    /etc/bashrc

目前使用者生效:

    ~/.bash_profile

    ~/.bashrc

4.作用

/etc/profile的作用:

    USER變量:

    LOGNAME變量:

    MAIL變量:

    PATH變量:

    HOSTNAME變量:

    HISTSIZE變量:

    umask:

    調用/etc/profile.d/*.sh檔案

~/.bash_profile的作用:

    調用了~/.bashrc檔案。

    在PATH變量後面加入了“:$HOME/bin”這個目錄

~/.bashrc的作用:

    定義預設别名

    調用/etc/bashrc

/etc/bashrc的作用:

    PS1變量

    umask

    PATH變量

5.其他:

~/.bash_logout :登出時生效的環境變量配置檔案

~/bash_history :曆史指令

6.Shell登入資訊

本地終端歡迎資訊:vim /etc/issue

轉義符      作 用

\d      顯示目前系統日期

\s      顯示作業系統名稱

\l      顯示登入的終端号,這個比較常用。

\m      顯示硬體體系結構,如i386、i686等

\n      顯示主機名

\o      顯示域名

\r      顯示核心版本

\t      顯示目前系統時間

\u      顯示目前登入使用者的序列号

遠端終端歡迎資訊:vim /etc/issue.net

    轉義符在/etc/issue.net檔案中不能使用,是否顯示此歡迎資訊,由ssh的配置檔案/etc/ssh/sshd_config決定,加入“Banner/etc/issue.net”行才能顯示(記得重新開機SSH服務:service sshd restart)

登陸後歡迎資訊:/etc/motd

    不管是本地登入,還是遠端登入,都可以顯示此歡迎資訊

(5)正規表達式與通配符

正則:在檔案中比對符合條件的字元串,是包含比對。grep、awk、sed等可以支援。

通配符:比對符合條件的檔案名,是完全比對。ls、find、cp等可以支援

元字元      作 用

*          前一個字元比對0次或任意多次。

.          比對除了換行符外任意一個字元。

^          比對行首。例如:^hello會比對以hello開頭的行。

$          比對行尾。例如:hello&會比對以hello結尾的行。

[]        比對中括号中指定的任意一個字元,隻比對一個字元。

[^]        比對除中括号的字元以外的任意一個字元。例:[^0-9]

\          轉義符。用于取消講特殊符号的含義取消。

\{n\}    表示其前面的字元恰好出現n次。例:[0-9]\{4\} 比對4位數字

\{n,\}    其前面的字元出現不小于n次。例:[0-9]\{2,\} 兩位及以上

\{n,m\} 表示其前面的字元至少出現n次,最多出現m次。例如: [a-z]\{6,8\} 比對6到8位的小寫字母

(6)條件判斷

1、按照檔案類型進行判斷

測試選項        作 用

-b 檔案        判斷該檔案是否存在,并且是否為塊裝置檔案(是塊裝置檔案為真)

-c檔案        判斷該檔案是否存在,并且是否為字元裝置檔案(是字元裝置檔案為真)

-d 檔案        判斷該檔案是否存在,并且是否為目錄檔案(是目錄為真)

-e 檔案        判斷該檔案是否存在(存在為真)

-f 檔案        判斷該檔案是否存在,并且是否為普通檔案(是普通檔案為真)

-L 檔案        判斷該檔案是否存在,并且是否為符号連結檔案(是符号連結檔案為真)

-p 檔案        判斷該檔案是否存在,并且是否為管道檔案(是管道檔案為真)

-s 檔案        判斷該檔案是否存在,并且是否為非空(非空為真)

-S 檔案        判斷該檔案是否存在,并且是否為套接字檔案(是套接字檔案

為真)

兩種判斷格式(echo $?)

    test -e /root/install.log  

    [ -e /root/install.log ]

# 第一個判斷指令如果正确執行,則列印“ yes ”,否則打

印“ no ”

    [ -d /root ] && echo "yes" || echo "no"

2、按照檔案權限進行判斷

測試選項            作 用

-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        判斷整數1是否和整數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有一個成立,最終的結果就為真

!判斷            邏輯非,使原始的判斷式取反

(7)if語句

1、 單分支if條件語句

if [ 條件判斷式 ];then

    程式

fi

或者

if [ 條件判斷式 ]

then

注:

if語句使用fi結尾,和一般語言使用大括号結尾不同,後面必須有空格

[ 條件判斷式 ]就是使用test指令判斷,是以中括号和條件判斷式之間必須有空格

then後面跟符合條件之後執行的程式,可以放在[]之後,用“;”分割。也可以換行寫入,就不需要“;”了

2、雙分支if條件語句

    條件成立時,執行的程式

else

    條件不成立時,執行的另一個程式

3、 多分支if條件語句

if [ 條件判斷式1 ]

    當條件判斷式1成立時,執行程式1

elif [ 條件判斷式2 ]

    當條件判斷式2成立時,執行程式2

    當所有條件都不成立時,最後執行此程式

例:判斷apache是否啟動

# Author: shenchao (E-mail: [email protected]

port=$(nmap -sT 192.168.1.156 | grep tcp | grep http | awk '{print

$2}')

#使用nmap指令掃描伺服器,并截取apache服務的狀态,賦予變量port

if [ "$port" == "open" ]

echo “$(date) httpd is ok!” >> /tmp/autostart-acc.log

/etc/rc.d/init.d/httpd start &>/dev/null

echo "$(date) restart httpd !!" >> /tmp/autostart-err.log

(8)case語句

case $變量名 in

    "值1")

        如果變量的值等于值1,則執行程式1

    ;;

    "值2")

        如果變量的值等于值2,則執行程式2

    *)

        如果變量的值都不是以上的值,則執行此程式

esac

(9)for循環

for 變量 in 值1 值2 值3…

do

done

for (( 初始值;循環控制條件;變量變化 ))

(10)while循環:條件循環。隻要條件判斷式成立,循環就會一直繼續,直到條件判斷式不成立,循環才會停止。這就和for的固定循環不太一樣了。

while [ 條件判斷式 ]

(11)until循環:和while循環相反,until循環時隻要條件判斷式不成立則進行循環,并執行循環程式。一旦循環條件成立,則終止循環。

until [ 條件判斷式 ]

  • 作者:成九
  • 出處:https://luyucheng.cnblogs.com
  • 若無特别說明均為原創作品,如需轉載請注明原文連結

如果您覺得本文對您的學習有所幫助,可通過支付寶來打賞部落客,增加部落客的寫作動力

shell程式設計