$ 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
予想される結果です。残念ながら、ここでは動作しません。