Bash 配列アクセスが期待どおりに機能しません。

Bash 配列アクセスが期待どおりに機能しません。

最新のシステムを使用するためにコードを書き直しています。元のコードを書いていませんでしたが、古いコードをテンプレートとして使ってみました。単独でコマンドを実行するとうまくいきます。シェルでスクリプトまたは関数の一部として実行しようとすると、実行されません。

#!/bin/bash
function find_user() {
    local txt
    local user_list
    local username
    local displayName

    echo "Find User"
    echo "---------"

    echo -n "Enter search text (e.g: lib): "
    read txt

    if [ -z "$txt" ] || ! validate_fullname "$txt"; then
        echo "Search cancelled."
    else
        echo
        user_list="$(samba-tool user list | grep -i ${txt} | sort)"
        (
            echo "Username Full_Name"
            echo "-------- ---------"
            # Dev Note: Get the username, then displayName parameter, replacing
            # the spaces in displayName with an underscore. Do not need to look
            # for a dollar sign anymore, as computers are not listed as "user"
            # class objects in AD.
            for a in "${user_list[@]}"; do
                username=$a
                displayName="$(
                    samba-tool user show ${a} | grep 'displayName:' | \
                        awk -F: '{gsub(/^[ \t]+/,"""",$2); gsub(/ ./,""_"",$3); print $2}' | \
                        tr ' ' '_')"
                echo "${username} ${displayName}"
            done
        )| column -t
     fi
}

実行してfind_user関数を入力しようとすると、検索テキストを入力するように求められます(たとえば、入力できますjs)、Enterキーを押します。

私の質問はその部分に関連しています$displayName=。スクリプト内で実行すると空の文字列を生成するようです。端末でコマンドを手動で実行すると(つまり、jsmith代替項目を入力すると${a})フルネームが正しく出力されます。

私のシステムはbashを実行しています。

どうなりますか?この問題をどのように解決できますか?

ベストアンサー1

問題はuser_list配列としてアクセスすることです。

for a in "${user_list[@]}"

ただし、文字列に設定:

user_list="$(samba-tool user list | grep -i ${txt} | sort)"

代わりに、あなたは必要です

IFS=$'\n'     # split on newline characters
set -o noglob # disable globbing

# assign the users to the array using the split+glob operator
# (implicitly invoked in bash when you leave a command substitution
# unquoted in list context):
user_list=( $(samba-tool user list | grep -ie "${txt}" | sort) )

または、より良い方法は次のとおりです(bash具体的ですが)。

readarray -t user_list < <(samba-tool user list)

(空行を破棄する Split+glob メソッドとは異なり、入力の各空行に対して空の要素が生成されることに注意してください。)

おすすめ記事