首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标识是否存在并从shell args中删除特定的参数。

标识是否存在并从shell args中删除特定的参数。
EN

Unix & Linux用户
提问于 2022-07-12 17:55:29
回答 2查看 153关注 0票数 1

我必须检查特定的参数是否允许在脚本的shell参数中表示'java8‘,如果它存在,请删除它。另外,我希望将它存储在其他变量中,但希望从我的$*中删除它。

一个选项,我尝试检查arg是否存在使用getopts,但我不知道如何删除参数。

请注意- arg检查'java8‘的位置不知道我可以在任何地方

代码语言:javascript
复制
while getopts "f:" flag
do
     case $flag in
         f)
           echo $OPTARG
           ;;
     esac
done
echo $*
~

所以基本上当我调用-

./test.sh arg1 arg2 -f java8 arg3

在getopts块执行之后,剩余的arg将是

arg1,arg2,arg3

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2022-07-12 18:43:43

也许是这样的?我假设你想除掉-f java8..。

代码语言:javascript
复制
#!/bin/bash

while (( $# )); do
    if [[ $1 = "-f" ]] && [[ $2 = "java8" ]]; then
        shift 2
        continue
    fi

    args+=( "$1" )
    shift
done

echo "${args[*]}"

示例用法:

代码语言:javascript
复制
$ ./argtest.sh one two three
one two three
$ ./argtest.sh one two -f java8 three four
one two three four
$ ./argtest.sh -f java8 -f foo -f bar
-f foo -f bar
票数 0
EN

Unix & Linux用户

发布于 2022-07-12 20:46:14

对于任何POSIX (不使用临时数组):从位置参数列表中删除-f的任何实例,然后是java8-fjava8,同时计算被删除的选项的数量--变量found中有参数。

代码语言:javascript
复制
skip=0 found=0
for arg do
    case $1 in
        -f)
            if [ "$2" = java8 ]; then
                skip=2
                found=$(( found + 1 ))
            fi
            ;;
        -f*)
            if [ "$1" = -fjava8 ]; then
                skip=1
                found=$(( found + 1 ))
            fi
    esac

    if [ "$skip" -eq 0 ]; then
        set -- "$@" "$1"
    else
        skip=$(( skip - 1 ))
    fi
    shift
done

if [ "$skip" -eq 1 ]; then
    set -- "$@" -f
    found=$(( found - 1 ))
fi

printf 'Args: %s\n' "$*"
printf 'Found = %d\n' "$found"

上面的循环与位置参数的初始数一样频繁地迭代。

如果第一个位置参数是-f,则测试第二个位置参数,以确定它是否为java8。如果测试是真的,那么我们需要跳过这两个参数,因此skip计数器被设置为2。我们还增加了found以表示我们已经找到了-f java8的另一个实例。

如果第一个位置参数是-fjava8,那么我们需要跳过这个单个参数,因此skip计数器被设置为1。我们还增加found来表示我们已经找到了-fjava8的另一个实例(与查找-f java8相同)。

case语句之后,除了将skip计数器和shift从第一个位置参数(如果skip为非零)之外,什么都不做。如果skip为零,则在调用shift之前,将第一个位置参数移到列表的末尾,从而有效地允许保留的参数在删除不需要的参数的同时在列表中循环。

由于我们以循环方式使用位置参数列表,如果是-f,则会丢失最后一个参数,而第一个参数是java8。这就是最后一条if语句所保护的内容。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/709603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档