shell脚本内部参数与外部参数

shell脚本内部参数与外部参数,shell,arguments,Shell,Arguments,我继承了一个shell脚本“myScript.sh”,我想对其进行参数化。 脚本中有一个函数,如下所示: function hmac_sha256 { key="$1" data="$2" printf "${data}" | openssl dgst -sha256 -mac HMAC -macopt "${key}" | \ sed 's/^.* //' } ARGV=("$@") # arguments in ARGV array will be shifted

我继承了一个shell脚本“myScript.sh”,我想对其进行参数化。 脚本中有一个函数,如下所示:

function hmac_sha256 {
  key="$1"
  data="$2"
  printf "${data}" | openssl dgst -sha256 -mac HMAC -macopt "${key}" | \
      sed 's/^.* //'
}
ARGV=("$@")
# arguments in ARGV array will be shifted - $1 on index 0, $2 on index 1, etc..
echo "My arguments ${ARGV[0]} ${ARGV[1]}"
现在,当我想在终端中调用整个脚本时,我会这样做

/.myScript arg1 arg2 etc
据我所知,默认情况下,这些参数由各自的“$1”和“$2”等表示。我在脚本的其他地方使用这些参数,而不是作为此特定函数的参数

然而,这些$1和$2已经在上面的函数中使用


问题是我认为:如何区分“外部”参数和“内部”参数?

跨不同shell的最方便的方法是将脚本参数分配给全局变量

ARG1="$1"
ARG2="$2"
echo "My arguments $ARG1 $ARG2"
在大多数现代shell中,至少在支持数组的bash、zsh、ksh中,也有实现这一点的快捷方式。请注意,严格的POSIX shell没有数组,因此这在它们中不起作用。您可以将$@分配给数组,并按如下方式访问此数组:

function hmac_sha256 {
  key="$1"
  data="$2"
  printf "${data}" | openssl dgst -sha256 -mac HMAC -macopt "${key}" | \
      sed 's/^.* //'
}
ARGV=("$@")
# arguments in ARGV array will be shifted - $1 on index 0, $2 on index 1, etc..
echo "My arguments ${ARGV[0]} ${ARGV[1]}"
最后,如果您对不可移植的bash脚本没有问题,那么可以使用bash_ARGV数组

echo "My arguments ${BASH_ARGV[1]} ${BASH_ARGV[0]}"

您可以在脚本开始时将shell脚本参数分配给其他变量,就像函数对自己的参数所做的那样。@Felix Kling:我就是这么做的。所以,$1有我传递给脚本的参数的值,但是当它传递给函数时会有一个不同的值?但是当它传递给函数时会有一个不同的值,也许这只是措词有点奇怪。如果您的意思是$1在函数中的值与脚本其余部分中的值不同,那么答案是肯定的。你必须把它们看作两个不同的变量,因为它们是。@Felix Kling:这就是我的意思。你可能想回答我的问题,这样我就可以接受了