4

bash シェルでキーボードからのユーザー入力を探すにはどうすればよいですか? これだけでうまくいくと思っていたのですが、

int b;

scanf("%d", &b);

しかし、それは言います

-bash: /Users/[name]/.bash_profile: 17 行目: 予期しないトークン `"%d" 付近で構文エラーが発生しました。

-bash: /Users/[name]/.bash_profile: 17行目: `scanf("%d", &b);'

編集

backdoor() {
   printf "\nAccess backdoor Mr. Fletcher?\n\n"
   read -r b
   if (( b == 1 )) ; then
     printf "\nAccessing backdoor...\n\n"
   fi   
}
4

3 に答える 3

7

read組み込みを使用するだけです:

read -r b

タイプを指定する必要はありません (のように%d)。変数は、(不必要な) フープをジャンプしてそうしない限り、シェル スクリプトに入力されないためです。値を 10 進数として使用する場合は、それが評価されるコンテキストの問題であり、読み取りまたは格納の方法ではありません。

例えば:

(( b == 1 ))

...$b小数として扱いますが、

[[ $b = 1 ]]

... b と の間の文字列比較"1"を行います。

于 2012-05-22T00:14:54.153 に答える
2

Bash では変数を整数として宣言できますが、結果は期待どおりにはなりません。整数以外の値はゼロに変換されますが、これはおそらくあなたが望むものではありません。整数を確実に収集するためのより確実な方法を次に示します。

while read -p "Enter integer: " integer; do
    [[ "$integer" =~ [[:digit:]]+ ]] && break
    echo "Not an integer: $integer" >&2
done

これは、再プロンプトを表示するのではなく、値が拒否された理由をユーザーに通知したい場合に特に便利です。

于 2012-05-22T00:19:29.337 に答える
0

Cのような構文とBashの構文を組み合わせようとしています。

backdoor() {

    printf '\n%s\n\n' 'Access backdoor Mr. Fletcher?'

    read -r b

    if ((b == 1))
    then
        printf '\n%s\n\n' 'Accessing backdoor...'
    fi
}
于 2012-05-22T00:32:16.400 に答える