ユーザーに文章を要求し、空白の干渉なしに保存します。

ユーザーに文章を要求し、空白の干渉なしに保存します。

ユーザーにいくつかのデータを要求するbash機能があります。名前、姓、誕生日などを検索してみました。

主に一文で表現されたデータです。

距離+番号を尋ねたとき。空白を処理できないため、関数は中断されます。

askForData 'Please enter your street and number' STREET

次のエラーが発生します。

Please enter your street and number: ExampleStreet 123
func_askForData: line 21: 123: command not found

文を受け入れるように機能をどのように拡張できますか?

ファイル:func_askForData

#!/bin/bash

# Usage askForData "Prompt for value" VARIABLE
# Prints out prompt and stores input in VARIABLE
# 
# Prompt is printed till non-empty input is made.

function askForData()
{
local PROMPT=${1}
eval local VAR_NAME=${2}

local CONTINUE=true
while ${CONTINUE}
    do
        read -p "${PROMPT}: " VAR_VALUE
        if [ -z "$VAR_VALUE" ]; then
            CONTINUE=true
        else
            CONTINUE=false
            eval ${VAR_NAME}="${VAR_VALUE}"
        fi
    done
}

追加情報

bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.

ベストアンサー1

使用

eval ${VAR_NAME}='"${VAR_VALUE}"'

を使用すると、通常、eval拡張は2倍になります。ステートメントに一度だけ拡張する必要がある場合は、通常、最初の拡張は何もしませんeval(引用符を除く)、2番目の拡張は主な操作を実行する方法で引用するのが最善です。この特定の例では、最初の拡張は次のようになります。

STREET="${VAR_VALUE}"

これは、2番目の拡張中に正しく実行されます。逆にしようとすると、一次拡張の結果が二次拡張でもそのまま維持されるという保証は難しいでしょう。

私はまた、最初eval(以前)がlocal VAR_NAME=${2}重複しているという印象を受けました。

おすすめ記事