[英]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
變量中,然后迭代該變量。
這在很多方面都與您的方法不同:
errexit
和nounset
選項,這將導致腳本在命令中出現任何錯誤代碼時退出,包括使用未設置的變量( set -eu
)dscl
的輸出時使用cut
的field
參數,分隔符設置為空格( 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.