1. 程式人生 > >6.3 bash編程 字符測試

6.3 bash編程 字符測試

bash編程 字符測試

給定一個用戶,判斷其UID和GID是否一樣 "^$USERNAME\>"(行首第一個單詞)

如果一樣,就顯示此用戶為"good guy";否則,就顯示此用戶為"bad guy"

#!/bin/bash

#

USERNAME =user1

if !grep "^$USERNAME\>" /etc/passwd &> /dev/null;then 用戶不存在

echo "No such user: $USERNAME."

exit 1

fi


USERID = `id -u $USERNAME`

GROUPID =`id -g $USERNAME`

if[ $USERID -eq $GROUPID ];then

echo "good guy"

else

echo "bad guy"

fi

exit: 退出腳本

exit #(#代表數字)


bash中常用的條件測試三種

-gt

-le

-ne

-ge

-lt

-eq 非0值都是假

--------------------只有上面才能用[],其他表達式中不能出現[]

INT1 = 63

INT2 = 77

[ $INT1 -eq $INT2 ]

[[ $INT1 -eq $INT2 ]]

TEST $INT1 -eq $INT2


if [ `grep "^$USENAME\>" /etc/passwd | cut -d: -f3` -eq 0 ];then 對

if [ `grep "^$USENAME\>" /etc/passwd ` -eq 0 ];then 錯(前面是一行)

測試方法

[ expression ] bash的命令

[[ expression ]] bash關鍵字

test expression


文件測試:

-e FILE:測試一個文件是否存在

-f FILE:測試文件是否為普通文件

-d FILE: 測試指定路徑是否為目錄的

-r FILE: 測試當前用戶對指定文件是否有讀取權限

-w

-x FILE


[ -e /etc/initttab ]

[ -x /etc/rc.d/rc.sysinit ]


練習:寫一個腳本

給定一個文件,比如/etc/inittab

判斷這個文件中是否有空白行

如果有,則顯示其空白行數,否則,顯示沒有空白行

#!/bin/bash

FILE = /etc/inittab

if [! -e $FILE ];then

echo "No $FILE."

exit 8

fi


if grep "^$" $FILE &> /dev/null;then

echo "Total blank lines: `grep "^$" $FILE | wc -l`."

else

echo "No blank line."

fi


圓整,丟棄小數點後的內容

expr命令一般用於整數值

#expr argument operator argument


練習:編寫一個腳本

給定一個用戶,獲取其密碼警告期限:

而後判斷用戶最近一次修改密碼時間距今天是否已經小於警告期限

提示:算術運算的方法$[$A-$B]:表示變量A的值減去變量B的值的結果

如果小於,則顯示"Warning":否則,就顯示"OK"

#!/bin/bash

#

W=`grep "student" /etc/shadow | cut -d: -f6`

S=`date +%s`

T=`expr $S/86400`

L=`grep "^student" /etc/shadow | cut -d: -f5`

N=`grep "^student" /etc/shadow | cut -d: -f3`

SY=$[$L-$[$T-$N]]


if [ $SY -lt $W ];then

echo ‘Worning‘

else

echo ‘OK‘

fi


練習:寫一個腳本

判讀命令歷史中歷史命令的總條目是否大於1000;如果大於,則顯示

"Some command will gone.";否則顯示"ok"

history 當前顯示緩沖區中的條數(會大於1000)

$HISTSIZE 都只顯示1000

$HISTFILESIZE 都只顯示1000

history | tail -l | cut -d‘ ‘ -f1 由於前面有一個空格,取不出條數,當取第二個字段

history | tail -l | cut -d‘ ‘ -f2

#!/bin/bash

#

COUNT = history | tail -l | cut -d‘ ‘ -f2

if $COUNT -gt 1000 ;then

echo "Some command will gone."

else

echo "ok"

fi


多分支的if語句

if 判斷條件1;then

statement1

...

elif 判斷條件2;then

statement2

...

elif 判斷條件3;then

statement3

...

else 判斷條件4;then

statement4

...

fi

#!/bin/bash

#

FILE =/etc/inittab


if [ -e $FILE ];then

echo "OK"

else

echo "No such file"

fi


測試腳本是否有語法錯誤

bash -n filetest.sh


bash -x 腳本:單步執行


給定一個文件,如果是一個普通文件,就顯示之

如果是一個目錄,亦顯示之

否則,此為無法識別之文件

filetest2.sh

#!/bin/bash

#

FILE = /etc/rc.d/rc.sysinit


if [ ! -e $FILE ];then

echo "NO such file"

exit 6

fi


if [ -f $FILE ];then

echo "Common file"

elif [ -d $FILE ];then

echo "Directory"

else

echo "Unkown."

fi


定義腳本退出狀態碼

如果腳本沒有明確定義退出狀態碼,那麽,最後執行的一條命令

的退出碼即為腳本的退出狀態碼


bash變量的類型:

本地變量(局部變量) 當前shell進程

環境變量 當前shell進程及其子進程


位置變量:$1 $2 ...

shift(踢掉一個位置值)默認踢1個

shift [n]踢掉n個

特殊變量 $?

$#:參數的個數

$*:參數列表

$@:參數列表


./filetest.sh /etc/fstab /etc/inittab

$1:/etc/fstab

$2:/etc/inittab


練習:寫一個腳本

能接受一個參數(文件路徑)

判定:此參數如果是一個存在的文件,就顯示OK ,否則顯示No such file

#!/bin/bash

#

echo $#

echo $*

echo $@

if[ $# -lt 1 ];then

echo "Usage: ./filetest3.sh ARG1 [ARG2 ...]"

if [ -e $1 ];then

echo "ok"

else

echo "No such file"

fi


練習:寫一個腳本

給腳本傳遞兩個參數(整數)

顯示此兩個參數之和,之乘積

#!/bin/bash

#

if [ $# -lt 2 ];then

echo "Usage: cac1.sh ARG1 ARG2"

exit

fi

echo "The sum is : $[$1 + $2]."

echo "The prod is : $[$1 * $2]."



sed -n 靜默

-i 直接修改原文件

-e SCRIPT -e SCRIPT:可以同時執行多個腳本

-f /PATH/TO/SED_SCRIPT

sed -f /path/to/scripts file

這個文件是腳本一行一個腳本運用在file上

-r :表示使用擴展正則表達式

刪除行首的空格

history | sed ‘s#^[[:space:]]*##g‘

history | sed ‘s#^[[:space:]]+##g‘

g:全局替換

i:忽略字符大小寫


s///:s###,s@@@

sed ‘s#l..e#&r#g‘ sed.txt

sed ‘s#\(l..e\)#\1r#g‘ sed.txt 後項引用


like - Like

love - Love

sed ‘s#l\(..e\)#L\1#g‘ sed.txt

&:引用模式匹配到的整個串


sed練習:

1 刪除/etc/grub.conf文件中行首的空白符

sed -r ‘s@^[[:space:]]+@@g‘ /etc/grub.conf


2 替換/etc/inittab文件中"id:3:initdefault:"一行

中的數字為5

sed ‘s@\(id:\)[0-9]\(:initdefault:\)@\15\[email protected] /etc/inittab


3 刪除/etc/inittab文件中的空白行

sed ‘/^$/d‘ /etc/inittab


4 刪除/etc/inittab文件中開頭的#號

sed ‘s@^#@@g‘ /etc/inittab


5 刪除/etc/inittab文件中開頭的#號及後面的空白字符,但要求

#號後面必須有空白字符

sed -r ‘s@^#[[:space:]]+@@g‘ /etc/inittab


6 刪除某文件中以空白字符後面跟#類的行中的開頭的

空白字符及#

sed -r ‘s@^[[:space:]]+@@g‘ /inittab

7 取出一個文件路徑的目錄名稱

echo "/etc/rc.d/" | sed -r ‘s@^(/.*/)[^/]+/?@\[email protected] 取etc

基名:

echo "/etc/rc.d/" | sed -r ‘s@^/.*/([^/]+)/?@\[email protected] 取rc.d


#abc

# hello world

# hi world


練習:

傳遞一個用戶名參數給腳本,判斷此用戶名跟其基本組的

組名是否一致,並將結果顯示出來

[ ]條件是

vi testUser.sh

#!/bin/bash

#

if !id $1 &>/dev/null;then

echo "No such user."

exit 8

fi


#if [ `id -n -u $1` == `id -n -g $1`];then

if [ $1 == `id -n -g $1`];then 用戶名本來就是一個字符串

echo "yiyang"

else

echo "buyiyang"

fi


字符測試:

== [ $A = $B ]

!= [ $A != $B ]

>

<

-n string:測試指定字符串是否為空,空真

-z string:測試指定字符串是否不空,不空真


練習:寫一個腳本

傳遞一個參數(單字符就行)給腳本,如果參數為q,就退出腳本;

否則,就顯示用戶的參數


練習:寫一個腳本

傳遞一個參數(單字符就行)給腳本,如果參數為q、Q、Quit,就退出腳本;

否則,就顯示用戶的參數

#!/bin/bash

#

if [ $1 = ‘q‘ ];then

echo "Quiting..."

exit 1

elif [ $1 = ‘Q‘ ];then

echo "Quiting..."

exit 2

elif [ $1 = ‘quit‘ ];then

echo "Quiting..."

exit 3

elif [ $1 = ‘Quit‘ ];then

echo "Quiting..."

exit 4

else

echo $1

fi


練習:

傳遞三個參數給腳本,第一個為整數;第二個為算術運算符,

第三個為整數,將計算結果顯示出來,要求保留兩位精度,

形如:

./calc.sh 5 /2


echo "scale=2;111/22;" | bc 答案5.02

bc <<< "scale=2;111/22;"


練習:

傳遞3個參數給腳本,參數均為用戶名,將此些用戶的賬號信息取

出來後放置於/tmp/testusers.txt文件中,並要求每一行行首

有行號

添加行號

echo "1 $LINE" >> /tmp/testusers

echo "2 $LINE" >> /tmp/testusers


練習:

判斷當前主機的CPU生產商,其信息在/proc/cpuinfo文件中vendor id

一行中,如果其生產商為AuthenticAMD,就顯示其為AMD公司;如果生

產商為GenuineIntel,就顯示其為Intel公司:否則,就說其為非主流

公司:


寫一個腳本:

給腳本傳遞三個參數,判斷其中的最大數和最小數,並顯示出來

MAX=0

-eq -lt




寫一個腳本:

1 設定變量FILE的值為/etc/passwd

2 依次向/etc/passwd中的每個用戶問好,並顯示對方的shell,形如:

Hello,root,your shell:/bin/bash

3 統計一共有多少用戶

LINES = `wc -l /etc/passwd | cut -d‘ ‘ -f1`

for I in `seq 1 $LINES`;do

echo "hello, `head -n $I /etc/passwd | tail -1 | cut -d: -f1`"

只向默認shell為bash的用戶問聲好


寫一個腳本:

1 添加10個用戶user1到user10,但要求只有用戶不存在的情況下才能

添加,密碼同用戶名


擴展:

接收一個參數

add:添加用戶user1..user10

del:刪除用戶user1..user10

其他,退出

adminusers --add user1,user2,user3,hello,hi


vim adminuser2.sh

#/bin/bash

#

#echo $1

#echo $1 | tr -d‘,‘刪除所有的逗號

#echo $1 |sed ‘s/,/ /g‘

for I in `echo $1 |sed ‘s/,/ /g‘`;do

if id $I &> /dev/null;then

echo "$I exist."

else

useradd $I

echo $I | passwd --stdin $I &> /dev/null

echo "add $I finished."

fi

done


vim adminuser3.sh

#/bin/bash

#

if [ $1 == ‘--add‘ ];then

for I in `echo $2 |sed ‘s/,/ /g‘`;do

if id $I &> /dev/null;then

echo "$I exist."

else

useradd $I

echo $I | passwd --stdin $I &> /dev/null

echo "add $I finished."

fi

done

elif [ $1 == ‘--del‘ ];then

for I in `echo $2 |sed ‘s/,/ /g‘`;do

if id $I &>/dev/null;then

userdel -r $I

echo "Delete $I finished."

else

echo "$I not exist."

fi

done

elif [ $1 == ‘--help‘ ]

echo "Usage:adminuser2.sh --add USER1,USER2,... | --del USER1,USER2,... --help"

else

echo "Unkown ARG"

exit 8

fi


在剩下的三個月裏,你願意與學習結為伴侶,無論貧窮還是富貴,

無論電腦還是手機,無論多困或者多累,無論想吃還是想睡,

都要把學習放在第一位,以不落後為目標,同甘共苦同舟共濟

永不言棄,愛惜她,尊重她,理解她,保護她,你願意這樣做嗎

vim adduser.sh

#!/bin/bash

#


for I in {1..10};do

if id user$I &>/dev/null;then

echo "user$I exist."

else

useradd user$I

echo user$I | passwd --stdin user$I &>/dev/null

echo "ADD user user$I finished"

fi

done


vim deluser.sh

#!/bin/bash

#


for I in {1..10};do

if id user$I &>/dev/null;then

userdel -r user$I

echo "Delete user$I finished."

else

echo "user$I not exist."

fi

done


vi adminnusers.sh

#/bin/bash

#

if [ $# -lt 1 ];then

echo "Usage:adminnusers ARG"

exit 7

fi


if [ $1 == ‘--add‘ ];then

for I in {1..10};do

if id user$I &> /dev/null

echo "user$I exist."

else

useradd user$I

echo user$I | passwd --stdin user$I &>/dev/null

echo "ADD user user$I finished"

fi

done

elif [ $1 == ‘--del‘ ];then

for I in {1..10};do

if id user$I &>/dev/null;then

userdel -r user$I

echo "Delete user$I finished."

else

echo "user$I not exist."

fi

done

else

echo "Unkown ARG"

exit 8

fi


循環:進入條件,退出條件

for

while

until

for 變量 in 列表;do

循環體

done

for i in 1 2 3 4 5;do

加法運算

done


遍歷完成之後,退出:


如何生成列表:

{1..100}

seq [起始數 [步進長度]] 結束數

`ls /etc`也能訪問每一個文件的列表

默認變量是字符串

declare -i SUM=0

integer

-x (環境變量)

1,...100

#/bin/bash

#

#let SUM = 0 此時變量是數字let

declare -i SUM=0


for I in {1..100};do

let SUM =$[$SUM+$I]

done


echo "The sum is $SUM."


寫一個腳本

計算100以內所有能被3整除的整數的和

取模,取余%


寫一個腳本:

計算100以內所有奇數和以及所有偶數的和:分別顯示之:


寫一個腳本,分別顯示當前系統上所有默認shell為bash的用戶和默認

shell為/bin/nologin的用戶,並統計各類shell下的用戶總數,顯示

結果形如:

BASH,3users,they are:

root,redhat,gentoo


NOLOGIN,2users,they are:

bin,ftp


6.3 bash編程 字符測試