[解決済み] シェルスクリプトで呼び出された関数から値を返す
2022-04-25 03:56:27
質問
シェルスクリプトで呼び出した関数の値を返したいのですが、どうすればいいですか?もしかしたら、構文を間違えているかもしれません。グローバル変数を使おうとしました。しかし、それもうまくいきません。コードは以下の通りです。
lockdir="somedir"
test() {
retval=""
if mkdir "$lockdir"
then # Directory did not exist, but it was created successfully
echo >&2 "successfully acquired lock: $lockdir"
retval="true"
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
retval="false"
fi
return retval
}
retval=test()
if [ "$retval" == "true" ]
then
echo "directory not created"
else
echo "directory already created"
fi
解決方法は?
Bashの関数は、あなたが望むような文字列を直接返すことはできません。できることは3つ。
- 文字列をエコーする
- 終了ステータス(文字列ではなく数値)を返す
- 変数の共有
これは他のいくつかのシェルにも当てはまります。
それぞれのオプションのやり方は、以下の通りです。
1. エコー文字列
lockdir="somedir"
testlock(){
retval=""
if mkdir "$lockdir"
then # Directory did not exist, but it was created successfully
echo >&2 "successfully acquired lock: $lockdir"
retval="true"
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
retval="false"
fi
echo "$retval"
}
retval=$( testlock )
if [ "$retval" == "true" ]
then
echo "directory not created"
else
echo "directory already created"
fi
2. 終了ステータスを返す
lockdir="somedir"
testlock(){
if mkdir "$lockdir"
then # Directory did not exist, but was created successfully
echo >&2 "successfully acquired lock: $lockdir"
retval=0
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
retval=1
fi
return "$retval"
}
testlock
retval=$?
if [ "$retval" == 0 ]
then
echo "directory not created"
else
echo "directory already created"
fi
3. シェア変数
lockdir="somedir"
retval=-1
testlock(){
if mkdir "$lockdir"
then # Directory did not exist, but it was created successfully
echo >&2 "successfully acquired lock: $lockdir"
retval=0
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
retval=1
fi
}
testlock
if [ "$retval" == 0 ]
then
echo "directory not created"
else
echo "directory already created"
fi
関連
-
Linuxシェルプログラミングのエラー "bad substitution "の解決法
-
シェルスクリプティングユーティリティ関数 Module 1
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] LinuxのシェルスクリプトでYes/No/Cancelの入力を促すにはどうしたらいいですか?
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
-
[解決済み] シェルスクリプトでYYYY-MM-DD形式の日付にする
-
[解決済み] シェルスクリプトでブール変数を宣言して使用するにはどうすればよいですか?
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] シェルスクリプトで部分文字列を別の文字列に置き換える
-
[解決済み] 整数の合計を1行に1つずつ表示するシェルコマンド?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] date: 余分なオペランド %d' エラー
-
linuxのbashで引数が多すぎる問題の解決法
-
シェルスクリプト、判定文エラー [: 引数が多すぎる
-
シェルエラーの解決:シンタックスエラー:予期しないファイルの終了
-
[解決済み] シェルスクリプトのシンタックスエラー。予期しないファイルの終了[重複]。
-
[解決済み] Bash関数にパラメータを渡す
-
[解決済み】Bash関数の戻り値
-
[解決済み】LinuxのシェルスクリプトからYAMLファイルをパースする方法は?
-
[解決済み] zshでALT+LeftArrowKeyの解決策を探しています。
-
[解決済み] Ansibleで複数行のシェルスクリプトを実行する方法