![문자열 뒤에 대시를 추가하는 방법은 무엇입니까?](https://linux55.com/image/81664/%EB%AC%B8%EC%9E%90%EC%97%B4%20%EB%92%A4%EC%97%90%20%EB%8C%80%EC%8B%9C%EB%A5%BC%20%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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
declare
bash 전용 명령은 typeset
in ksh
또는 와 동일합니다 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'
}