bash에서 변수의 줄 수를 계산하려면 어떻게 해야 합니까?
문자열이 저장된 변수가 있는데 변수에 줄이 있는지 확인해야 합니다.
var=`ls "$sdir" | grep "$input"`
유사 코드:
while [ ! $var's number of lines -eq 1 ]
do something
그것이 그것을 확인하는 방법에 대한 제 생각입니다. echo $var | wc -l
작동하지 않습니다 - 항상 말합니다.1
있음에도 불구하고3
.
echo -e
역시 작동하지 않습니다.
인용문이 중요합니다.
echo "$var" | wc -l
허용된 답변 및 여기에 게시된 다른 답변은 빈 변수(정의되지 않았거나 빈 문자열)의 경우 작동하지 않습니다.
효과:
echo -n "$VARIABLE" | grep -c '^'
예:
ZERO=
ONE="just one line"
TWO="first
> second"
echo -n "$ZERO" | grep -c '^'
0
echo -n "$ONE" | grep -c '^'
1
echo -n "$TWO" | grep -c '^'
2
bash에서 여기 문자열을 사용하는 다른 방법:
wc -l <<< "$var"
이 댓글에 언급된 것처럼, 비어 있습니다.$var
여기서 문자열은 이 경우(해석)에 새 줄 문자를 추가하기 때문에 0줄이 아닌 1줄이 됩니다.
매개 변수 확장에 대해 언급한 사람이 없으므로 순수 bash를 사용하는 몇 가지 방법이 있습니다.
방법 1
줄 바꿈이 아닌 문자를 제거한 다음 문자열 길이 + 1을 가져옵니다. 따옴표가 중요합니다.
var="${var//[!$'\n']/}"
echo $((${#var} + 1))
방법 2
배열로 변환한 다음 배열 길이를 가져옵니다.이렇게 하려면 따옴표를 사용하지 마십시오.
set -f # disable glob (wildcard) expansion
IFS=$'\n' # let's make sure we split on newline chars
var=(${var})
echo ${#var[@]}
뒤에 \n이 있든 없든 모든 문자열에 대해 작동하는 @Julian's 응답의 더 간단한 버전: \n 뒤에 \n이 하나만 있는 파일은 비어 있는 것으로 계산합니다.
printf "%s" "$a" | grep -c "^"
- 0을 반환합니다. 설정되지 않은 변수, 빈 문자열, 맨 새 줄이 포함된 문자열
- 반환 1: 비어 있지 않은 모든 줄(후행 새 줄 포함 또는 없음)
- 기타
출력:
# a=
# printf "%s" "$a" | grep -c "^"
0
# a=""
# printf "%s" "$a" | grep -c "^"
0
# a="$(printf "")"
# printf "%s" "$a" | grep -c "^"
0
# a="$(printf "\n")"
# printf "%s" "$a" | grep -c "^"
0
# a="$(printf " \n")"
# printf "%s" "$a" | grep -c "^"
1
# a="$(printf " ")"
# printf "%s" "$a" | grep -c "^"
1
# a="aaa"
# printf "%s" "$a" | grep -c "^"
1
# a="$(printf "%s" "aaa")"
# printf "%s" "$a" | grep -c "^"
1
# a="$(printf "%s\n" "aaa")"
# printf "%s" "$a" | grep -c "^"
1
# a="$(printf "%s\n%s" "aaa" "bbb")"
# printf "%s" "$a" | grep -c "^"
2
# a="$(printf "%s\n%s\n" "aaa" "bbb")"
# printf "%s" "$a" | grep -c "^"
2
"wc -l"을 "wc -w"로 대체하여 줄 대신 단어 수를 셀 수 있습니다.이 값은 새 행을 계산하지 않으며 계속하기 전에 원래 결과가 비어 있는지 테스트하는 데 사용할 수 있습니다.
변수의 줄 수를 세는 또 다른 방법 - 변수가 성공적으로 채워졌는지 또는 비어 있지 않은지 확인했다고 가정하면, var subshell 결과 변경 후 $?만 확인하면 됩니다. - :
readarray -t tab <<<"${var}"
echo ${#tab[@]}
readarray|mapfile은 입력 파일 또는 여기서 문자열을 새 줄을 기준으로 배열로 변환하는 bash 내부 명령입니다.
-t 플래그는 배열의 셀 끝에 새 줄을 저장하는 것을 방지하여 나중에 저장된 값을 사용하는 데 유용합니다.
이 방법의 장점은 다음과 같습니다.
- 외부 명령 없음(wc, grep, ...)
- 하위 셸(파이프) 없음
- IFS 문제 없음(수정 후 복원, 내부 명령의 명령 제한 범위에서 사용하기 어려운 문제 등)
grep에서 결과가 반환되지 않으면 상위 투표 답변이 실패합니다.
Homer Simpson
Marge Simpson
Bart Simpson
Lisa Simpson
Ned Flanders
Rod Flanders
Todd Flanders
Moe Szyslak
이것은 잘못된 방법입니다.
wiggums=$(grep -iF "Wiggum" characters.txt);
num_wiggums=$(echo "$wiggums" | wc -l);
echo "There are ${num_wiggums} here!";
우리에게 말할 것이다, 있다, 있습니다.1
리스트에 위검이 없어도 위검.
대신 변수가 비어 있는지 확인하기 위해 한 번 더 확인해야 합니다.-z
예를 들어 "is 0"과 같습니다.grep이 아무것도 반환하지 않은 경우 변수는 비어 있습니다.
matches=$(grep -iF "VanHouten" characters.txt);
if [ -z "$matches" ]; then
num_matches=0;
else
num_matches=$(echo "$matches" | wc -l);
fi
echo "There are ${num_matches} VanHoutens on the list";
"wc -l" 명령에서 파일 이름을 사용하지 않으려면:
lines=$(< "$filename" wc -l)
echo "$lines"
언급URL : https://stackoverflow.com/questions/6314679/in-bash-how-do-i-count-the-number-of-lines-in-a-variable
'sourcecode' 카테고리의 다른 글
도움말()이 메서드 서명을 나열하는 경우 슬래시는 무엇을 의미합니까? (0) | 2023.05.23 |
---|---|
C#에서 if/else를 사용하는 것과 switch-case를 사용하는 것 사이에 큰 차이가 있습니까? (0) | 2023.05.23 |
Node.js에서 "ReferenceError: primaryials is not defined"를 수정하는 방법 (0) | 2023.05.23 |
angular-cli server - API 요청을 다른 서버로 프록시하는 방법은 무엇입니까? (0) | 2023.05.23 |
현재 워크시트의 이름을 참조하여 다른 워크시트의 셀을 참조하시겠습니까? (0) | 2023.05.23 |