[解決済み] bashで関数内のグローバル変数を変更する方法は?
2022-06-27 21:13:03
質問
これを使って仕事をしています。
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
以下のようなスクリプトがあります。
#!/bin/bash
e=2
function test1() {
e=4
echo "hello"
}
test1
echo "$e"
どちらが返すか。
hello
4
しかし、関数の結果を変数に代入すると、グローバル変数が
e
は変更しない。
#!/bin/bash
e=2
function test1() {
e=4
echo "hello"
}
ret=$(test1)
echo "$ret"
echo "$e"
リターンです。
hello
2
を聞いたことがあります。
evalの使い方
にて行いました。
test1
:
eval 'e=4'
でも同じ結果です。
なぜ修正されないのか、説明していただけませんか?どのように私は
test1
関数のエコーを
ret
で、グローバル変数も変更しますか?
どのように解決するのですか?
コマンドの代入を行う場合(すなわち
$(...)
構成) を使用すると、サブシェルが作成されます。サブシェルは親シェルから変数を継承しますが、これは一方向にしか働きません。サブシェルはその親シェルの環境を変更することはできません。
あなたの変数
e
はサブシェル内で設定されますが、親シェルでは設定されません。サブシェルからその親シェルに値を渡すには 2 つの方法があります。まず、stdoutに何かを出力し、それをコマンド置換で取り込む方法です。
myfunc() {
echo "Hello"
}
var="$(myfunc)"
echo "$var"
上記のように出力されます。
Hello
0から255の範囲の数値の場合は
return
を使って、その数値を終了ステータスとして渡します。
mysecondfunc() {
echo "Hello"
return 4
}
var="$(mysecondfunc)"
num_var=$?
echo "$var - num is $num_var"
これは出力されます。
Hello - num is 4
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで文字列をデリミターで分割するには?
-
[解決済み] Bashでコマンドの出力に変数を設定するにはどうすればよいですか?
-
[解決済み] Bashで変数が設定されているかどうかを確認する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] MacOSのbashターミナルでexport PS1="\u[\033[m]@[\033[32m]\h:\[\033[33;1m]\w[\033[m]\$" は何を意味していますか?
-
[解決済み] Bashでの動的な変数名
-
[解決済み] systemd サービス 203/EXEC の失敗 (そのようなファイルやディレクトリがない) を修正する。
-
[解決済み] zip警告 - 名前が一致しない
-
[解決済み] Bash/Terminalで複数行の環境変数を書き出す方法 例: RSA秘密鍵
-
[解決済み] docker alpine /bin/sh script.sh not found
-
[解決済み] grepの出力に含まれる重複を削除する
-
[解決済み] bash file returns unexpected token `$'dottpr''
-
[解決済み] AWS CLIのプロファイルを一時的に切り替えるには?
-
[解決済み] Bash - "fi ;;" の使い方は?