Bash, 인수 없음 경고 및 케이스 결정


110

나는 배쉬를 배우고있다.

인수가 주어지지 않을 때 몇 가지 메시지를 보여주는 간단한 스크립트를 작성하고 싶습니다. 그리고 내가 numers를 인수로 주면 값에 따라 하나 또는 다른 일을합니다.

Bash 초보자를위한 최고의 온라인 매뉴얼에 대한 제안도 알고 싶습니다.

감사

답변:


176
if [[ $# -eq 0 ]] ; then
    echo 'some message'
    exit 0
fi

case "$1" in
    1) echo 'you gave 1' ;;
    *) echo 'you gave something else' ;;
esac

고급 Bash 스크립팅 가이드는 아주 좋은 것입니다. 이름에도 불구하고 기본을 다룹니다.


RE : "exit 0". 대본을 종료하는 것이 그가 염두에 둔 것이 었는지 모르겠습니다. 그러나 예, 그것은 훌륭한 가이드입니다.
Trampas Kirk

메시지가 도움말 텍스트라고 가정하여 "and"를 "otherwise"로 해석했습니다. 하지만 베르너는 그 선이 무엇을 알아낼 수 확신 그는 :)을 원하는지
토마스

물론 감사합니다! 마지막으로 스크립트에서 오류 메시지를 끄면 쉘에 표시되지 않습니다.
길 열기

당신이 부르는 특정 프로그램에서 나오는 오류를 의미합니까? 당신은 넣을 수 있습니다 > /dev/null및 / 또는 2> /dev/null그 후 망각으로 표준 출력 및 / 또는 표준 오류 스트림을 보낼 수 있습니다.
Thomas

4
누락 된 인수가 잘못된 것으로 간주되면 (예 : 스크립트가 성공적으로 수행 할 수 없음) 0 ( exit 1)이 아닌 다른 것을 반환합니다 . 온라인에서 빠르게 찾을 수있는 반환 / 종료 코드에 대한 추가 규칙이 있지만 중요한 점은 성공을 나타내는 0이 아니어야한다는 것입니다.
Felix

25

특정 인수가 누락 된 경우에만 보석금에 관심이 있다면 매개 변수 대체 가 좋습니다.

#!/bin/bash
# usage-message.sh

: ${1?"Usage: $0 ARGUMENT"}
#  Script exits here if command-line parameter absent,
#+ with following error message.
#    usage-message.sh: 1: Usage: usage-message.sh ARGUMENT

11

 if [ -z "$*" ]; then echo "No args"; fi

결과

No args

세부

-z 는 문자열 길이가 0 인 단항 연산자입니다. $*모든 인수입니다. 따옴표는 안전을위한 것이며 여러 인수가있는 경우 캡슐화합니다.

이와 같은 더 많은 연산자를 사용하려면 "단항"을 사용 man bash하고 검색 ( / 키)하십시오.


7
이것의 (사소한) 문제는 인수를 전달하지 않는 것과 빈 문자열을 인수로 전달하는 것을 구별하지 않는다는 것입니다. 일부 상황에서는 중요 할 수 있습니다. [$ # -eq 0]을 사용하면 두 경우 모두 올바르게 처리 할 수 ​​있습니다.
Idelic 2010 년

1
아, (ba) sh 프로그래밍의 미묘함 ... 이것이 내가 싫어하는 이유입니다.
Thomas

1
생각 -z으로 mizzing
레이 포스에게

4

오래되었지만 이전의 혼란 덕분에 답을 다시 작업해야 할 이유가 있습니다.

if [[ $1 == "" ]] #Where "$1" is the positional argument you want to validate 

 then
 echo "something"
 exit 0

fi

위치 인수 $ 1이 없으면 "Something"이 표시됩니다. 그러나 $ 1에 특정 정보가 포함되어 있는지 확인하지는 않습니다.


$#명시 적으로 인수 개수의 정수 개수입니다. "0"이되고 인수가 없더라도 "something"을 에코하거나 양수이고 "something"을 올바르게 에코합니다. 그러나 검사 자체는 사용하는 입력 또는 입력 부족에 관계없이 아무것도 수행하지 않습니다. 항상$# 값 이 포함 된 것으로 보고합니다 . 따라서 이것은 완전히 잘못된 것이며 주장대로 작동하지 않을 것입니다.
eschwartz

당신은 그것에 대해 완전히 긍정적입니까? 이 정확한 형식을 사용하여 의도 한대로 작동하는 여러 스크립트가 있습니다. 귀하의 답변을 읽은 후 나는 경기와 부족 모두를 다시 테스트했습니다. 시나리오에서 #와 일치하는 위치 인수가없는 경우 $ #는 지정되지 않은 경우 값을 포함하지 않습니다. bash가 존재하지 않는 위치 인수의 값을 가정하는 이유는 의미가 없습니다.
라이언 스미스

시도 echo $#후, 스크립트 /tmp/test.sh의 내용으로 사용 가능한이 아니라 / 빈 / SH (또는 / 빈 / 대쉬와 어떤 다른 쉘 구현으로 / 아래 / 빈 떠들썩한 파티를 실행합니다. /tmp/test.sh에 "0"메아리 의지와 콘솔, /bin/dash /tmp/test.sh. 반면에, /tmp/test.sh foo"1"에코하며, /tmp/test.sh first second"2"에코됩니다.
eschwartz

에 따라 man bash"특수 매개 변수"섹션에서 "쉘은 여러 매개 변수를 특별히 처리합니다. 이러한 매개 변수는 참조 만 가능하며 할당은 허용되지 않습니다."및 "# 십진수의 위치 매개 변수 수로 확장됩니다." 마찬가지로 pubs.opengroup.org/onlinepubs/9699919799/utilities/…에
eschwartz

잘못된 의사 소통이 있었던 것 같습니다. 나는 문자 그대로 $ #가 아닌 특정 위치 인수 (즉, 두 번째 인수를 의미하는 경우 $ 2)에 대한 자리 표시 자로 #을 의미했습니다. 위의 내용을 검토 한 후에는 리터럴 $ #가 항상 인수 수로 해석됩니다. 혼란에 대해 사과드립니다.
라이언 스미스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.