문자열에서 새 줄의 수를 찾은 다음 이 숫자를 루프의 while
제한으로 사용하고 싶습니다.
다음을 사용하여 행 수를 찾아 쓸 수 있습니다.
echo "$MY_STRING" | grep -c '$'
행 수를 정수로 설정하고 이를 while 루프에서 사용하려면 다음을 수행합니다.
MYNUM="$MY_PEERS" | grep -c '$'
그러나 이 줄은 즉시 터미널에 0을 씁니다. 이는 내 문자열의 줄 수가 아닙니다. 또한 MYNUM
루프를 실행할 수 없습니다 while
. (내가 $MYNUM
사용하고 있는 것 while
) 루프에서 한계로 사용할 수 있도록 행 수를 어떻게 구합니까 while
?
답변1
비록 완전히 이해하지는 못하지만왜당신은 이것이 필요하며 이것이 그것을 완료할 수 있는 한 가지 방법입니다. 핵심은 $( )
출력을 캡처하여 변수에 할당하는 것입니다.
암호:
#!/usr/bin/env bash
IFS='' read -r -d '' TEST_STR <<-'EOF'
Test text
quick brown fox
lazy dog
EOF
NEW_LINE_COUNT=$(echo "$TEST_STR" | wc -l)
echo "$TEST_STR"
echo "$NEW_LINE_COUNT"
결과:
Test text
quick brown fox
lazy dog
4
답변2
개별 장치를 보기 위해 여러 줄 문자열의 줄 수를 계산할 필요가 없습니다. 여기서는 배열 변수와 함께 사용되는 루프를 for
다음과 같이 사용할 수 있습니다.
IFS=$'\n' read -d '' -r -a Multi_Line_Str <<STR
$(printf '%s\n' 'device_'{A..E})
STR
for device in "${Multi_Line_Str[@]}"
do
echo "<$device>"
done
답변3
여러 줄 문자열이 있는 경우 wc -l
이를 사용하여 줄 수를 간단히 계산할 수 있습니다.
printf '%s' "$string" | wc -l
해당 숫자를 변수에 저장합니다.
nlines=$( printf '%s' "$string" | wc -l )
그러나 while 루프를 실행하는 데는 이 숫자가 필요하지 않습니다.
printf '%s' "$string" |
while read -r line; do
# do something with "$line"
done
각 행에서 수행하는 작업에 따라 while 루프가 전혀 필요하지 않을 수도 있습니다.
printf '%s' "$string" | awk '<some awk script>'
데이터가 생성되는 방식에 따라 데이터를 여러 줄 변수에 전혀 저장할 필요가 없을 수도 있습니다.
some_command | some_line_by_line_processing
여기서는 some_command
while 루프, 서브셸의 명령 모음( (...)
) 또는 출력을 생성하는 간단한 명령 some_line_by_line_processing
일 수도 있고 awk
, ) 또는 루프 또는 출력을 처리해야 하는 다른 모든 것일 수도 있습니다. 파이프라인의 첫 번째 부분을 한 줄씩 표시합니다.