我正在尝试附加创建一个将在 grep 行中间求值的字符串。它是查找某个文件中可能出现的不同用户名。但是,我不知道会有多少个用户名。因此,我循环遍历包含用户名列表的数组,并在输出处返回,就像将在 grep 行中使用的“-e username -e username2 -e username3”一样。
但是,这小段代码似乎给我带来了麻烦。我尝试了几种方法,但 UNIX 仍然认为我正在尝试传递某种命令:
eGrepUsernames(){
returnString="";
for username in "${usernames[@]}"
do
$returnString="$returnString -e $username" #error given, command not found
done
echo returnString;
}
后来,我在这里调用该函数:
declare -a activeUsers=$( who | grep `eGrepUsernames` )
在这种情况下我做错了什么?
答案1
您的函数在分配期间尝试$returnString
在左侧进行评估;相反,你想要:
eGrepUsernames(){
returnString="";
for username in "${usernames[@]}"
do
returnString="$returnString -e $username" # this line changed
done
printf '%s ' $returnString; ## so did this one
}
答案2
declare
是仅 bash 命令,相当于typeset
inksh
或zsh
。
dash
没有等效的命令,并且除了 with 之外没有数组支持"$@"
。
这里的方法是将用户名列表存储在换行符分隔列表中:
users="me
you
someone"
并使用:
who | grep -F "$users"
但是,这将在输出中查找me
,you
或任何位置(请注意,例如确实包含)。someone
who
someone
me
有些grep
实现只能-w
搜索单词。
您可能想要检查who
输出的第一列(假设您的用户的用户名中没有空格):
users="me you someone"
grepUsernames() {
awk -v u="$users" '
BEGIN{split(u, a); for (i in a) users[a[i]]}
$1 in users'
}