#!/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様シェルにも適用されます):
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#-}"