私はbashスクリプトを学んでいますが、/usr/share/bash-completionの305行目でこれを見つけました:
local cword words=()
それは何をしますか?インターネット上のすべてのチュートリアルは単なる形式です。
local var=value
答え1
好きですがジョーダンの答え経験の浅いLinuxユーザーに、これらの問題を自分で処理する方法を示すことも同様に重要だと思います。
提案された方法は、Googleの検索結果ページに表示されている任意のページで回答を見つけるよりも高速で多様です。
まず、明示的なパスを入力しなくてもBashで実行できるすべてのコマンドは、./command
2つのカテゴリに分けられます。Bash シェル組み込み関数そして外部コマンド。 Bash シェルの組み込みコマンドは Bash とともにインストールされ、Bash の一部ですが、外部コマンドは Bash の一部ではありません。これは、Bashシェルの組み込みが内部的に文書化されており、その文書がコマンドを介してman bash
呼び出さhelp
れる可能性がありますが、外部コマンドは通常、独自のマニュアルページに文書化されるか、ある種のフラグを採用するために重要です。-h, --help
外部コマンド:
$ type local
local is a shell builtin
コマンド名(でhelp type
)として使用される場合、コマンドがどのように解釈されるかを示します。ここでこれがlocal
シェル組み込み関数であることがわかります。別の例を見てみましょう。
$ type vim
vim is /usr/bin/vim
vim
ここではこれがシェル組み込みではなくに位置していることがわかります/usr/bin/vim
。しかし、時には、同じコマンドを外部コマンドとシェル組み込みとして同時にインストールすることができます。すべての可能性をリスト-a
するには追加してくださいtype
。例:
$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo
echo
ここでは、シェル組み込みコマンドと外部コマンドであることがわかります。しかし、ただ入力してecho
押すと、Returnシェルの組み込みがこのリストの最初に表示されるため呼び出されます。これらのバージョンはすべてecho
同じである必要はありません。たとえば、私のシステムにはタグが/usr/bin/echo
必要です--help
が、Bash組み込みシステムには必要ありません。
さて、これがシェル組み込みであることがわかったので、どのように機能するかをlocal
見てみましょう。
$ help local
local: local [option] name[=value] ...
Define local variables.
Create a local variable called NAME, and give it VALUE. OPTION can
be any option accepted by `declare'.
Local variables can only be used within a function; they are visible
only to the function where they are defined and its children.
Exit Status:
Returns success unless an invalid option is supplied, an error occurs,
or the shell is not executing a function.
最初の行に注意してくださいname[=value]
。そして[
その間の]
すべて任意に選択できる。これは、世界中の多くのマニュアルページや文書フォームで使用される一般的な規則です*nix
。しかし、あなたの質問から要求されたコマンドは完全に正当です。 Character は、...
前の引数を繰り返すことができることを意味します。以下では、この規則について読むこともできますman man
。
The following conventions apply to the SYNOPSIS section and can be used
as a guide in other sections.
bold text type exactly as shown.
italic text replace with appropriate argument.
[-abc] any or all arguments within [ ] are optional.
-a|-b options delimited by | cannot be used together.
argument ... argument is repeatable.
[expression] ... entire expression within [ ] is repeatable.
最後に、Linuxでさまざまなコマンドがどのように機能するのかをより簡単に理解できることを願っています。
答え2
あなたの模範
local cword words=()
cword
現在の関数範囲でスカラー変数と空の配列を定義します。words
local
注実行環境が値を「表示」できないように、現在定義されている関数内でのみ範囲を持つように変数を宣言するだけです。local
機能外では使用できません。はい
func() {
nonlocal="Non local variable"
local onlyhere="Local variable"
}
func
echo $nonlocal
echo $onlyhere
出力:非地域変数
したがって、$onlyhere
関数の範囲外では表示されません。
答え3
キーワードはlocal
複数の変数を使用できます。変数値の提供はオプションです。あなたの例では、2つの変数を宣言cword
しますwords
。変数words
に空の配列が割り当てられます。
答え4
UnixとLinux SEのユーザー/ @alex-santos、こんにちは。この質問に対する完全な答え、包括的な答えはここにあります!
質問1
local cword words=()
それは何をしますか?
回答1
」local キーワードには複数の変数を使用できます。変数値の提供はオプションです。あなたの例では、cwordとwordという2つの変数を宣言します。「(@jordanmに感謝!)
SC2155は別々に宣言して割り当てる必要があることに注意してください。
つまり、パラメータ間で複数の宣言オプションを使用することを除いて、まだ機能します。また、宣言されたパラメータはすべての変数に適用されます(この場合は-i)。ねえ1行に複数のローカル変数を宣言できますか?
変数words
に空の配列が割り当てられます。変数がlocal
アクセスレベルに設定されているためシェル関数で宣言する必要があります。。変数はlocal
エラーを発生させることなく、同じ名前のグローバル変数をオーバーライドします。ローカル変数は、関数の実行中にグローバル変数の値のみを置き換えます。グローバル変数の値は、オーバーライド関数の範囲外で管理される値です。
また、関数の範囲内でのみ宣言され、まだグローバルに宣言またはインポートされていない変数には、このケースを説明するいくつかの既存の回答の下のコードと、以下のコードで説明されている他のケースに対処するために追加したコードが表示されます。
*以下の最初の関数/ローカル範囲の例のケースの1つを説明した@electric-coffee、@Otheusに感謝します。*
シェル関数を使用して、すべてのアクセス権と範囲の配列を持つローカル/グローバル変数を表示します。
ケース1.ローカルスコープが存在しないため、グローバルスコープにアクセスできません。
exampleFunction() {
nonlocal="Non local variable"
local localToExampleFunctionOnly="Local variable"
}
# Prints "Non local variable".
echo $nonLocal
ケース2.グローバル範囲変数を関数範囲のローカル変数値で上書きします。
# Set the globally accessible variable value.
globalVariable="Globally accessible variable."
# Prints "Globally accessible variable." to the console from within
# the global context.
echo $globalVariable;
exampleFunction() {
globalVariable="Locally accessible variable."
# Prints "Locally accessible variable."
echo $globalVariable;
}
# Call function, printing "Globally accessible variable." to the console from within
# the global context.
exampleFunction
# Prints "Globally accessible variable." to the console
# from within the global runtime environment (the original value set to globally accessible scope).
echo $globalVariable
Case 3. 関数範囲で参照するグローバル範囲変数がグローバル範囲で変更された後、2 番目の関数範囲から出力されます。
# Set the globally accessible variable value.
globalVariable="Globally accessible variable."
# Prints "Globally accessible variable." to the console from within
# the global context.
echo $globalVariable
exampleFunction() {
# Prints "Globally accessible variable." to the console
# from within the function scope context.
echo $globalVariable;
}
# Call function the first time
exampleFunction
# Prints "Globally accessible variable." to the console
# from within the global runtime environment.
echo $globalVariable
# Update the globally accessible variable to a new value.
globalVariable="That's all the cases for scoping I can think of..."
# Prints "That's all the cases for scoping I can think of..." to the
# console from within the global context.
echo $globalVariable;
# Call function the last time, now that the value has been updated
# from global and local scope.
# Prints "That's all the cases for scoping I can think of..."
# from the `exampleFunction`.
# Prints "That's all the cases for scoping I can think of..." to the
# console from within the function scoped context, re-referencing
# the updated global value and printing it to the terminal's output.
echo $globalVariable
関数のスコープを、「外部」環境の副作用なしに実行中にローカル変数を変更または参照できるコードスペースとして考えてください。
要約すると、words=()
これはこのシェルスクリプトで設定された2番目のローカル変数であり、構文上の理由でその型はArrayですwords=()
。この()
セクションは、宣言後にアクセスできる空の配列で初期化されます$words
。$words[$elementNumericIndex] and set during initialization like
Words=("bob" "john" "steve") Words[0]="bob"` によるor
アクセスと要素 。
*これはbashで使用するための完全な文書です。nixシェル変数(設定、アクセスなど)。
https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_10_02.html
質問2
インターネット上のすべてのチュートリアルは単なる形式です。
local var=value
回答2
すでに知っていますが、これはKey-Value変数の関係を維持するためにより一般的に使用される単一値->変数割り当てであるため、コードの読みやすさが向上し、重複が減り、参照値が再宣言されるとパフォーマンスが向上します(Duplicate値のハードコーディング)、ベストプラクティスを奨励し、重複したハードコーディングバージョンとおなじみの名前の変数(また、最も近代的な変数)から値を読み取ったり設定/宣言したりするときの「太った指」のリスクを軽減します。間違ったIDEやエディタでもプラグインをサポートしています。または、デフォルトでは宣言後に変数を自動補完する機能があります(範囲内にあり、アプリケーションを作成するときのカーソル位置によって異なります)。
抽象的な
OP質問に対する完全で簡潔な回答を提供するために、このスレッドで提供されている素晴らしい回答のいくつかを組み合わせました。
私はこれを偶然発見し、OPの答えに完全に答える最も正確で簡潔な方法が@jordanm、@electric-coffee、@arkadiusz-drabczykに散らばっていることに気づきました(ローカル端末マニュアルから直接Guide us to good応答出力)宣言機能範囲変数の使用に関するOPの質問を解決しますlocal
。
local cword words=()
local var=value
便利なリンク: