첫 번째 인수의 기본값이 명령줄의 값인 경우 두 번째 인수를 어떻게 전달합니까?

첫 번째 인수의 기본값이 명령줄의 값인 경우 두 번째 인수를 어떻게 전달합니까?
cdcl()          { vlog -source -lint +define+"${1:-DEBUG}" -sv "${2:-*.sv}"; }

위는 내 기능이며 .bashrc 파일에 정의했습니다. 아래는 내 명령 줄입니다

% cdcl 'RANDOM' 'abc.sv'

이것은 나에게 >>를 준다vlog -source -lint +define+RANDOM -sv abc.sv

명령줄에서 첫 번째 자리 표시자 값 제공을 건너뛰고 두 번째 자리 표시자만 제공할 수 있는 방법이 있습니까?

답변1

함수가 하나의 인수로만 호출되는지 확인하고 이 경우를 다르게 처리할 수 있습니다.

cdcl() {
  if (($# == 1)); then
    vlog -source -lint +define+DEBUG -sv "$1"
  else
    vlog -source -lint +define+"${1:-DEBUG}" -sv "${2:-*.sv}"
  fi
}

답변2

함수는 콜론(예: "${1:-DEBUG}"and not ) 을 사용한 기본 확장을 사용하므로 "${1-DEBUG}"null 값도 기본값 사용을 트리거합니다. ""null 값을 사용하거나 전달할 수 ''있으므로

cdcl "" abc.sv

함수가 실행되도록 해야 합니다.

vlog -source -lint +define+DEBUG -sv abc.sv

이 기능을 사용하면 "${1-DEBUG}"값이 설정되지 않은 경우에만 기본값이 트리거되고, 불가능할 경우 $1$2이 설정되지 않았거나 이미 정의된 경우에만 기본값이 트리거됩니다. 순서대로 이루어져야 하며 목록에 "구멍"이 있어서는 안 됩니다.

이와 같이 빈 문자열을 전달하는 것이 좋은 해결책은 아니며, 예를 들어 적절한 기본값을 사용 getopt하여 비슷한 인수를 허용하도록 함수 내에서 사용하도록 결정할 수도 있습니다 .cdcl -d RANDOM -s abc.sv

답변3

귀하의 질문을 올바르게 이해했다면 스크립트에 첫 번째 인수 제공을 건너뛰고 이를 사용 RANDOM하지만 입력할 필요는 없습니다. 매개변수의 순서를 복원할 수 있습니다.

cdcl() {
  local f_pattern="${1:-*.sv}"
  echo "vlog -source -lint +define+${2:-DEBUG} -sv $f_pattern"
  # vlog -source -lint +define+"${2:-DEBUG}" -sv "$f_pattern"
}

echo여기서는 사용할 명령과 매개변수를 인쇄하는 데 사용 합니다. 자신있으면 삭제하세요echo

관련 정보