我正在嘗試遍歷 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 與其他語言混淆了。任何幫助,將不勝感激。謝謝!
uj5u.com熱心網友回復:
我會考慮做這樣的事情:
#!/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
這樣做的主要目的是使用grep@Jetchisel 提出的命令和行程替換( <()) 來準備ADMIN_USERS變數中但不在變數中的管理員用戶串列NEW_ADMIN_USERS,然后迭代該變數。
這在很多方面都與您的方法不同:
- 設定的
errexit和nounset這將導致腳本出口上從命令的任何錯誤代碼,包括使用未設定變數的選項(set -eu) - 決議( )的輸出時使用
field引數cutwith 分隔符設定為空格dsclcut -d ' ' -f 2- - 隨后將用戶串列分成帶有
tr(tr ' ' '\n') 的行 - 將串列傳遞給
for適當的(使用(是語法錯誤,因為我懷疑使用!將是) dseditgroup直接評估回傳碼,因為這if是測驗- 洗掉
fi第一個if命令的尾隨,因為當您擁有時不需要它else(并且由于明顯的浮動會導致語法錯誤else)
請徹底測驗,最好使用虛擬命令,而不是dseditgroup在您 100% 滿意它按預期作業之前,并考慮在開發時設定xtrace選項(set -x它將在執行時回顯所有命令)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/356292.html
上一篇:檢查hsqldb行程是否失敗
下一篇:根據用戶輸入重復bash腳本
