当第一个参数默认为其在命令行中的值时,如何传递第二个参数?

当第一个参数默认为其在命令行中的值时,如何传递第二个参数?
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

由于该函数使用带冒号的默认值扩展,即 ie"${1:-DEBUG}"和 not "${1-DEBUG}",空值也会触发使用默认值。您可以使用""或传递空值'',因此

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

相关内容