如何跳过脚本中的第一个参数

如何跳过脚本中的第一个参数

Linux Pocket Guide 有一个很好的示例,介绍如何检查脚本中的所有参数

for arg in $@
do
   echo "I found the argument $arg"
done

我正在编写一个脚本,其中所有参数都是文本文件,我将连接所有这些文本文件并将它们打印到标准输出,但是我应该排除第一个参数的内容。我的第一个方法是这样的

for arg in $@
do
   cat "$arg"

done

但是,这将包括第一个参数,正如我所提到的,我想打印除第一个参数之外的所有参数。

答案1

您可以使用shift这样的命令:

shift
for arg in "$@"
do
    cat "$arg"
done 

答案2

您可以使用转移内置丢弃一个或多个位置参数,但您应该首先检查参数的数量:

if [ "$#" > 1 ]; then
  # Save first parameter value for using later
  arg1=$1
  shift
fi

shift没有任何争论意义的调用shift 1

循环遍历所有位置参数:

for arg do
  : do something with "$arg"
done

在您的情况下,您根本不需要循环,因为 whencat可以处理多个文件:

cat -- "$@"

shift这是没有位置参数时的调用测试:

$ for shell in /bin/*sh /opt/schily/bin/[jbo]sh; do
  printf '[%s]\n' "$shell"
  "$shell" -c 'shift'
done

输出:

[/bin/ash]
/bin/ash: 1: shift: can't shift that many
[/bin/bash]
[/bin/csh]
shift: No more words.
[/bin/dash]
/bin/dash: 1: shift: can't shift that many
[/bin/ksh]
/bin/ksh: shift: (null): bad number
[/bin/lksh]
/bin/lksh: shift: nothing to shift
[/bin/mksh]
/bin/mksh: shift: nothing to shift
[/bin/pdksh]
/bin/pdksh: shift: nothing to shift
[/bin/posh]
/bin/posh: shift: nothing to shift
[/bin/sh]
/bin/sh: 1: shift: can't shift that many
[/bin/tcsh]
shift: No more words.
[/bin/zsh]
zsh:shift:1: shift count must be <= $#
[/opt/schily/bin/bsh]
shift: cannot shift.
[/opt/schily/bin/jsh]
/opt/schily/bin/jsh: cannot shift
[/opt/schily/bin/osh]
/opt/schily/bin/osh: cannot shift

嗯,bash沉默,没有立场争论。使用占位符调用$0

"$shell" -c 'shift' _

做出了csh变体,并且 shilybsh也保持沉默。如果出现错误,zshcsh变体 和 schilybsh在报告错误后不会退出非交互式脚本。

答案3

您可以使用该shift命令来移动参数,丢弃第一个参数。这是一个例子:

arg1=$1
shift
for arg in "$@"; do
  cat "$arg"
done

答案4

您可以使用数组切片${@:2}

$ foo () { echo "The args are ${@:2}" ;}
$ foo spam egg bar
The args are egg bar

相关内容