source

선택적 입력 인수를 사용하는 bash 스크립트를 작성하는 방법

itover 2023. 4. 22. 09:22
반응형

선택적 입력 인수를 사용하는 bash 스크립트를 작성하는 방법

스크립트를 임의로 입력할 수 있도록 하고 싶다.

예: 현재 내 스크립트는

#!/bin/bash
somecommand foo

이렇게 말하고 싶습니다.

#!/bin/bash
somecommand  [ if $1 exists, $1, else, foo ]

default-value 구문을 사용할 수 있습니다.

somecommand ${1:-foo}

위의 내용은 Bash 레퍼런스 매뉴얼 3.5.3파라미터 확장 [강조 마이닝]에서 설명한 바와 같이 다음과 같습니다.

매개 변수가 설정되지 않았거나 null인 경우 단어 확장이 대체됩니다.그렇지 않으면 매개 변수 값이 대체됩니다.

매개 변수가 설정되지 않은 경우(예: 빈 문자열이 아닌 null인 경우) 기본값만 대체하려는 경우 대신 다음 구문을 사용하십시오.

somecommand ${1-foo}

다시 Bash 참조 매뉴얼 - 3.5.3 파라미터 확장:

콜론을 생략하면 설정되지 않은 파라미터에 대해서만 테스트가 이루어집니다.바꿔 말하면 콜론이 포함된 경우 연산자는 파라미터의 존재와 값이 null이 아님을 모두 테스트합니다.콜론을 생략하면 연산자는 존재 여부만 테스트합니다.

다음과 같이 변수의 기본값을 설정할 수 있습니다.

명령어를 입력합니다.

#!/usr/bin/env bash

ARG1=${1:-foo}
ARG2=${2:-'bar is'}
ARG3=${3:-1}
ARG4=${4:-$(date)}

echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"

다음은 동작의 예를 제시하겠습니다.

$ ./somecommand.sh
foo
bar is
1
Thu 19 May 2022 06:58:52 ADT

$ ./somecommand.sh ez
ez
bar is
1
Thu 19 May 2022 06:58:52 ADT

$ ./somecommand.sh able was i
able
was
i
Thu 19 May 2022 06:58:52 ADT

$ ./somecommand.sh "able was i"
able was i
bar is
1
Thu 19 May 2022 06:58:52 ADT

$ ./somecommand.sh "able was i" super
able was i
super
1
Thu 19 May 2022 06:58:52 ADT

$ ./somecommand.sh "" "super duper"
foo
super duper
1
Thu 19 May 2022 06:58:52 ADT

$ ./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")}

이것에 의해, 옵션의 첫 번째 arg 의 디폴트치가 허가되어 복수의 arg 가 유지됩니다.

 > cat mosh.sh
   set -- ${1:-xyz} ${@:2:$#} ; echo $*    
 > mosh.sh
   xyz
 > mosh.sh  1 2 3
   1 2 3 

옵션의 복수 인수의 경우는, 다음과 같이 유추합니다.ls명령어는 하나 이상의 파일을 가져올 수도 있고 기본적으로는 현재 디렉토리의 모든 파일을 나열할 수도 있습니다.

if [ $# -ge 1 ]
then
    files="$@"
else
    files=*
fi
for f in $files
do
    echo "found $f"
done

경로에 공백이 있는 파일에는 제대로 작동하지 않습니다.아직 어떻게 해야 할지 모르겠어.

변수 치환을 사용하여 고정값이나 명령을 대체할 수 있습니다(예:date)를 참조해 주세요.지금까지의 답변은 고정값에 초점을 맞췄지만, 이것이 바로 날짜를 옵션 인수로 삼기 위해 사용한 것입니다.

~$ sh co.sh
2017-01-05

~$ sh co.sh 2017-01-04
2017-01-04

~$ cat co.sh

DAY=${1:-$(date +%F -d "yesterday")}
echo $DAY

${1:}을(를) 사용하면 함수에 전달된 첫 번째 매개 변수(1)를 잡을 수 있습니다.또는 (:) 기본값과 같은 공백을 잡을 수 있습니다.

예를들면.Laravel 장인을 사용할 수 있도록 .bash_aliases 파일에 저장합니다.

artisan() {
    docker exec -it **container_name** php artisan ${1: } ${2: } ${3: } ${4: } ${5: } ${6: } ${7: }
}  

이제 명령줄만 입력하면 됩니다.

  • 장인 -- 모든 파라미터({1:} ${2:}) ${3:} ${4:} ${5:} ${6:} ${7:})는 공백일 뿐입니다.
  • 장인 캐시: clear -- 첫 번째 파라미터(${1: })는 cache: clear가 되고 그 이외의 파라미터는 모두 공백이 됩니다.

이 경우 옵션으로 7개의 파라미터를 전달할 수 있습니다.

누군가에게 도움이 되었으면 좋겠어요.

언급URL : https://stackoverflow.com/questions/9332802/how-to-write-a-bash-script-that-takes-optional-input-arguments

반응형