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
也保持沉默。如果出现错误,zsh
、csh
变体 和 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