localキーワードを使用したbashの変数定義


33

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

local cword words=()

それは何をするためのものか?オンラインのすべてのチュートリアルはただの形式です

local var=value

回答:


92

私はjordanmの回答が好きですが、経験の浅いLinuxユーザーにそのような質問に自分で対処する方法を示すことも同様に重要だと思います。

推奨される方法は、Googleの検索結果ページに表示されるランダムページで回答を探すよりも高速で多用途です。

まず、中に実行できるすべてのコマンドBashのような、それに明示的なパスを入力せずに./command2つのカテゴリに分けることができますBash shell builtinsexternal commandsBash shell builtinsと一緒にインストールされ、Bashその一部であるexternal commandsが、一部ではないBash。これは重要です。Bash shell builtins内部に文書化されてman bashおり、それらの文書化はhelpコマンドで呼び出すこともできますexternal commandsが、通常は独自に文書化されているmanpagesか、-h, --helpフラグを立てます。コマンドがあるかどうかを確認しますBash shell builtinexternal command

$ type local
local is a shell builtin

how command would be interpreted if used as a command name(からhelp type)が表示されます。ここでは、それは見ることができlocalていますshell builtin。別の例を見てみましょう:

$ type vim
vim is /usr/bin/vim

ここでvimは、shell builtinそれがにある外部コマンドであることがわかり/usr/bin/vimます。しかし、時々 、同じコマンドが両方としてインストールすることができたexternal commandとするshell builtinと同時に。に追加-atypeて、すべての可能性をリストします。例:

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo

ここで、それがechoa shell builtinとanの両方であることがわかりexternal commandます。ただし、このリストの最初に表示されるので、入力echoして押しReturnただけの場合はshell builtin呼び出されます。これらのバージョンはすべてecho同じである必要はありません。たとえば、私のシステムで/usr/bin/echo--helpフラグを取りますが、a builtinは取りません。

さて、それ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]。すべての間[]され、オプション。これmanpagesは、*nix世界の多くの形式のドキュメントで使用されている一般的な規則です。そうは言っても、質問で尋ねたコマンドは完全に合法です。また、...文字は、前の引数を繰り返すことができることを意味します。この規則については、一部のバージョンでも読むことができます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.

そのため、1日の終わりに、さまざまなコマンドがどのように機能するかを理解しやすくなることを願っていますLinux


5
とてもいい答えです。私はそれを読んでいて、初心者が配列の割り当てがコードから何であるかを自分自身で発見できるかを期待していますが、var=()あなたが探しているものの名​​前を知らなくても理解するのは少し難しいと思います。;)
ワイルドカード

非bashシェルもサポートしlocalていますか?
-palswim

2
私はあなたの答えに
賛成

@Wildcard配列はコマンドではなくbash構文であるため、で定義されていman bashます。そこに入ったら、入力/Arrays$して配列のセクションにジャンプします。($後の部分Arraysは、セクションへのテキスト内の参照を循環させないようにするためのものです。)そこからf、ページbを進めたり戻したりするように入力できます。入力qしたら、入力してmanページを終了します。
テイラーエドミストン

また、help引数を指定せずに実行すると、詳細を確認したい場合はすべてのbashビルトインがリストされます。
テイラーエドミストン

29

localキーワードは複数の変数を取ることができます。変数に値を提供することはオプションです。この例では、2つの変数とcwordを宣言していますwordswords変数は、空の配列が割り当てられます。


18

local現在定義されている関数でのみスコープを持つように変数を宣言するだけなので、メインの実行環境は値を「見る」ことができません。local関数の外部では使用できません。例

func() {
   nonlocal="Non local variable"
   local onlyhere="Local variable"
}
func
echo $nonlocal 
echo $onlyhere

出力:非ローカル変数

その$onlyhereため、関数のスコープ外では見えませんでした。


この答えは、誰がすぐに理解する必要があるのか​​より理にかなっています。
アレックスラージカリアムーシー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.