shell編程下 特殊變量、test / [ ]判斷、循環、腳本排錯

第1章 shell中的特殊變量

1.1 $#

$# 表示參數的個數linux

1.1.1 示例】腳本內容

[root@znix ~]# cat /server/scripts/show2.shshell

#!/bin/bash編程

echo $1 $2 $#vim

if [ $? == 0 ];then數組

   echo "OK"bash

filess

實例1-1 執行的不一樣結果ssh

[root@znix ~]# sh  /server/scripts/show2.sh  1 2 3 4 6 測試

1 2 5優化

[root@znix ~]# sh  /server/scripts/show2.sh  aa bb

aa bb 2

[root@znix ~]# sh  /server/scripts/show2.sh  aa bb cc

aa bb 3

1.2 $?

$?表示:上一個命令執行後的狀態

狀態0 表示執行正確

狀態0 表示執行錯誤

1.2.1 示例$?的使用

[root@znix ~]# aaa

-bash: aaa: command not found

[root@znix ~]# echo $?

127

[root@znix ~]# sed

Usage: sed [OPTION]... 

[root@znix ~]# echo $?

4

[root@znix ~]# sh  /server/scripts/show2.sh  aa bb

aa bb 2

[root@znix ~]# echo $?

0

1.3 【瞭解】編譯安裝的過程

切菜備菜  ./configure

炒菜      make

上菜      make install

1.4 如何向變量中存放內容---read命令

1.4.1 read命令使用

[root@znix ~]# read a

慘綠少年

[root@znix ~]# echo $a

慘綠少年

1.4.2 讓執行命令後出現提示信息

-p 爲顯示提示信息。p做爲輸出必定要寫在其餘參數的最後面

[root@znix ~]# read -p "請輸入:" a

請輸入:呵呵                              

[root@znix ~]# echo $a

呵呵

1.4.3 設置等待(超時)的時間

-t5  等待5

[root@znix ~]# read -t5 -p "請輸入密碼:" a

請輸入密碼:

[root@znix ~]#

[root@znix ~]# read -t5 -p "請輸入密碼:" a

請輸入密碼:123

1.4.4 不顯示輸入的內容

-s  輸入的時候不顯示輸入內容。

[root@znix ~]# read -s -t50 -p "請輸入密碼:" a

請輸入密碼:

[root@znix ~]# echo $a

admin

1.5 read命令運用到腳本上

1.5.1 修改計算器腳本的內容,讓他可以更智能。

[root@znix ~]# vim  /server/scripts/cal.sh

#!/bin/bash

 

read -p "input 1st num:" a

read -p "input 2st num:" b

 

 

1.5.2 測試腳本

[root@znix ~]# sh  /server/scripts/cal.sh

input 1st num:1

input 2st num:2

0.5

3

-1

2

1.5.3 簡化命令

1.5.3.1 read 能夠同時讀入多個字符。

[root@znix ~]# read -p "輸入第一個 第二關數字:" a b

輸入第一個 第二關數字:123 456  

[root@znix ~]# echo $a $b

123 456

1.5.3.2 修改腳本的內容。

使用一條read命令,讀取兩個參數。

[root@znix ~]# vim /server/scripts/cal.sh

#!/bin/bash

 

read -p "input 1st&2st num:" a b

 

awk -vnum1=$a -vnum2=$b 'BEGIN{print num1/num2}'

awk -vnum1=$a -vnum2=$b 'BEGIN{print num1+num2}'

awk -vnum1=$a -vnum2=$b 'BEGIN{print num1-num2}'

awk -vnum1=$a -vnum2=$b 'BEGIN{print num1*num2}'

"/server/scripts/cal.sh" 15L, 355C written 

1.5.3.3 測試腳本。

注意 同時傳入兩個參數的時候,參數之間要使用空格分割.

[root@znix ~]# sh /server/scripts/cal.sh

input 1st&2st num:1 2

0.5

3

-1

2

第2章 判斷一個 文件/目錄 是否存在

2.1 幾種思路:

cat + $?'

ls  + $?

       test命令

2.2 test命令實例

test命令不會本身輸出執行的結果,配合$?查詢上一條命令是否執行成功,就可以判斷是否存在這個文件或目錄.

2.2.1 判斷一個文件是否存在

-f 爲判斷的對象是文件,0爲存在,1爲不存在

[root@znix ~]# test -f /clsn/clsn.txt

[root@znix ~]# echo $?

0

[root@znix ~]# test -f /clsn/clsn

[root@znix ~]# echo $?

1

2.2.2 判斷一個目錄是否存在

-d 爲對目錄進行判斷,0爲存在,1爲不存在.

[root@znix ~]# test -d /znix

[root@znix ~]# echo $?

1

[root@znix ~]# test `-d /clsn/

[root@znix ~]# echo $?

0

2.3 使用 [  ] 進行判斷

使用[  ]的時候注意中間的空格,兩邊都要有兩個空格

[  ]test命令的功能類似,能夠進行判斷,相比test命令更爲便捷

2.3.1 [  ]判斷一個文件是否存在

test命令同樣 [  ] 判斷的結果也0爲存在,1爲不存在

[root@znix ~]# [ -f /zinx.txt ]

[root@znix ~]# echo $?

1

[root@znix ~]# [ -f /root/clsn.txt ]

[root@znix ~]# echo $?

0

2.3.2 判斷成功後,執行下一個命令 &&

判斷文件/目錄是否存在,判斷成功執行後面的內容,輸出ok ;判斷失敗,不執行後面的命令.

[root@znix ~]# [ -f /clsn/znix.txt ] && echo "ok"

[root@znix ~]# [ -d /clsn ] && echo "ok"

ok

2.3.3 判斷不成功後執行下一條命令 ||

若是這個文件不存在,就建立 (使用 || , || 表示前面的執行錯誤了,執行後面的命令.

[root@znix ~]# [ -f /clsn/znix.txt ] || touch /clsn/znix.txt

[root@znix ~]# ls -l /clsn/znix.txt

-rw-r--r-- 1 root root 0 Sep 20 10:31 /clsn/znix.txt

2.3.3.1 [示例1]若是/root/clsndir 目錄不存在就建立     

[root@znix ~]# [ -d /root/clsndir ] || mkdir -p /root/clsndir

[root@znix ~]# ls -ld /root/clsndir

drwxr-xr-x 2 root root 4096 Sep 20 10:36 /root/clsndir

2.3.3.2 [示例2]若是/root/clsndir 目錄不存在,就建立這個目錄  

使用 && ,前面的執行成功,執行後面的; ! 表示非,不存在.

[root@znix ~]# [ ! -d /root/clsndir/1 ] && mkdir  -p /root/clsndir/1

[root@znix ~]# ll -d /root/clsndir/1

drwxr-xr-x 2 root root 4096 Sep 20 10:41 /root/clsndir/1

第3章 判斷在腳本的使用

3.1.1 中文示例(更好理解)

若是 [ 這個文件存在 ];而後

           提示文件存在

不然

           建立這個文件

果如

3.2 [示例]判斷文件是否存在,不存在就建立

3.2.1 第一步 按照格式書寫判斷語句

if [ -f /root/clsn.txt ];then

    echo "文件存在"

else

    touch /root/clsn.txt

fi

3.3 第二步 寫入腳本:

寫入腳本的時候,注意腳本的基本格式.

[root@znix ~]# vim /server/scripts/if.sh

#!/bin/bash

 

if [ -f /root/clsn.txt ];then

    echo "文件存在"

else

    touch /root/clsn.txt

fi

3.3.1 第三步 測試腳本

[root@znix ~]# sh  /server/scripts/if.sh

文件存在

3.4 在腳本中進行判斷的格式

符號

參數

含義

英文

-gt

大於  

great than

>=

-ge

大於等於

great equal

-lt

小於

less than

<=

-le

小於等於

less than or equal

==

-eq

等於  

equal     

!=

-ne / ! -eq

不等於

not equal 

3.5 [實例]若是cal2.sh腳本的參數個數不等於2,就顯示 "命令錯誤"

3.5.1 書寫腳本

!=  表示判斷兩個是否不相等,若是不想等就顯示命令錯誤

#/bin/bash

if [ $# !=  2 ];then

    echo "命令錯誤"

fi

3.5.2 對腳本進行測試.

當參數的個數爲2的時候,不會輸出,個數不爲二的時候輸出 命令錯誤

[root@znix ~]# sh /server/scripts/cal2.sh

命令錯誤

[root@znix ~]# sh /server/scripts/cal2.sh 1 2

[root@znix ~]# sh /server/scripts/cal2.sh 1 2 3

命令錯誤

 

3.6 修改以前的計算器,進行兩個數字的加減乘除,在計算器前面加上參數個數判斷。當輸入的參數是2個的時候執行計算,不爲2的時候顯示參數錯誤.

3.6.1 書寫腳本

當輸入的參數不爲2的時候 執行 echo "Usage: NUM1 NUM2", 而後執行 exit..

exit 表示前面的執行完成後就結束(跳出),不會再執行腳本後面的內容.

[root@znix ~]# vim  /server/scripts/cal2.sh   

#/bin/bash

if [ $# -ne 2 ];then

    echo "Usage: NUM1 NUM2"

    exit

fi

 

a=$1

b=$2

 

awk -vh=$a -vz=$b 'BEGIN{print h/z}'

awk -vh=$a -vz=$b 'BEGIN{print h+z}'

awk -vh=$a -vz=$b 'BEGIN{print h-z}'

awk -vh=$a -vz=$b 'BEGIN{print h*z}'

3.6.2 測試腳本

當輸入的參數個數不爲2的時候執行echo 命令

當輸入的參數個數爲2的時候進行計算

[root@znix ~]# sh   /server/scripts/cal2.sh

Usage: NUM1 NUM2   ##提示信息

[root@znix ~]# sh   /server/scripts/cal2.sh 22 22

1

44

0

484

第4章 循環語句

4.1 [示例]修改系統時間爲2017050120170520,而後建立文件的名字爲2017-05-01.txt

4.1.1 基礎姿式

4.1.1.1 for循環能夠從後面的數組中讀取內容進行操做

循環的格式     

for hd in  znix_{a..z}

do

    echo $hd

done

4.1.1.2 執行for 循環語句

[root@znix ~]# for hd in  znix_{a..z}

> do

>     echo $hd

> done

znix_a

znix_b

znix_c

znix_d

……

znix_z

4.1.2 書寫循環語句

do裏面能夠兩條命令同時執行.

for hd in {01..20}

do

    date -s "201705$hd"

    touch /tmp/date/$(date +%F).txt

done

4.1.3 測試循環語句

[root@znix ~]# for hd in {01..20}

> do

>     date -s "201705$hd"

>     touch /tmp/date/$(date +%F).txt

> done

Mon May  1 00:00:00 CST 2017

Tue May  2 00:00:00 CST 2017

Wed May  3 00:00:00 CST 2017

……

Sat May 20 00:00:00 CST 2017

4.1.4 檢查執行結果

[root@znix ~]# ls /tmp/date/

2017-05-01.txt  2017-05-05.txt  2017-05-09.txt  2017-05-13.txt  2017-05-17.txt

2017-05-02.txt  2017-05-06.txt  2017-05-10.txt  2017-05-14.txt  2017-05-18.txt

2017-05-03.txt  2017-05-07.txt  2017-05-11.txt  2017-05-15.txt  2017-05-19.txt

2017-05-04.txt  2017-05-08.txt  2017-05-12.txt  2017-05-16.txt  2017-05-20.txt

4.2 [實例]優化linux開機啓動項目-for循環方法

4.2.1 第一步:肯定目標

for name in 要關閉的服務的名字

do

    chkconfig $name off

done

4.2.2 第二步:取出要關閉服務的名字

[root@znix ~]# chkconfig |egrep -v "sshd|network|crond|rsyslog|sysstat"|awk '{print $1}'

abrt-ccpp

abrtd

acpid

……

4.2.3 第三步 把名字與for循環結合

for name in `chkconfig |egrep -v "sshd|network|crond|rsyslog|sysstat"|awk '{print $1}'`

do

    chkconfig $name off

done

第5章 腳本執行排錯

5.1 sh -x 顯示腳本詳細的執行過程

    前面有 +     表示執行過的命令的

    前面沒有東西,表示輸出到屏幕上的內容。

[root@znix ~]# sh -x /server/scripts/cal2.sh

+ '[' 0 -ne 2 ']'

+ echo 'Usage: NUM1 NUM2'

Usage: NUM1 NUM2

+ exit

5.1.1 檢查腳本運行中的錯誤

[root@znix ~]# sh -x /server/scripts/cal2.sh  10 20

+ '[' 2 -ne 2 ']'

+ a=10

+ b=20

+ awk -vh=10 -vz=20 'BEGIN{print h/z}'

0.5

+ awk -vh=10 -vz=20 'BEGIN{print h+z}'

30

+ awk -vh=10 -vz=20 'BEGIN{print h-z}'

-10

+ awk -vh=10 -vz=20 'BEGIN{print h*z}'

200

第6章 vim 快捷鍵

ctrl + v    d批量刪除

ctrl + v    x批量刪除

dd        刪除光標所在行

dG       刪除光標所在行到最後一行

D        光標所在位置到行尾的內容

x         刪除光標所在位置的一個字符

第7章 昨日回顧

7.1 sed命令】刪除文件中的空行或只有空格的行。

7.1.1 文件內容

[root@znix ~]# cat -A test.txt

znix$

    $

linux$

$

good$

  $

n$

7.1.2 * 表示前一個字符出現了0次或以上

0次的時候即爲^$ 表示空行,以上表示空格的行

[root@znix ~]# sed '/^ *$/d' test.txt

znix

linux

good

n

7.1.3 +表示連續出現至少一次

[root@znix ~]# sed -r '/^ +$|^$/d' test.txt

znix

linux

good

n

7.1.4 !表示取反

[root@znix ~]# sed -n '/^ *$/!p' test.txt

znix

linux

good

n

7.1.5 一樣用來取反

[root@znix ~]# sed -nr '/^$|^ +$/!p' test.txt

znix

linux

good

n

7.2 shell編程中的變量

7.2.1 特殊變量(shell腳本中)

$1,$2...    用來傳遞參數

$0        腳本文件的文件名

       $#        腳本中參數的個數

       $?        前一條命令是否執行成功

7.2.2 全局變量(環境變量)

經常使用的 LANG   PATH  PS1 ……

7.2.3 普通變量

本身定義的變量

7.3 shell編程中與用戶有關的環境變量的文件和目錄

/etc/profile

/etc/profile.d    (目錄)

/etc/bashrc

~/.bashrc

~/.bash_profile

相關文章
相關標籤/搜索