在Shell脚本中循环参数跳过第一个参数

在Shell脚本中循环参数跳过第一个参数,shell,Shell,我尝试过这个,但它给了我这个错误: ./backup.sh:10:./backup.sh:Bad substitution阅读完参数列表后,使用shift命令从参数列表中删除$1(从而将旧的$2重新编号为$1,将旧的$3重新编号为$2,等等): 为了提供与问题中的代码等效的文字(但不是特别好的实践),间接扩展(不存在这样的扩展)如下所示: #!/bin/sh backupdir=$1; shift for arg; do echo "$arg" done #/bin/bash #^^^^^

我尝试过这个,但它给了我这个错误:
./backup.sh:10:./backup.sh:Bad substitution

阅读完参数列表后,使用
shift
命令从参数列表中删除
$1
(从而将旧的
$2
重新编号为
$1
,将旧的
$3
重新编号为
$2
,等等):

为了提供与问题中的代码等效的文字(但不是特别好的实践),间接扩展(不存在这样的扩展)如下所示:

#!/bin/sh
backupdir=$1; shift
for arg; do
  echo "$arg"
done
#/bin/bash
#^^^^^--这不能保证在/bin/sh中工作
#不惯用,不能移植到基线POSIX外壳;这是最好避免的
backupdir=$1

对于((argnum=2;argnum在读完参数列表后,使用
shift
命令从参数列表中删除
$1
(从而将旧的
$2
重新编号为
$1
,将旧的
$3
重新编号为
$2
),等等):

为了提供与问题中的代码等效的文字(但不是特别好的实践),间接扩展(不存在这样的扩展)如下所示:

#!/bin/sh
backupdir=$1; shift
for arg; do
  echo "$arg"
done
!/bin/bash
#^^^^^--这不能保证在/bin/sh中工作
#不是惯用的,不能移植到基线POSIX shell;最好避免这种情况
backupdir=$1

对于((argnum=2;argnumBTW,所有caps名称都用于对OS或shell有意义的变量;您自己定义的变量名称中至少应有一个小写字符。请参阅相关POSIX规范的第4段(另外,您不能在大括号扩展中使用变量,例如
{2..$#}
--请参阅)..实际上,数字范围的大括号扩展根本不能保证与
/bin/sh
一起使用,即使是常数也是如此。顺便说一句,所有caps名称都用于对OS或shell有意义的变量;您自己定义的变量名称中至少应有一个小写字符。请参阅(另外,不能在大括号扩展中使用变量,如
{2..$#}
--请参见)…实际上,数字范围的大括号扩展根本不能保证与
/bin/sh
一起使用,即使是常数也是如此。
#!/bin/bash
#      ^^^^-- This IS NOT GUARANTEED TO WORK in /bin/sh

# not idiomatic, not portable to baseline POSIX shells; this is best avoided
backupdir=$1
for ((argnum=2; argnum<=$#; ++argnum)); do
  echo "${!argnum}"
done