如何在字符串后添加破折号?

如何在字符串后添加破折号?

我正在尝试附加创建一个将在 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 命令,相当于typesetinkshzsh

dash没有等效的命令,并且除了 with 之外没有数组支持"$@"

这里的方法是将用户名列表存储在换行符分隔列表中:

users="me
you
someone"

并使用:

who | grep -F "$users"

但是,这将在输出中查找me,you或任何位置(请注意,例如确实包含)。someonewhosomeoneme

有些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'
}

相关内容