#!/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
/中tcsh
(zsh
复制了位置参数也映射到数组的事实$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#-}"