지정된 필드가 존재하지 않으면 컷은 무엇을 반환합니까?

지정된 필드가 존재하지 않으면 컷은 무엇을 반환합니까?

문자열이 있습니다.

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).

첫 번째 경우에는 versionfull6.40.4.0이 포함되며 패딩은 무시되고 필요에 따라 4가 반환됩니다. 두 번째 경우에는 .0채워지고 반환됩니다.

답변4

빈 문자열로 설정됩니다. 명령에서 변수를 사용할 때는 변수를 따옴표로 묶어야 합니다 [.

if [ "$var" == "" ]
then echo "Var is empty"
fi

따옴표가 없으면 첫 번째 줄은 다음과 같이 확장됩니다.

if [ == "" ]

==이는 왼쪽에 인수가 필요하기 때문에 잘못된 구문입니다 .

관련 정보