답변:
그것은:
if [ $# -eq 0 ]
then
echo "No arguments supplied"
fi
$#
변수는 당신에게 스크립트가 전달 된 입력 인수의 수를 알려줍니다.
또는 인수가 빈 문자열인지 아닌지 확인할 수 있습니다.
if [ -z "$1" ]
then
echo "No argument supplied"
fi
-z
"$ 1"의 확장이 널 (null) 문자열인지 아닌지 스위치를 테스트합니다. 널 문자열 인 경우 본문이 실행됩니다.
exit 1
스크립트가 작동하기 위해 인수가 필요할 때 if 블록 내부의 에코 끝에 에코 를 추가하고 싶을 것입니다 . 명백하지만 완전성에 주목할 가치가 있습니다.
programname "" secondarg third
. $#
검사는 명확 인수의 수를 확인합니다.
if [ ! -z "$1" ]; then ...
이 방법을 시연하는 것이 좋습니다
if [[ $# -eq 0 ]] ; then
echo 'some message'
exit 1
fi
인수가 너무 적은 경우 일반적으로 종료해야합니다.
exit 1
일반적으로 원하는 것이며, [[ ]]
어느 것이 더 합리적인지 테스트를 사용합니다 . 따라서 사람들이 코드를 맹목적으로 복사하여 붙여 넣는 것이 더 좋습니다.
경우에 따라 사용자가 스크립트에 인수를 전달했는지 여부를 확인해야하며 그렇지 않은 경우 기본값으로 돌아갑니다. 아래 스크립트에서와 같이 :
scale=${2:-1}
emulator @$1 -scale $scale
사용자가 scale
두 번째 매개 변수로 전달하지 않은 경우 -scale 1
기본적으로 Android 에뮬레이터를 시작 합니다. ${varname:-word}
확장 연산자입니다. 다른 확장 연산자도 있습니다.
${varname:=word}
값 을 반환하는 대신 undefined 를 설정 합니다 .varname
word
${varname:?message}
varname
정의되고 null이 아닌 경우 반환 하거나 message
스크립트를 인쇄 하고 스크립트를 중단합니다 (예 : 첫 번째 예).${varname:+word}
이 정의되고 null이 아닌 word
경우에만 반환 합니다 varname
. 그렇지 않으면 null을 반환합니다.${varname?message}
. 여분 :
의 오타입니까, 아니면 행동이 바뀌나요?
: ${1?"First argument is null"} ${2?"Please provide more than 1 argument"}
시험:
#!/bin/bash
if [ "$#" -eq "0" ]
then
echo "No arguments supplied"
else
echo "Hello world"
fi
$#
및에 큰 따옴표가 필요한 이유는 무엇 0
입니까?
else
.
foo*
) 및 단어 분리 (값에 공백이 포함 된 경우 내용 분할)를 방지합니다. 이 경우 $#
두 경우 모두 적용되지 않으므로 견적을 제시 할 필요 가 없습니다. 인용 0
부호도 필요하지 않지만 일부 사람들은 실제로 문자열이기 때문에 값을 인용하는 것을 선호합니다.
인수가 스크립트에 전달되었는지 감지하는 다른 방법 :
((!$#)) && echo No arguments supplied!
주 (( expr ))
식의 원인은의 규칙에 따라 평가하는 쉘 산술 .
인수가 없을 때 종료하려면 다음과 같이 말할 수 있습니다.
((!$#)) && echo No arguments supplied! && exit 1
위의 또 다른 (유사한) 방법은 다음과 같습니다.
let $# || echo No arguments supplied
let $# || { echo No arguments supplied; exit 1; } # Exit if no arguments!
help let
말한다 :
let: let arg [arg ...]
Evaluate arithmetic expressions. ... Exit Status: If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.
exit
내 zsh 프로세스를 죽이는 대신 return
죽이지 않는 것을 사용 합니다.
((!$#))
히스토리 대체를 유발하는 이유는 무엇 입니까?
인수가 존재하는지 확인하려면 인수 수가 인수 인수 수보다 크거나 같은지 확인할 수 있습니다.
다음 스크립트는 이것이 어떻게 작동하는지 보여줍니다
#!/usr/bin/env bash
if [ $# -ge 3 ]
then
echo script has at least 3 arguments
fi
다음과 같은 출력을 생성합니다
$ ./test.sh
~
$ ./test.sh 1
~
$ ./test.sh 1 2
~
$ ./test.sh 1 2 3
script has at least 3 arguments
$ ./test.sh 1 2 3 4
script has at least 3 arguments
작은 말씀 드리지만, 배쉬 숫자 테스트 연산자는 정수 작업 ( -eq
, -lt
, -ge
, 등)
나는 $ vars가 int 인 것을 보장하고 싶다.
var=$(( var + 0 ))
테스트하기 전에 "[: integer arg required"오류를 방지하기 위해.
var=$(printf "%.0f" "$var")
부동 소수점을 처리 할 수 있지만 문자열이 주어지면 0이 아닌 종료로 고통받습니다. 당신이 awk를 신경 쓰지 않는다면, 내가 사용하는이 방법은 정수를 시행하는 데 가장 강력한 것 같습니다 : var=$(<<<"$var" awk '{printf "%.0f", $0}')
. var가 설정되어 있지 않으면 기본값은 "0"입니다. var가 float이면 가장 가까운 정수로 반올림됩니다. 음수 값도 사용하기에 좋습니다.
하나의 라이너 bash 기능 검증
myFunction() {
: ${1?"forgot to supply an argument"}
if [ "$1" -gt "-1" ]; then
echo hi
fi
}
기능 이름 및 사용법 추가
myFunction() {
: ${1?"forgot to supply an argument ${FUNCNAME[0]}() Usage: ${FUNCNAME[0]} some_integer"}
if [ "$1" -gt "-1" ]; then
echo hi
fi
}
정수인지 확인하기 위해 유효성 검사 추가
예를 들어 전달 된 인수가 정수인지 확인하기 위해 유효성 검사를 추가하려면 유효성 검사 함수를 호출하도록 유효성 검사 한 라이너를 수정하십시오.
: ${1?"forgot to supply an argument ${FUNCNAME[0]}() Usage: ${FUNCNAME[0]} some_integer"} && validateIntegers $1 || die "Must supply an integer!"
그런 다음 인수의 유효성을 검사하여 성공시 0, 실패시 1, 실패시 스크립트를 중단하는 die 함수를 반환하는 유효성 검사 함수를 구성합니다.
validateIntegers() {
if ! [[ "$1" =~ ^[0-9]+$ ]]; then
return 1 # failure
fi
return 0 #success
}
die() { echo "$*" 1>&2 ; exit 1; }
더 간단합니다-그냥 사용하십시오 set -u
set -u
참조 된 모든 변수가 사용될 때 설정되므로 변수를 설정하고 잊어 버립니다.
myFunction() {
set -u
if [ "$1" -gt "-1" ]; then
echo hi
fi
}
[ -z "$1" ] && echo "No argument supplied"
나는 그들이 더 쉬워서 하나의 라이너를 선호한다.if