[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