web-dev-qa-db-ja.com

$ 1変数の設定を解除できますか?

$ 1変数の設定を解除することは可能ですか?そうでない場合、manで説明されている場所を見つけることができません。

[root@centos2 ~]# set bon jour
[root@centos2 ~]# echo $1$2
bonjour
[root@centos2 ~]# unset $1
[root@centos2 ~]# echo $1$2
bonjour
[root@centos2 ~]#

編集:

最後に、これが私が人間で見つけたものです(man set option double-dash)すべての位置パラメータを空にします(そして、男性は単語「unset」を使用しました!)

このオプションの後に引数がない場合、定位置パラメーターは設定解除されます。

[root@centos2 ~]# echo $1

[root@centos2 ~]# set bon jour
[root@centos2 ~]# echo $1$2
bonjour
[root@centos2 ~]# set --
[root@centos2 ~]# echo $1$2

[root@centos2 ~]#

それを理解するのに役立つのは、@ Jeff Schallerの回答です。

7
Pozinux

設定を解除することはできませんが、$2$1にシフトできます。

$ set bon jour
$ echo "$1$2"
bonjour

$ shift
$ echo "$1$2"  # $2 is now empty
jour

shiftは、すべての位置パラメーターを1ステップ下にシフトします。たとえば、コマンドライン解析ループ(つまりnotgetopt/getoptsを使用)で、$1の値を繰り返し調べながら、各反復で位置パラメータをシフトします。位置パラメータの設定を解除することは珍しいことです。

ちなみに、unsetは値ではなく変数nameをとるため、unset $1は実際には変数bonを設定解除します(以前に設定されていた場合) )。

20
Kusalananda

次のようにパラメータを再設定することにより、できます。

$ set -- 1 2 3 4
$ printf -- "->%s<-\n" "$@"
->1<-
->2<-
->3<-
->4<-
$ set -- "" "${@:2}"
$ printf -- "->%s<-\n" "$@"
-><-
->2<-
->3<-
->4<-
15
Jeff Schaller

すべての正しい技術的回答に加えて、あなたの質問には論理的な欠陥があることに気づくはずです。 $ 1、$ 2、...は、$ A、$ B、...のような名前付き変数の値ではなく、値のリストの1番目、2番目、...の値です。多分リストの最初の値は空の文字列ですが、私のリストに最初の値がないと言っても意味がありません。リストに最初の値がない場合、リストにはまったく値がないため、リストは空です。

したがって、リストの最初の値を「設定解除」することはできません。リストから削除できるのは最初の値のみです。次に、リストの前の2番目の値がリストの最初の値になり、前の3番目が2番目の値になります。これはまさにシフト演算子が行うことです。

6
miracle173

いいえ、少なくとも直接ではありません。この構文は機能するはずですが、エラーが発生します。

$ set bon jour
$ echo $1 $2
$ unset 1
1: not a valid identifier

unset $variableは通常間違いであり、unset variableは意図したものでした。残念ながら、ここでは機能しません。

4
Joshua