質問し、答えが空であることを確認する一般的な関数を作成します。

質問し、答えが空であることを確認する一般的な関数を作成します。

私は多くの問題を解決するシェルアプリケーションを作成しており、これを何度も使用してき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.

おすすめ記事