#shell script + awk 導出陣列的奇怪問題

1 messages · Page 1 of 1 (latest)

plain ember
#

我在寫 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.)

想知道為什麼會有這個現象

lime geode
#
        username=$(cat $file | jq '.[] | .username' | tr -d '"')
        password=`cat $file | jq '.[] | .password' | tr -d '"'`

這是bash和zsh混用了嗎?還是我太笨.w.

plain ember
#

誒我其實不太確定哪個才是對的

#

但感覺都能用就用了

river kraken
lime geode
#

原來

#

我只知道反引號超難用

plain ember
#

不過這其實是小問題
最大的問題還是他在偵測 user 是否存在上有 bug qq

#

我是寫一個 function

function check_user_exist() {
    local username=$1
    getent passwd $username > null 2>&1
    if [ $? -eq 0 ]; then
        user_exist=1
    fi
}

但就會有的能偵測到,有的不行

#

仔細檢查過後發現是這個

gentle quiver
#

把JSON轉成tsv操作呢(?

plain ember
#

            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
#

if 跟 else 都會運行到

#

不知道為啥

#

找到問題了

#

我忘記改成存取陣列值 = =

#

有夠哭
果然問題丟群組就會自己找到問題

lime geode
#

笑死

#

看來你很需要橡皮小鴨

plain ember
#

我在那邊找了老半天找不到

#

丟上來:欸幹那裡不對勁

#

雖然我還是不知道為什麼順序會爛掉w

#

而且是四個陣列以一模一樣的方式亂掉

lime geode
#

我只知道你訊息寫 [y/N] 比較好,大寫的那個代表預設(?

plain ember
#

#

那是題目規定的

#

我寫 [y/N] 會拿不到分數

#

這份是說明
我已經花了 2 天寫完前面三大部分了
剩下最後的 create user

lime geode
#

plain ember
#

我也蠻好奇為什麼 n 不是大寫ㄉ

lime geode
#

我覺得我今天犯的蠢夠多了

plain ember
#

這我

#

然後他繳交上去跑需要好幾分鐘 EEEEE

plain ember
#

chatGPT 之前騙我

lime geode
#

他本來就不是醬用ㄉㄅ

plain ember
#

什麼意思

lime geode
#

他不能保證資料的正確啊

plain ember
#

你是在指哪個東西

lime geode
#

GPT

plain ember
#

喔我知道啊

#

只是靠北一下而已

#

好難通靈歐
解決一個又跑出另外一個問題 suicide

gentle quiver
cold plaza
#

還有一個問題:為什麼要 sudo echo

#
                else
                    sudo echo $password | sudo pw useradd $username -m -h 0 -s $shell -G $groups```
plain ember
#

-h 0 可以透過 stdin 指定要設定的密碼

#

已經拿到 95 分了
不過似乎會漏掉一些 group

#

還在尋找 bug 中

plain ember
#

100 了 happy_mention

hasty swift
#

感覺不太好欸

#

這樣

plain ember
#

喔確實