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

$ 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()で見つけたものは次のとおりですman set option double-dash(manは「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の答えはこれを理解するのに役立ちました。

答え1

位置パラメータを設定解除することはできませんが、そのパラメータ$2に移動して以前の$1値を効果的に削除することはできます$2

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

$ shift
$ echo "$1$2"  # $2 is now empty (i.e. "unset" or "not set")
jour

このshiftコマンドは、すべての位置パラメーターを1レベル下げます。コマンドライン解析ループ(これはいいえgetopt/)を使用すると、getopts通常、値を繰り返しチェックしながら、繰り返しごとに位置パラメータが移動されます$1。位置パラメータを設定解除したい場合はまれです。

ところで、unset変数を受け入れます名前、値ではなくunset $1変数がbon以前に設定されている場合は、実際に設定が解除されます。

答え2

あなたはできますパラメータを「空の文字列」の後に「2番目のパラメータから始まるパラメータ」にリセットします。

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

答え3

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

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

答え4

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

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

unset $variable通常はエラーですが、unset variable予想される結果です。残念ながら、ここでは動作しません。

関連情報