Shell之條件測試及shell批量建立使用者指令碼
阿新 • • 發佈:2018-11-01
文章目錄
條件表示式及邏輯表示式
//條件測試
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