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

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#-}"

関連情報