ユーザーにいくつかのデータを要求する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}
重複しているという印象を受けました。