【问题标题】:Command line arguments versus case statement argument命令行参数与 case 语句参数
【发布时间】:2013-10-23 12:25:11
【问题描述】:

我正在尝试执行命令,但我需要获取命令行参数。这是我的问题:

这是代码:

pl_function(){
 node=$(echo "$1" | awk -F'\.' '{print $2}')
 echo $node
}

我有一个案例陈述:

case "$1" in -pl.*)
 pl_function
  ;;
esac

当我运行它时,它会打印一个空白。

另外,我想包括getopts,以便不关心参数的顺序。假设我有-location 后跟一个参数,-grep 后跟一个参数,-def_location 后跟没有参数。

在这种情况下我该如何使用getopts

【问题讨论】:

  • 使用非保留名称的函数怎么样? my_function 可以是无害的。
  • 是的,对不起!它实际上称为 pl_function
  • 你有一个useless use of echo,但你没有正确引用你echo的变量。该函数可能只是echo "$1" | awk -F '\.' '{ print $2 }',但另请参阅@JohnKugelman 的答案。
  • 您可能应该发布一个关于 getopts 的单独问题。请每个问题一个问题。
  • 更简单,pl_function () { node=${1#*.}; echo "${node%.*}"; }(至少,不需要外部进程)。

标签: shell awk command-line-arguments


【解决方案1】:

在函数$1$2 等内部是函数的参数。调用函数时需要显式传递脚本的$1

case "$1" in -pl.*)
 pl_function "$1"
  ;;

此外,您可以使用一些 shell 脚本魔术来进行字符串拆分,而不是调用 awk:

node=${1#*.}    # `#*.' removes a substring matching `*.' from the
                # front of $1

【讨论】:

  • pl_function 不仅在 -pl.1 中打印 1,而且实际上在 if 语句中使用 1 来执行其他命令。我需要case语句,只是为了在用户输入-pl.1或-pl.2等时访问函数pl_function
  • 如果有两个以上的点分隔字段,还需要做"${1%%.*}"。但是 +1,这是这样做的方法。
  • 这也确实有效!!但它并没有解决它打印空白的问题。我的错误是我没有将参数传递给函数。
【解决方案2】:

当我运行它时,它会打印一个空白。

因为您没有将任何参数传递给期望的函数。用

替换你的函数调用
my_function "$1"

此外,@fedorqui 提出的pointed 不使用reserved words 作为变量/函数名称。

【讨论】:

  • 太棒了!这实际上回答了我的问题!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2016-03-25
相关资源
最近更新 更多