Como anexar string com traço?

2

Eu estou tentando acrescentar uma string que será avaliada no meio de uma linha grep. É encontrar possíveis ocorrências de nomes de usuários diferentes dentro de um determinado arquivo. No entanto, não sei quantos nomes de usuário haverá. Então, eu percorro a matriz contendo a lista de nomes de usuários e retorno na saída como "-e username -e username2 -e username3" que será usado na linha grep.

No entanto, este pequeno pedaço de código parece estar me dando problemas. Eu tentei várias abordagens, mas o UNIX ainda acredita que estou tentando passar algum tipo de comando:

eGrepUsernames(){
    returnString="";
    for username in "${usernames[@]}"
    do
        $returnString="$returnString -e $username" #error given, command not found
    done
    echo returnString;
}

Mais tarde, eu chamo a função aqui:

declare -a activeUsers=$( who | grep 'eGrepUsernames' )

O que estou fazendo errado neste caso?

    
por Sepia Silver 18.01.2016 / 17:39

2 respostas

2

Sua função estava tentando avaliar $returnString no lado esquerdo durante a atribuição; em vez disso, você quer:

eGrepUsernames(){
    returnString="";
    for username in "${usernames[@]}"
    do
        returnString="$returnString -e $username" # this line changed
    done
    printf '%s ' $returnString;  ## so did this one
}
    
por 18.01.2016 / 18:05
1

declare é um comando somente bash, que é o equivalente a typeset em ksh ou zsh .

dash não possui comando equivalente e não possui suporte a matriz diferente de "$@" .

O caminho a seguir é armazenar a lista de nomes de usuários em uma lista delimitada por nova linha:

users="me
you
someone"

E use:

who | grep -F "$users"

No entanto, ele procurará me , you ou someone em qualquer lugar na who output (observe que someone contém me , por exemplo).

Algumas implementações grep têm -w para pesquisar apenas palavras.

Você provavelmente desejaria verificar a primeira coluna da who output (assumindo que nenhum de seus usuários tem espaços em branco em seus nomes de usuário):

users="me you someone"
grepUsernames() {
  awk -v u="$users" '
    BEGIN{split(u, a); for (i in a) users[a[i]]}
    $1 in users'
}
    
por 18.01.2016 / 18:38

Tags