給定一個使用者,判斷其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"
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
判斷這個檔案中是否有空白行
如果有,則顯示其空白行數,否則,顯示沒有空白行
FILE = /etc/inittab
if [! -e $FILE ];then
echo "No $FILE."
exit 8
if grep "^$" $FILE &> /dev/null;then
echo "Total blank lines: `grep "^$" $FILE | wc -l`."
else
echo "No blank line."
圓整,丢棄小數點後的内容
expr指令一般用于整數值
#expr argument operator argument
練習:編寫一個腳本
給定一個使用者,擷取其密碼警告期限:
而後判斷使用者最近一次修改密碼時間距今天是否已經小于警告期限
提示:算術運算的方法$[$A-$B]:表示變量A的值減去變量B的值的結果
如果小于,則顯示"Warning":否則,就顯示"OK"
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'
echo 'OK'
判讀指令曆史中曆史指令的總條目是否大于1000;如果大于,則顯示
"Some command will gone.";否則顯示"ok"
history 目前顯示緩沖區中的條數(會大于1000)
$HISTSIZE 都隻顯示1000
$HISTFILESIZE 都隻顯示1000
history | tail -l | cut -d' ' -f1 由于前面有一個空格,取不出條數,當取第二個字段
history | tail -l | cut -d' ' -f2
COUNT = history | tail -l | cut -d' ' -f2
if $COUNT -gt 1000 ;then
echo "Some command will gone."
echo "ok"
多分支的if語句
if 判斷條件1;then
statement1
...
elif 判斷條件2;then
statement2
elif 判斷條件3;then
statement3
else 判斷條件4;then
statement4
FILE =/etc/inittab
if [ -e $FILE ];then
echo "OK"
echo "No such file"
測試腳本是否有文法錯誤
bash -n filetest.sh
bash -x 腳本:單步執行
給定一個檔案,如果是一個普通檔案,就顯示之
如果是一個目錄,亦顯示之
否則,此為無法識别之檔案
filetest2.sh
FILE = /etc/rc.d/rc.sysinit
if [ ! -e $FILE ];then
echo "NO such file"
exit 6
if [ -f $FILE ];then
echo "Common file"
elif [ -d $FILE ];then
echo "Directory"
echo "Unkown."
定義腳本退出狀态碼
如果腳本沒有明确定義退出狀态碼,那麼,最後執行的一條指令
的退出碼即為腳本的退出狀态碼
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
echo $#
echo $*
echo $@
if[ $# -lt 1 ];then
echo "Usage: ./filetest3.sh ARG1 [ARG2 ...]"
if [ -e $1 ];then
給腳本傳遞兩個參數(整數)
顯示此兩個參數之和,之乘積
if [ $# -lt 2 ];then
echo "Usage: cac1.sh ARG1 ARG2"
exit
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\2@g' /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@^(/.*/)[^/]+/?@\1@g' 取etc
基名:
echo "/etc/rc.d/" | sed -r 's@^/.*/([^/]+)/?@\1@g' 取rc.d
#abc
# hello world
# hi world
練習:
傳遞一個使用者名參數給腳本,判斷此使用者名跟其基本組的
組名是否一緻,并将結果顯示出來
[ ]條件是
vi testUser.sh
if !id $1 &>/dev/null;then
echo "No such user."
#if [ `id -n -u $1` == `id -n -g $1`];then
if [ $1 == `id -n -g $1`];then 使用者名本來就是一個字元串
echo "yiyang"
echo "buyiyang"
字元測試:
== [ $A = $B ]
!= [ $A != $B ]
>
<
-n string:測試指定字元串是否為空,空真
-z string:測試指定字元串是否不空,不空真
傳遞一個參數(單字元就行)給腳本,如果參數為q,就退出腳本;
否則,就顯示使用者的參數
傳遞一個參數(單字元就行)給腳本,如果參數為q、Q、Quit,就退出腳本;
if [ $1 = 'q' ];then
echo "Quiting..."
elif [ $1 = 'Q' ];then
exit 2
elif [ $1 = 'quit' ];then
exit 3
elif [ $1 = 'Quit' ];then
exit 4
echo $1
傳遞三個參數給腳本,第一個為整數;第二個為算術運算符,
第三個為整數,将計算結果顯示出來,要求保留兩位精度,
形如:
./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
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
if id $I &>/dev/null;then
userdel -r $I
echo "Delete $I finished."
else
echo "$I not exist."
elif [ $1 == '--help' ]
echo "Usage:adminuser2.sh --add USER1,USER2,... | --del USER1,USER2,... --help"
echo "Unkown ARG"
在剩下的三個月裡,你願意與學習結為伴侶,無論貧窮還是富貴,
無論電腦還是手機,無論多困或者多累,無論想吃還是想睡,
都要把學習放在第一位,以不落後為目标,同甘共苦同舟共濟
永不言棄,愛惜她,尊重她,了解她,保護她,你願意這樣做嗎
vim adduser.sh
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"
vim deluser.sh
userdel -r user$I
echo "Delete user$I finished."
echo "user$I not exist."
vi adminnusers.sh
if [ $# -lt 1 ];then
echo "Usage:adminnusers ARG"
exit 7
for I in {1..10};do
if id user$I &> /dev/null
echo "user$I exist."
echo "ADD user user$I finished"
if id user$I &>/dev/null;then
userdel -r user$I
echo "Delete user$I finished."
echo "user$I not exist."
循環:進入條件,退出條件
for
while
until
for 變量 in 清單;do
循環體
for i in 1 2 3 4 5;do
加法運算
周遊完成之後,退出:
如何生成清單:
{1..100}
seq [起始數 [步進長度]] 結束數
`ls /etc`也能通路每一個檔案的清單
預設變量是字元串
declare -i SUM=0
integer
-x (環境變量)
1,...100
#let SUM = 0 此時變量是數字let
for I in {1..100};do
let SUM =$[$SUM+$I]
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
本文轉自飛行萌51CTO部落格,原文連結:http://blog.51cto.com/8527508/1941827 ,如需轉載請自行聯系原作者