日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux shell 脚本 if和else代码块都被执行 | shell 批量添加、删除用户(for循环做if嵌套)

發(fā)布時間:2024/1/18 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux shell 脚本 if和else代码块都被执行 | shell 批量添加、删除用户(for循环做if嵌套) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:

略懂編程的都知道,if else只能進(jìn)其一,滿足if條件就不會進(jìn)else,

然而在shell學(xué)習(xí)過程中,卻遇到了,滿足了if條件后,依然執(zhí)行了else中的代碼塊。?

本案例所有代碼均在:/root/myshell/for 目錄下進(jìn)行,案例中不再累述。

注:“批量刪除用戶”和問題無關(guān),屬于擴(kuò)展內(nèi)容。?

概述:問題的根源在用shell寫的不嚴(yán)謹(jǐn),另外shell解釋器本身也存在問題(應(yīng)該是個bug)

?一、準(zhǔn)備工作(切換目錄,并創(chuàng)建測試數(shù)據(jù))

? ? ? ? ? 1.創(chuàng)建測試用戶users.txt,并向其中寫入測試數(shù)據(jù)

? ? ? ? ? 注:t是一條特殊數(shù)據(jù)。

#cd /root/myshell/for #vim users.txt

t
centos
suse
huawei

二、批量添加用戶

1.編輯腳本

#vim adduser.sh !/bin/bash userList=$(cat /root/myshell/for/users.txt) for user in $userList douser_a=$(grep "$user" /etc/passwd | awk -F : '{print $1}' ) #不嚴(yán)謹(jǐn)?shù)膶懛?user_a=$(egrep "^\<$user\>" /etc/passwd | awk -F : '{print $1}' ) #嚴(yán)謹(jǐn)?shù)膶懛?user_a=$(getent passwd $user| awk -F : '{print $1}' ) #嚴(yán)謹(jǐn)?shù)膶懛╥f [[ $user_a == $user ]]then echo "user:$user is already exists"elseuseradd $userecho "123456" | passwd --stdin $userecho "user:$user has been add and passwd has been set" fi done

?2.測試腳本(問題所在,t用戶同時執(zhí)行了if和else中的代碼塊

#ls /home #sh adduser.sh #第一次批量添加(一切正常) #ls /home #sh adduser.sh #第二次批量添加,所有用戶都應(yīng)該被提示已存在的,偏偏就t用戶,一方面進(jìn)入了if被提示已存在,一方面又進(jìn)入了else執(zhí)行了else的代碼塊。

?

?3.問題解決(再次驗(yàn)證)

#user_a=$(grep "$user" /etc/passwd | awk -F : '{print $1}' ) #不嚴(yán)謹(jǐn)寫法(問題根源)#user_a=$(egrep "^\<$user\>" /etc/passwd | awk -F : '{print $1}' ) #嚴(yán)謹(jǐn)寫法user_a=$(getent passwd $user| awk -F : '{print $1}' ) #嚴(yán)謹(jǐn)寫法

經(jīng)過一番求助,百度未果,在Q群好友的協(xié)助下,問題得以解決,再次驗(yàn)證。一切正常。

?具體步驟:把上面三行代碼中的第一行注釋掉,下面兩行都是嚴(yán)謹(jǐn)寫法,任選其一即可。? ?


4.問題分析

1、首先,略懂編程的都知道,if和else不會同時進(jìn)入,執(zhí)行里面的代碼的,至少java語言不會遇到這種情況。

但是,shell腳本同一個命令,確實(shí)可以同時被if和else里面的代碼塊執(zhí)行,本案例就是個奇葩的證明。

定論:這足以說明,/bin/bash的shell解釋器是不走尋常路,能同時執(zhí)行if和else里的代碼,應(yīng)該是個bug。

2、遇到問題,還是要想辦法解決的。和度娘一番探討后,英雄磨鞋底,未果,求助QQ群好友,最終得以解決。具體分析一下這兩行嚴(yán)謹(jǐn)?shù)拇a:

#user_a=$(grep "$user" /etc/passwd | awk -F : '{print $1}' ) #不嚴(yán)謹(jǐn)寫法(問題根源)

#user_a=$(egrep "^\<$user\>" /etc/passwd | awk -F : '{print $1}' ) #嚴(yán)謹(jǐn)寫法(正則過濾)

user_a=$(getent passwd $user| awk -F : '{print $1}' ) #嚴(yán)謹(jǐn)寫法

第一行:之所以會被同時進(jìn)入if和else,是應(yīng)該在進(jìn)行for循環(huán)的時候,t用戶通過grep查找,被匹配到了,不嚴(yán)謹(jǐn)之處是,grep并不是精準(zhǔn)匹配,所以會匹配到含有t字母的用戶。所以會進(jìn)入if代碼塊,被提示t用戶已存在。

然而,t用戶依然滿足else,因?yàn)檎驹趃rep不是精準(zhǔn)匹配這個角度考慮,tom這個用戶也可能會被過濾出來。

也就是if語句的條件判斷,最終由兩個形態(tài):

?if [[ $user_a == $user ]]

if tom ==t? ? #站在這個角度,返回結(jié)果自然是false,自然會進(jìn)入else

if t == t? ? ? ?#站在這個角度,返回結(jié)果自然是true,自然會進(jìn)入if

奇葩之處就在這里了。

3、后兩行嚴(yán)謹(jǐn)?shù)膶懛?#xff0c;都是精準(zhǔn)查找,第二行是通過正則表達(dá)式完全匹配,第三者也是完全匹配。所以,不會出現(xiàn)查找過濾出tom,出現(xiàn)?if tom==t 返回false的情況,只會查找到 if t==t返回true。

注:上圖之所以看到grep "t" 過濾出的用戶名中不包含t,依然被過濾了出來,是因?yàn)樵撚脩羲跀?shù)據(jù)的行中出現(xiàn)了t,因?yàn)楣艿肋^濾有先后的問題,調(diào)換一下管道過濾順序,就一目了然了。

三、批量刪除用戶(簡略版

注:由于腳本比較簡單,作為擴(kuò)展內(nèi)容,不再過多累述。

????????1.編輯腳本

#vim deluser.sh #!/bin/bash delList=$(cat /root/myshell/for/users.txt) for user in $delList douserdel -r $user >> /dev/null if [ $? -eq 0 ] then echo "user :$user has been deleted"elseecho "user :$user may be not exists,delete fail"fi done

????????2.驗(yàn)證腳本

#ls /home 查看home目錄下,剛才新建的用戶跟目錄 #cat /etc/passwd | tail -5 也可以查看 #sh deluser.sh 執(zhí)行批量刪除命令 #ls /home 再次查看home目錄

?批量刪除的過程,很順利。

四、批量刪除用戶(for循環(huán)嵌套if

設(shè)計(jì)思路:

刪除前,先判斷被刪除用戶是否存在。然后再根據(jù)是否刪除成功,給予不同的提示。
注:刪除前需要在users.txt中特意添加一個不存在的用戶tom,便于看測試效果。

1.編輯腳本

#vim del.sh

?#!/bin/bash
delList=$(cat /root/myshell/for/users.txt)
for user in $delList
? do ?
? user_a=$(getent passwd $user | awk -F : '{print $1}')
? if [ "$user_a" != ?"$user" ]
? ? then?
? ? ? ?echo "user:$user isn't exit"
? else
? ? ?userdel -r $user >> /dev/null
? ? ?if [ $? -eq 0 ]?
? ? ?then "user:$user has been delete succfully!"
? ? ?else
? ? ? echo "user:$user fail to be delete "
? ? ?fi ?
? fi ?
done

?

?2.腳本驗(yàn)證

#sh del.sh

后記:

在此,再次感謝“Linux運(yùn)維交流與招聘(859407315)”群的“需謹(jǐn)慎幾十年(1827617524)?”的耐心指導(dǎo)。?

總結(jié)

以上是生活随笔為你收集整理的linux shell 脚本 if和else代码块都被执行 | shell 批量添加、删除用户(for循环做if嵌套)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。