Bash 分配 $1 值

Bash 分配 $1 值
#!/usr/bin/bash
kill9="9"
kill15="15"

if [ $1 == $kill9  ]; then
   set -- "$1" "$kill9"
else
   set -- "$1" "$kill15"
fi

echo $1

如果我输入 -9,我希望 $1 变成 9;如果我输入 -15,我希望 $1 变成 15 上面的脚本是错误的。

我怎样才能这样做呢?

答案1

#!/usr/bin/bash
kill9="9"
kill15="15"

if [ "$1" = "-$kill9"  ]; then
  set -- "$kill9"
else
  set -- "$kill15"
fi

printf '%s\n' "$1"

答案2

我找到了使用 set 的解决方案

#!/usr/bin/bash
kill9="9"
kill15="15"

if [ $1 -eq $kill9 ]
then
set "9" 
else
set "15"
fi

echo $1

答案3

更改第一个位置参数,同时保持其他位置参数不变。

在 POSIX 中sh(因此也适用于bash所有现代的类似 Bourne 的 shell):

case $1 in
  (-9 || -15) shift; set -- "${1#-}" "$@"
esac

在 ksh 或最近的 bash 中(或zsh -o kshglob

if [[ $1 = -@(9|15) ]]; then
  shift; set -- "${1#-}" "$@"
fi

在 zsh 中,您可以简单地分配$1(或$argv[1])

[[ $1 = -(9|15) ]] && 1=${1#-}

(或argv[1]=${argv[1]#-}(( argv[1] = - $1 )))。


csh/中tcshzsh复制了位置参数也映射到数组的事实$argv):

if ($1:q == -9 || $1:q == -15) @ argv[1] = - $1

fish

if contains -- "$argv[1]" -9 -15; set argv[1] (math - $argv[1]); end

那里$argv 位置参数数组(没有$1$2...那里)。


rc(其中 的$1缩写$*(1)):

if (~ $1 -9) {shift; * = (9 $*)} else if (~ $1 -15) {shift; * = (15 $*)}

或者:

if (~ $1 -9 -15) {shift; * = (`{expr x$1 : 'x-\(.*\)'} $*)}

答案4

(不严格回答您的问题,但也许可以帮助您解决基本要求。)

另一种方法可能是在使用时去掉任何不需要的前导破折号

echo "arg 1: ${1#-}"

相关内容