bashで変数を定義するには、localキーワードを使用してください。

bashで変数を定義するには、localキーワードを使用してください。

私はbashスクリプトを学んでいますが、/usr/share/bash-completionの305行目でこれを見つけました:

local cword words=()

それは何をしますか?インターネット上のすべてのチュートリアルは単なる形式です。

local var=value

答え1

好きですがジョーダンの答え経験の浅いLinuxユーザーに、これらの問題を自分で処理する方法を示すことも同様に重要だと思います。

提案された方法は、Googleの検索結果ページに表示されている任意のページで回答を見つけるよりも高速で多様です。

まず、明示的なパスを入力しなくてもBashで実行できるすべてのコマンドは、./command2つのカテゴリに分けられます。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 likeWords=("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

便利なリンク:

関連情報