문자열이 있습니다.
6.40.4
두번째:
6.40
나는 var=$(echo $versionfull | cut -d'.' -f3)
bash의 첫 번째 문자열에서 세 번째 숫자를 얻었습니다. 이 명령은 두 번째 명령에 대해 무엇을 반환합니까? 비어 있는 것처럼 보이지만 또는 [ -z $var ]
작동하지 않습니다 [ $var == "" ]
. 0
두 번째 문자열이 있으면 값을 지정하고 싶습니다.
답변1
cut
이상한 API가 있습니다.
cut -f n
줄당 하나 이상의 구분 기호가 있는 n번째 필드를 출력하고 ( 줄에 n-1 구분 기호 미만(n 필드 미만)이 있는 경우 비어 있음) 전체 줄을 반환합니다.첫 번째필드) 구분 기호가 없는 경우:
$ echo a.b.c | cut -d. -f3
c
$ echo a.b | cut -d. -f3
$ echo a | cut -d. -f3
a
그래서 대답은지정된 필드가 존재하지 않으면 컷은 무엇을 반환합니까?입력 행에 필드가 하나 이상 있는지 여부에 따라 첫 번째 필드이거나 빈 필드입니다.
-s
옵션을 추가 할 수 있습니다 .제거하다구분 기호가 없는 행은 위의 이상한 마지막 경우를 피하지만 일반적으로 원하는 것은 아닙니다(일반적으로 입력 행을 완전히 건너뛰는 대신 비어 있는 세 번째 필드를 갖는 것으로 간주하려고 함 ). 첫 번째 필드를 원하는 경우 훨씬 더 나쁩니다. 필드:
$ echo a | cut -sd. -f2
$ echo a | cut -sd. -f1
$
(첫 번째 필드를 요청하면 입력에 필드가 하나만 있지만 입력에 구분 기호가 없기 때문에 출력이 나오지 않습니다.)
따라서 @ThoriumBR의 a 추가 제안은 .0
매우 좋은 것입니다. 그것 없이:
versionfull=5
echo "$versionfull" | cut -d. -f3
실제로는 5가 출력됩니다. 를 추가하면 .0
입력에 하나 이상의 구분 기호가 있는지 확인됩니다. 나는 한 단계 더 나아가 다음을 사용할 것입니다.
echo "$versionfull.0.0" | cut -d. -f3
입력에 필드가 3개 이상 있는지 확인하세요. 각 필드가 잘리므로 $versionfull
개행 문자나 백슬래시 문자 자체가 포함되어 있지 않다고 가정합니다.cut
철사\n
)의 많은 구현에 의해 입력이 개행 문자로 변환됩니다 echo
.
답변2
직접적인 질문에 답하기 위해 cut
후행 줄 바꿈 외에는 아무것도 반환되지 않습니다.사양에 따르면(감사해요돈 크리스티참고용):
echo "$versionfull" | cut -d. -f3 | od -c
0000000 \n
0000001
여기서 문자열을 지원하는 셸이 있는 경우 다음을 수행할 수 있습니다.
IFS=. read a b c <<< "$versionfull"
$versionfull
공백이 있는 경우를 대비하여 참조를 참고하세요 ( 의 모든 항목 $IFS
).
c
값이 비어 있다고 생각되면 0으로 설정하도록 요청하세요.
c=${c:-0}
답변3
당신이 사용할 수있는 var=$(echo "${versionfull}.0" | cut -d'.' -f3)
.
첫 번째 경우에는 versionfull
6.40.4.0이 포함되며 패딩은 무시되고 필요에 따라 4가 반환됩니다. 두 번째 경우에는 .0
채워지고 반환됩니다.
답변4
빈 문자열로 설정됩니다. 명령에서 변수를 사용할 때는 변수를 따옴표로 묶어야 합니다 [
.
if [ "$var" == "" ]
then echo "Var is empty"
fi
따옴표가 없으면 첫 번째 줄은 다음과 같이 확장됩니다.
if [ == "" ]
==
이는 왼쪽에 인수가 필요하기 때문에 잘못된 구문입니다 .