如何从 $@ 中删除位置参数

kjo*_*kjo 19 shell shell-script arguments

基本上,我想-inf从参数列表中“提取”第一次出现。(其余参数将传递给不同的命令。)

我的脚本具有以下结构:

#!/bin/sh

<CODE>

for POSITIONAL_PARAM in "$@"
do

    <CODE>

    if [ "$POSITIONAL_PARAM" = '-inf' ]
    then
        <PLUCK $POSITIONAL_PARAM FROM $@>
        break
    fi

    <CODE>

done

<CODE>

some-other-command "$@"

# end of script
Run Code Online (Sandbox Code Playgroud)

有没有好的方法可以做到这一点?

顺便说一句,尽管我主要对适用于 的答案感兴趣,但我/bin/sh也对仅适用于/bin/bash.

cuo*_*glm 33

POSIXly:

for arg do
  shift
  [ "$arg" = "-inf" ] && continue
  set -- "$@" "$arg"
done

printf '%s\n' "$@"
Run Code Online (Sandbox Code Playgroud)

上面的代码甚至可以在 POSIX 之前的 shell 中工作,除了原始的 Almquist shell(阅读尾注)。将for循环更改为:

for arg
do
  ...
done
Run Code Online (Sandbox Code Playgroud)

保证在所有 shell 中工作。


另一个POSIX:

for arg do
  shift
  case $arg in
    (-inf) : ;;
       (*) set -- "$@" "$arg" ;;
  esac
done
Run Code Online (Sandbox Code Playgroud)

这一个,你需要删除第一个((pattern),使之在预POSIX壳工作。

  • 对于不熟悉的 `for arg do` 是 `for arg in "$@" 的简写成语;做`。这让我摔了大约 5 秒钟!有人可能会说后者更具可读性:) (5认同)