[bash] 선택적 입력 인수를 사용하는 bash 스크립트를 작성하는 방법은 무엇입니까?
스크립트가 선택적 입력을받을 수 있기를 원합니다.
예를 들어 현재 내 스크립트는
#!/bin/bash
somecommand foo
그러나 나는 그것을 말하고 싶습니다 :
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
답변
기본값 구문을 사용할 수 있습니다.
somecommand ${1:-foo}
위의 내용은 Bash Reference Manual-3.5.3 Shell Parameter Expansion [emphasis mine]에 설명되어 있습니다.
매개 변수가 설정되지 않거나 null이면 단어 확장이 대체됩니다. 그렇지 않으면 매개 변수 값이 대체됩니다.
매개 변수가 설정되지 않은 경우 (기본값이 아닌 경우 (예 : 빈 문자열이 아닌 경우)) 기본값을 바꾸려면이 구문을 대신 사용하십시오.
somecommand ${1-foo}
Bash Reference Manual-3.5.3 에서 다시 셸 매개 변수 확장 :
콜론을 생략하면 설정되지 않은 매개 변수에 대해서만 테스트가 수행됩니다. 다시 말해, 콜론이 포함되면 연산자는 매개 변수의 존재 여부와 그 값이 널이 아닌지 테스트합니다. 콜론이 생략되면 연산자는 존재 여부 만 테스트합니다.
답변
다음과 같이 변수의 기본값을 설정할 수 있습니다.
somecommand.sh
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
작동 방식의 예는 다음과 같습니다.
$ ./somecommand.sh
foo
bar
1
Thu Mar 29 10:03:20 ADT 2018
$ ./somecommand.sh ez
ez
bar
1
Thu Mar 29 10:03:40 ADT 2018
$ ./somecommand.sh able was i
able
was
i
Thu Mar 29 10:03:54 ADT 2018
$ ./somecommand.sh "able was i"
able was i
bar
1
Thu Mar 29 10:04:01 ADT 2018
$ ./somecommand.sh "able was i" super
able was i
super
1
Thu Mar 29 10:04:10 ADT 2018
$ ./somecommand.sh "" "super duper"
foo
super duper
1
Thu Mar 29 10:05:04 ADT 2018
$ ./somecommand.sh "" "super duper" hi you
foo
super duper
hi
you
답변
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
답변
당신은 인수의 수를 확인할 수 있습니다 $#
#!/bin/bash
if [ $# -ge 1 ]
then
$1
else
foo
fi
답변
변수 $ 1 .. $ n 인 경우 대체를 사용하려면 일반 변수에 기록해야합니다.
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
답변
선택적인 다중 인수의 경우 ls
하나 이상의 파일을 사용할 수 있는 명령 과 유사 하거나 기본적으로 현재 디렉토리의 모든 항목을 나열합니다.
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
경로에 공백이있는 파일에 대해서는 올바르게 작동하지 않습니다. 그 작업을 아직 수행하는 방법을 찾지 못했습니다.
답변
이는 선택적 1 차 인수에 대한 기본값을 허용하고 여러 인수를 유지합니다.
> cat mosh.sh
set -- ${1:-xyz} ${@:2:$#} ; echo $*
> mosh.sh
xyz
> mosh.sh 1 2 3
1 2 3