我必须检查特定的参数是否允许在脚本的shell参数中表示'java8‘,如果它存在,请删除它。另外,我希望将它存储在其他变量中,但希望从我的$*中删除它。
一个选项,我尝试检查arg是否存在使用getopts,但我不知道如何删除参数。
请注意- arg检查'java8‘的位置不知道我可以在任何地方
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
发布于 2022-07-12 18:43:43
也许是这样的?我假设你想除掉-f java8..。
#!/bin/bash
while (( $# )); do
if [[ $1 = "-f" ]] && [[ $2 = "java8" ]]; then
shift 2
continue
fi
args+=( "$1" )
shift
done
echo "${args[*]}"示例用法:
$ ./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发布于 2022-07-12 20:46:14
对于任何POSIX (不使用临时数组):从位置参数列表中删除-f的任何实例,然后是java8或-fjava8,同时计算被删除的选项的数量--变量found中有参数。
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语句所保护的内容。
https://unix.stackexchange.com/questions/709603
复制相似问题