1. 程式人生 > >Shell之條件測試及shell批量建立使用者指令碼

Shell之條件測試及shell批量建立使用者指令碼

文章目錄

條件表示式及邏輯表示式

//條件測試
1. 格式一:test 條件表示式
[[email protected]
~]# test -d /www ; echo $? 2. 格式二:[ 條件表示式 ] [[email protected] ~]# [ -d /www ];echo $? 3. 格式三:[[ 條件表示式 ]] [[email protected] ~]# [[ -d /www ]];echo $?

檔案及目錄判斷

// 常用選項
[ File1 –ef File2 ]   #兩個檔案是否為同一個檔案,可用於硬連線。主要判斷兩個檔案是否指向同一個inode。
[ File1 –nt File2 ]   #判斷檔案1是否比檔案2新
[ File1 –ot File2 ]   #判斷檔案1比是否檔案2舊
[ –d File ]  #是否是目錄
[ –r File ]  #檔案屬否存在並可讀
[ –w File ]  #檔案是否存在並可寫
[ –x File ]  #檔案屬否存在並可執行
[ –s File ]  #檔案是否是非空白檔案
[ –e File ]  #檔案或目錄是否存在 (常用)
[ –f File ]  #File是否為正規檔案 (常用)
[ –g File ]  #檔案是否是設定了組id
[ –G File ]  #檔案屬於的有效組ID
[ –h File ]  #檔案是否是一個符號連結(同-L)
[ –L File ]  #檔案是否是一個符號連結(同-h)
[ –k File ]  #檔案是否設定了Sticky bit位
[ –b File ]  #檔案存在並且是塊裝置檔案
[ –o File ]  #檔案的屬於有效使用者ID
[ –b file ]  #檔案是否塊裝置檔案
[ –c File ]  #檔案並且是字元裝置檔案

案例:備份資料庫中wordpress庫,每日凌晨開始,備份成功則郵件通知

// mysql_backup.sh
#!/bin/bash

#Input needs to backup the name of the database
read -p "Input mysqldump database name: " Data
/usr/bin/mysqldump -uroot -p123456 -B $Data > /backup/$(date +%F)_db.mysql


// 優化下
#!/bin/bash

User=root
Pass=123456
Database=wordpress
Backup_Dir=/backup
Date=$(date +%F)
Backup_Path=$Backup_Dir/$Date
Filename="$Database"_"$Date"_db.sql
Result_Log=$Backup_Path/backup_"$Database".log

test -d $Backup_Path || mkdir -p $Backup_Path
if [ $? -eq 0 ];then
        echo "$Backup_Path create successed !" > $Result_Log
        /usr/bin/mysqldump -uroot -p123456 -B $Database > $Backup_Path/$Filename
        if [ $? -eq 0  ];then
                echo "$Database Backup successed!" >> $Backup_Path/backup_"$Database".log
                mail -s "$Database Backup Result" 
[email protected]
< $Result_Log fi fi

數值比較

[ 1 -gt 10 ]        大於
[ 1 -lt 1o ]        小於
[ 1 -eq 10 ]        等於
[ 1 -ne 10 ]        不等於
[ 1 -ge 10 ]        大於等於
[ 1 -le 10 ]        小於等於

// C語言風格(())
[[email protected] ~]# ((10>2));echo $?
0
[[email protected] ~]# ((10<2));echo $?
1
[[email protected] ~]# ((10!=2));echo $?
0
[[email protected] ~]# 

案例:r磁碟根/使用率,超過80%發告警

// disk_space.sh

#!/bin/bash

Disk_Free=$(df -h | grep "/$" |awk '{print $5}'|awk -F '%' '{print $1}')

if [ $Disk_Free -ge 80 ];then
        echo "Disk space is use: $Disk_Free%"
fi

字串比較->批量建立使用者

字串比較要習慣給變數加""

[ –n 字串 ]  #字串的長度非零
[ –z 字串 ]   #字串的長度是否為零
[ 字串1=字串2 ]       #字串是否相等,若相等返回true
[ 字串1!=字串2 ]     #字串是否不等,若不等反悔false

//若字串變數不存在時容易引起語法錯誤,一般的用""引起來
[[email protected] ~]# [ "$USER" == "root" ];echo $?
0
[[email protected] ~]# [ "$USER" = "root" ];echo $?
0
[[email protected] ~]# [ "$USER" != "root" ];echo $?
1
[[email protected] ~]# echo ${#USER}        #檢視字串長度
4
[[email protected] ~]# 

//字串條件比較用[[]]才可以支援正則
//判斷字串是否是純數字
#!/usr/bn/bash
num1=111
num2=222t
num3=12yy6
num4='^[0-9]+$'

 [[ "$num1" =~ ^[0-9]+$ ]];echo "num1=$num1: $?"    
 [[ "$num2" =~ ^[0-9]+$ ]];echo "num2=$num2: $?"
 [[ "$num3" =~ ^[0-9]+$ ]];echo "num3=$num3: $?"
 [ "$num4" == ^[0-9]+$ ];echo "num4=$num4: $?"      #這裡單[]無法使用正則
 
[[email protected] scripts]# sh zhengze.sh 
num1=111: 0
num2=222t: 1
num3=12yy6: 1
num4=^[0-9]+$: 0
[[email protected] scripts]# 

案例:批量建立使用者batch_useradd.sh

#!/bin/bash
. /etc/init.d/functions

Path=/tmp/
UserDb=$Path/user.db
[ -d "$Path" ] || mkdir $Path
[ -f "$UserDb" ] || touch $UserDb

read -p "Number of input creation: " Num
if [[ ! "$Num" =~ ^[0-9]+$ ]];then
        echo "Error Number"
        exit
fi

read -p "Username prefix: " Prefix
if [ -z "$Prefix" ];then
        echo "Error prefix"
        exit
fi

i=1
while [ $i -le $Num ]
do
	
    	Passwd=`echo $RANDOM|md5sum|cut -c 2-9`
   	useradd $Prefix$i &>/dev/null && User_status=$?
   	if [ "$User_status" == "0" ];then    #這裡如果使用者已存在,則User_status就不會被定義,用-eq判斷會出現報錯,或者直接用$?,不給他宣告變數
    		echo "$Passwd"|passwd --stdin $Prefix$i &> /dev/null
		if [ $? -eq 0 ];then
      			action "adduser $Prefix$i" /bin/true
       			echo -e "Successed user:\t$Prefix$i pass:$Passwd" >>$UserDb
		else
			action "Error: Modify passwd $Prefix$i" /bin/false
			echo -e "Modify passwd Filed user:\t$Prefix$i pass:$Passwd" >>$UserDb
		fi
   	else
       		action "adduser $Prefix$i" /bin/false
   	fi
	let i++
done