スクリプトで最初のパラメータをスキップする方法

スクリプトで最初のパラメータをスキップする方法

Linux Pocket Guideには、スクリプト内のすべてのパラメータを確認する方法の良い例があります。

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

すべてのパラメータがテキストファイルであるスクリプトを作成しています。これらすべてのテキストファイルをリンクしてstdoutとして印刷しますが、最初のパラメータの内容は除外する必要があります。私の最初の方法は次のとおりです。

for arg in $@
do
   cat "$arg"

done

ただし、これには最初のパラメータが含まれており、前述のように、最初のパラメータを除くすべてのパラメータを印刷したいと思います。

答え1

shift次のコマンドを使用できます。

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

答え2

あなたはそれを使用することができます移動する組み込み機能は1つ以上の位置引数を削除しますが、まず引数の数を確認する必要があります。

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

catあなたの場合はいつでも複数のファイルを処理できるので、ループはまったく必要ありません。

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変奏もし、シャイbshも沈黙を守った。エラーが発生すると、var zshcshVariant、およびschilyはbshエラー報告後に非対話型スクリプトを終了しません。

答え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

関連情報