最新のシステムを使用するためにコードを書き直しています。元のコードを書いていませんでしたが、古いコードをテンプレートとして使ってみました。単独でコマンドを実行するとうまくいきます。シェルでスクリプトまたは関数の一部として実行しようとすると、実行されません。
#!/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 メソッドとは異なり、入力の各空行に対して空の要素が生成されることに注意してください。)