문자열 뒤에 대시를 추가하는 방법은 무엇입니까?

문자열 뒤에 대시를 추가하는 방법은 무엇입니까?

grep 줄 중간에 평가할 문자열을 추가하려고 합니다. 파일에 나타날 수 있는 다른 사용자 이름을 찾습니다. 그러나 사용자 이름이 몇 개인지는 알 수 없습니다. 그래서 사용자 이름 목록이 포함된 배열을 반복하고 grep 라인에서 사용할 "-e 사용자 이름 -e 사용자 이름2 -e 사용자 이름3"과 같은 출력을 반환합니다.

그러나 이 작은 코드 조각이 문제를 일으키는 것 같습니다. 몇 가지를 시도했지만 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

declarebash 전용 명령은 typesetin ksh또는 와 동일합니다 zsh.

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

관련 정보