最後の引数を除くすべての引数/引数を繰り返すシェルスクリプトを作成したいと思います。これが私が今まで持っているものです:
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}
シンボルm
numberで始まる位置パラメータを取得しますn
。我々は合計数を取り、$#
最後のパラメータを無視するために1を引く。オフセットと長さは、のように算術式で処理されるため、$((...))
Stéphaneが以下に説明するようにそこで算術を実行できます。配列索引付けは通常0から始まりますが、$@
0から始まる場合は$0
inからシェル名が導入されますが、これは私たちが望むものではありません。
引数がもはや分割されないように、$@
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"