forループから最後の引数/パラメータを除外

forループから最後の引数/パラメータを除外

最後の引数を除くすべての引数/引数を繰り返すシェルスクリプトを作成したいと思います。これが私が今まで持っているものです:

for i in $@
do
      echo "$i"
done

これは./script.shコマンドの後のすべての引数を表示するのに効果的ですが、最後の引数または私が選択した引数を無視する方法があります(たとえば、1つの場合は常に3番目の引数を無視)。 。明らかに、今は最後の引数/パラメータがより心配です。

私はスクリプトが初めてなので、この回答を含む他の投稿があればお詫び申し上げます。私は何かに新しいものがあることは、一般的にあなたが探しているものを適切に要求する方法がわからないことを意味することを発見しました。

どんな助けでも大変感謝します!

答え1

パラメータを維持する必要がない場合

while (( $# > 1 ))
do
  echo "$1"
  shift
done

位置パラメータを変更せずに維持するには、数を維持するだけです。

SKIP=$#

let x=1

for i
do
  if (( x != SKIP ))
  then
    echo "$i"
  fi
  let x=x+1
done

答え2

CentOSにはBashがある可能性があるため、それを使用できる場合は配列の一部を実行できます。

for x in "${@:1:$# - 1}" ; do 
    echo do something with "$x"
done

${@:n:m}シンボルmnumberで始まる位置パラメータを取得しますn。我々は合計数を取り、$#最後のパラメータを無視するために1を引く。オフセットと長さは、のように算術式で処理されるため、$((...))Stéphaneが以下に説明するようにそこで算術を実行できます。配列索引付けは通常0から始まりますが、$@0から始まる場合は$0inからシェル名が導入されますが、これは私たちが望むものではありません。

引数がもはや分割されないように、$@or式を引用する可能性が高いです。${@:n:m}

答え3

skip_last() {
   p=$1; shift

   for i
   do
      set ${1+"$@"} "$p"; p=$1; shift
   done

   for i
   do
      # do something with i when i != last now
      echo "$i"
   done
}
# and then...
skip_last "a" "b" "c" "d" "e"

答え4

あなたはそれを使用することができますforループ変数を、、、...iに設定して使用してください。12n-1間接拡張$1、、$2...、に変更します$n-1

for ((i=1; i<$#; i++)); do
    echo "${!i}"
done

関連情報