구분 기호를 사용하여 변수에 문자열 추가

구분 기호를 사용하여 변수에 문자열 추가

이 문제를 해결하는 데 도움이 필요합니다. 이름 목록이 포함된 파일이 있습니다.

이름.txt

roger
peter
henry

:각 이름 뒤에 연결하고 싶습니다 .

for i in $(cat names.txt); do
   $i+=$i":"
done 

내가 원하는 출력은 이것이다roger:peter:henry

하지만 나는 이 출력을 얻습니다.roger:peter:henry:

답변1

이 작업을 수행할 수 있는 도구가 있습니다.paste

$ paste -sd: names.txt
roger:peter:henry

답변2

sed다음을 사용한 대체 솔루션 tr:

sed '$!s/$/:/' names.txt | tr -d '\n'

산출:

roger:peter:henry

답변3

paste작업에 적합한 도구입니다. 그러나 완전성을 기하기 위해 수행하려는 작업을 수행하는 방법은 다음과 같습니다.

k="$(head -n1 names.txt)";
for i in $(tail -n+2 names.txt); do 
    k="$k:$i"; 
done

그러면 다음이 생성됩니다.

$ echo "$k"
roger:peter:henry

답변4

$i+=$i":"

이것은 당신이 원하는 것을하지 않습니다. 대신 $i표시된 위치에서 확장되고 결과를 명령으로 실행하려고 시도합니다. 쉘 할당은 왼쪽에 있는 달러 기호를 사용하지 않습니다(변수 값을 사용하는 것으로 생각하십시오. 여기서는 필요하지 않지만 저장될 위치는 필요합니다). 그 i+=$i":"반대 여야 합니다 . 아니면 i+="$i:"쉘 변수 확장을 인용하는 습관을 들이는 것이 더 좋습니다.

또한 루프 변수로 사용되는 변수에 추가하려고 합니다. 이는 루프의 다음 라운드에서 덮어쓰여지므로 별로 유용하지 않습니다. 또한 마지막 항목을 포함하여 각 항목 뒤에 콜론을 추가하여 끝에 콜론이 표시되도록 하려고 합니다. 하지만 ${var%suffix}확장 후에는 제거할 수 있습니다.

그래서:

s=
for i in $(cat names.txt); do
   s+="$i:"
done 
s=${s%:}

그러나 따옴표 없이 확장하면 $(cat)모든 파일 이름 와일드카드 패턴(globs)이 처리되므로 파일의 한 줄은 *현재 디렉터리의 모든 파일로 확장됩니다.

관련 정보