-1

我想了解以下命令的作用

set -- "$@" "-h"

gnu手册说

--

  If no arguments follow this option, then the positional parameters are unset.    
  Otherwise, the positional parameters are set to the arguments, even if some
  of them begin with a ‘-’.

不过,我无法从这样的描述中获取太多有用的信息。

据我了解,以下附加-h到函数参数列表中。

set -- "$@" "-h"

但是,以下内容实际上如何替换--help-h等。

 printf '%s\n' "$*"
 for arg in "$@"; do
   shift
   printf '%s\n' "--> arg: $arg"
   case "$arg" in
     "--Version")   set -- "$@" "-V"   ;;
     "--usage")     set -- "$@" "-u"   ;;
     "--help")      set -- "$@" "-h"   ;;
     "--verbosity") set -- "$@" "-v"   ;;
     *)             set -- "$@" "$arg" ;;
   esac
 done
4

1 回答 1

4

简短的回答:它添加-h到当前参数列表的末尾(也就是位置参数)。

长答案:"$@"扩展到当前参数列表(即传递给当前脚本、函数或任何相关上下文的参数列表)。将当前参数列表set -- whatever 替换--为. 因此,它将当前参数列表替换为...当前参数列表,后跟-h.

例如,假设我们在一个使用./scriptname foo bar baz. 那么参数列表是foo, bar, baz(即$1是“foo”,$2是“bar”,并且$3是“baz”)。在剧本中,

set -- "$@" "-h"

扩展为等价于:

set -- "foo" "bar" "baz" "-h"

...将参数列表设置为foobarbaz-h

于 2021-08-29T19:18:47.140 回答