如何从$ @删除位置参数


13

基本上,我想-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

有什么好方法吗?

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


@cuonglm:我已经恢复为伪代码的原始形式;以我的经验,每当我简化图片太多时,我都会得到适用于过于简化情况的答案,但不适用于实际情况。
kjo

Answers:


20

POSIXly:

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

printf '%s\n' "$@"

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

for arg
do
  ...
done

保证可以在所有外壳中正常工作。


另一个POSIX:

for arg do
  shift
  case $arg in
    (-inf) : ;;
       (*) set -- "$@" "$arg" ;;
  esac
done

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


谢谢。该论点循环技术非常好。它具有额外的好处,它使得检查当前参数之后的参数变得非常容易(因为它就位于其中$1)。该属性在我正在做的事情中派上了用场。另外,感谢您提醒我,循环in "$@"; 顶部的位for是不必要的。这是我以前见过的东西,但我倾向于忘记它。关于您在Almquist Shell上的评论,该消息do 是否必须出现在下一行,还是可以for arg; do使用?
kjo

1
for arg; do在阿尔姆奎斯特(Almquist)贝壳中工作
cuonglm '16

3
对于初学者来说,for arg do是一个速记习语for arg in "$@"; do。那摔了我大约5秒钟!有人可能会说后者更具可读性:)
starfry

0

在尝试解决类似问题时,我发现了这个问题,但是我想处理所有非选项参数(不是以开头的参数-),直到任何接收到的--分隔符。我只想提取已处理的参数,然后按提供的顺序将其余参数留在原处。

这是我想出的。

parse=true
for arg do
  [ "$arg" == '--' ] && parse=false
  shift
  if $parse && [ "${arg:0:1}" != '-' ]
  then
    echo handling $arg
  else
    set -- "$@" "$arg"
  fi
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.