我在寫 shell script 的作業
有一個 JSON 檔如下:
[
{
"username": "admin_cat",
"password": "cat001",
"shell": "/bin/sh",
"groups": ["wheel", "operator"]
},
{
"username": "meow_2",
"password": "cat002",
"shell": "/bin/tcsh",
"groups": []
},
{
"username":"meow_3",
"password":"cat003",
"shell":"/bin/csh",
"groups": ["wheel", "operator"]
}
]
然後這邊是我的 shell script 片段:
username=$(cat $file | jq '.[] | .username' | tr -d '"')
password=`cat $file | jq '.[] | .password' | tr -d '"'`
shell=`cat $file | jq '.[] | .shell' | tr -d '"'`
groups=`cat $file | jq '.[] | .groups' | tr -d '"'`
groups=`echo $groups | sed s/[[:space:]]//g`
groups=${groups//][/| }
groups=${groups//]/ }
groups=${groups//[/ }
group_array=($(echo $groups | awk -F RS='[|]+' '{for (i=1; i<=NF; i++) arr[i]=$i; for (j in arr) printf("%s ", arr[j])}'))
user_array=($(echo $username | awk '{for (i=1; i<=NF; i++) arr[i]=$i; for (j in arr) printf("%s ", arr[j])}'))
password_array=($(echo $password | awk '{for (i=1; i<=NF; i++) arr[i]=$i; for (j in arr) printf("%s ", arr[j])}'))
shell_array=($(echo $shell | awk '{for (i=1; i<=NF; i++) arr[i]=$i; for (j in arr) printf("%s ", arr[j])}'))
for ((i=0; i<${#group_array[@]}; i++)); do
group_array[$i]=${group_array[$i]//|/}
user_exist=0
check_user_exist ${user_array[$i]}
echo "${user_array[$i]}, ${password_array[$i]}, ${shell_array[$i]}, ${group_array[$i]}"
if [ $user_exist = 1 ] ; then
echo "Warning: user ${user_array[$i]} already exists."
else
check_group_exist ${group_array[$i]//,/ }
if [ "$group_array[$i]" = "" ] ; then
sudo echo $password | sudo pw useradd $username -m -h 0 -s $shell
else
sudo echo $password | sudo pw useradd $username -m -h 0 -s $shell -G $groups
fi
fi
done
簡單來說就是將 JSON 檔個別欄位的數值都整理成一個陣列
所以理論上順序會跟 JSON 檔一樣 (admin_cat, meow_2, meow_3)
但神奇的是實際上他的順序是 meow_2, meow_3, admin_cat
雖然資料配對都是正確的(username <=> password etc.)
想知道為什麼會有這個現象






