2011-09-10 1 views
0
#!/bin/bash 

testFunction() { 
read -p "Question" $1 
echo $1 
} 

testFunction foo 

私の意図は、ユーザー入力をエコーする代わりに、ユーザー入力を変数の引数に代入してエコーアウトすることです(foo)。Bashスクリプト変数ではない文字列

私はそうのようなBash indirectionを使用することができますこれを回避するために実現:いないすべての言語は、変数間接を持っている(と私は新しい上に移動されますので、

#!/bin/bash 

testFunction() { 
read -p "Question" $1 
echo ${!1} 
} 

testFunction foo 

しかし、私はこの方法を使用して避けることを好むだろう言語はすぐに十分です)。それが変数であるかのようにfooを見ることができる他の方法はありますか?ありがとう。

+0

他の言語がbashで使用できる他の形式のインダイレクションをサポートすると本当に思いますか? –

+0

もしそうでなければ、この問題はどのように別の言語で解決さ​​れるでしょうか? –

+0

何がこのすべてのポイントですか?なぜあなたはそれをやっていますか? –

答えて

2

それを構築する様は、として文字列を解釈することが可能です変数名。 Pythonで

eval echo \$$foo 

:bashでこれが不可能であるevalが不足しているほとんどの言語で

from __future__ import print_function 
eval ("print (" + foo + ")") 

。あなたはeval

testFunction() { 
    eval 'read -p "Enter Y or N: " '$1 
    eval 'echo $'$1 
} 

testFunction foo 

しかしevalでこれを行うことができます

+0

Pythonは実際に私が学ぶ次の言語なので、入力いただきありがとうございます。 –

+1

しかし、あなたはそれに関係なく、Pythonでそれをやりません。あなたは辞書を使うでしょう。 –

0

これは私が(あなたのコメントに基づいて)どうなるのかです:evalを持っている任意の言語で

testFunction() { 
    read -p "yes or no? [YynN] " bla 
    if [ "$bla" = 'Y' -o "$bla" = 'y' ]; then 
     return 0 
    fi 
    return 1 
} 

if testFunction; then 
    echo "it was yes" 
fi 

または

testFunction() { 
    read -p "yes or no? [YynN] " bla 
    if [ "$bla" = 'Y' -o "$bla" = 'y' ]; then 
     echo 1 
    else 
     echo 0 
    fi 
} 

foo=`testFunction` 
echo $foo 
+0

固定変数(bla)を持つのとは対照的に、ユーザー入力を格納する変数readを動的に定義する必要があります。 –

+1

あなたはまだ間違った場所でそれをやろうとしています。あなたが**インダイレクションを使用しなければならない関数でそれをやりたいのであれば。 –

+1

接頭辞として、この 'if ['構造体よりも 'case'を使って条件式をよりエレガントにすることができます。 – tripleee

0

は軽く、使用するツールではありません。あなたがやっていることはおそらく狂っているでしょう。あなたは、その値が質問に答えている、あなたがする必要はありません。この方法では、後で$fooを再確認し、この

testFunction() { 
    read -p "Enter Y or N: " bar 
    case "$bar" in 
     [YyNn]) return 0 ;; 
    esac 
    return 1 
} 

testFunction && foo=valid 

のようなアプローチを使用しなければならない「有効な入力ましたか?」

ynかどうかに基づいて実際に何か違うことをしたいと思うかもしれませんが、これは "機能から変数を動的に作りましょう"というナンセンスです。その場合、あなたは

testFunction() { 
    read -p "Enter Yes or No: " bar 
    case "$bar" in 
     [Yy][Ee][Ss]|[Yy]) printf y ;; 
     [Nn][Oo]|[Nn]) printf n ;; 
    esac 
} 

foo=$(testFunction) 

これはevalバージョンと機能的に似ているような何かを行うことができますが、それはあなたが唯一のfooに値を知ら得ることを保証します。後でfooの値をテストできます。

if [ -z "$foo" ] ; then 
     echo invalid input 
elif [ "$foo" = "y" ] ; then 
     echo answered yes 
elif [ "$foo" = "n" ] ; then 
     echo answered no 
fi 

可能なすべての値が既に分かっているので、このコードを単純にしておくことができます。

+0

yesを0、noを1と返すほうが意味があります。無効な入力をループするかもしれませんが、それはアプリケーションに大きく依存します。再利用可能な関数の場合はオプションを指定してください。 – tripleee

+0

@トライプルー:すべての点で同意しましたが、私はこのように推測されるような人工的な例の完全性と正確さの価値について疑問を呈します。より明確な要求があれば、私はより良い答えを提供するだろう。 – Sorpigal

関連する問題