私は多くの問題を解決するシェルアプリケーションを作成しており、これを何度も使用してきread -p "<my_question>" <myvar>
ました。問題は、答えが空であることを確認したいということです。だから私は空であるかどうかを尋ねて確認する一般的な関数を作成したいと思います。その場合、ユーザーが何かを提供するまで関数自体が再帰的に呼び出されます。変数名を「userdatabase」に「変更」すると、すべてが完全に実行されます。関数宣言と使用法に従ってください。
ask() {
read -p "$1" $2
if [[ -z $userdatabase ]]; then
echo Empty is not allowed
ask "$1" $2
else
echo $userdatabase
fi
}
ask "Provides the user database: " userdatabase
もちろん、私はアプリケーションが尋ねるすべての質問の変数名として "userdatabase"を使用したくありません。だから私は「動的」変数が必要であることに気づきました。思考をもう少しダイナミックにすると、次のようになります。
ask() {
read -p "$1" $2
if [[ -z $$var ]]; then
echo Empty is not allowed
ask "$1" $2
else
echo $$var
fi
}
ask "Provides the user database: " $var
ただし、ユーティリティを使用すると、SOMENUMBERvarなどのメッセージが表示されます。明らかに、私はシェルで「動的変数」を正しい方法で使用していないようです。
それでは、質問を受け取る関数とコマンドの変数で埋められる変数名をどのように生成しますかread -p
?
ベストアンサー1
最も簡単な場合から始めてください。関数を作成します。
f() { read -p "Type smthng: " $1 ; }
関数呼び出しと変数の割り当て$p入力を保存してから入力を表示します。 後ろに機能終了:
f p ; echo $p
「woof」の入力を求められ、echo $p
同じ内容が出力されます。
Type smthng: woof
woof
変数をチェックする1つの方法は、関数を別の関数にラップすることです。
g() { unset $1 ; until f "$1" && eval [ \"\$"$1"\" ] ; do echo wrong ; done ; }
難しい部分は、OPが変数名を関数パラメータとして割り当てようとすることです。「邪悪な」eval
分析する。変数を渡す名前関数引数はほとんど行われないし必要はありませんが、これを行う1つの方法を示します。
テストを受けてください:
g p ; echo $p
メッセージが表示されたら、をクリックするとEnterエラーメッセージが表示され、2番目のプロンプトで「foo」と入力します。
Type smthng:
wrong
Type smthng: foo
foo
OPコードのこの部分は機能しません。
if [[ -z $$var ]]; then
これは現在のPIDを返す変数$$
です。bash
man bash | grep -A 28 "Special Parameters$" | sed -n '1,3p;28,$p'
Special Parameters
The shell treats several parameters specially. These parameters may only
be referenced; assignment to them is not allowed.
$ Expands to the process ID of the shell. In a () subshell, it expands
to the process ID of the current shell, not the subshell.