簡體   English   中英

用於循環的 shell 腳本中的多個條件

[英]Multiple conditions in a shell script for loop

我正在嘗試遍歷 macOS 上的 2 個組,並刪除 admin 組中的用戶,如果他們不存在於另一個組中。

newadmins=$(dscl . -read Groups/newadmin GroupMembership | cut -c 18-)
adminUsers=$(dscl . -read Groups/admin GroupMembership | cut -c 18-)

for (user in $adminUsers && ! user in $newadmins)
do
        dseditgroup -o edit -d $user -t user admin
        if [ $? = 0 ]; then echo "Removed user $user from admin group"; fi
    else
        echo "Admin user $user left alone"
    fi
done

以上沒有奏效。 我想我將 shell 與其他語言混淆了。 任何幫助,將不勝感激。 謝謝!

我會考慮做這樣的事情:

#!/usr/bin/env bash

set -eu

NEW_ADMIN_USERS=$(dscl . -read Groups/newadmin GroupMembership | cut -d ' ' -f 2-)
ADMIN_USERS=$(dscl . -read Groups/admin GroupMembership | cut -d ' ' -f 2-)

DEFUNCT_ADMIN_USERS=$(grep -vxFf <(echo ${NEW_ADMIN_USERS} | tr ' ' '\n') <(echo ${ADMIN_USERS} | tr ' ' '\n'))

for DEFUNCT_ADMIN_USER in ${DEFUNCT_ADMIN_USERS}
do
  if dseditgroup -o edit -d ${DEFUNCT_ADMIN_USER} -t user admin
  then
    echo "Removed user ${DEFUNCT_ADMIN_USER} from admin group"
  else
    echo "Admin user ${DEFUNCT_ADMIN_USER} left alone"
  fi  
done

其主要推動力是使用@Jetchisel 提出的grep命令和進程替換( <() ) 在ADMIN_USERS變量中准備一個管理員用戶列表,但不在NEW_ADMIN_USERS變量中,然后迭代該變量。

這在很多方面都與您的方法不同:

  • 設置errexitnounset選項,這將導致腳本在命令中出現任何錯誤代碼時退出,包括使用未設置的變量( set -eu
  • 在解析dscl的輸出時使用cutfield參數,分隔符設置為空格( cut -d ' ' -f 2-
  • 隨后將用戶列表分成帶有tr ( tr ' ' '\\n' ) 的行
  • 適當地將列表傳遞給for (使用(是語法錯誤,因為我懷疑使用!將是)
  • 直接評估dseditgroup的返回碼,因為這就是if測試的結果
  • 刪除第一個if命令的尾隨fi ,因為當你有else時不需要它(並且由於明顯的浮動else會導致語法錯誤)

請徹底測試,最好使用虛擬命令而不是dseditgroup然后您才能 100% 滿意它按預期工作,並考慮在開發時設置xtrace選項( set -x將在執行時回顯所有命令)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM