2012-05-22 48 views
3

如何查找bash shell中鍵盤的用戶輸入?我想這將只是工作,Bash的scanf等價物?

int b; 

scanf("%d", &b); 

但它說

-bash:/Users/[name]/.bash_profile:行17:語法錯誤附近意外的標記` 「%d」 ,'

-bash:/Users/[name]/.bash_profile:line 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 
} 
+2

我很好奇 - 哪些文檔或其他上下文導致嘗試在shell腳本中使用C庫函數? –

+1

我是一個noob程序員,我從學習LUA開始,將它留下了一年,然後開始學習C,然後纔在今天開始嘗試學習bash的東西。 – Nightlock32

+0

你不需要聲明你的變量,或者'int b'可以被忽略,末尾的分號也可以被忽略。我建議從頭開始寫一些類似http://mywiki.wooledge.org/BashGuide的東西,而不是假設來自完全不同語言的語法將適用於bash。 –

回答

7

只需使用內置read

read -r b 

無需指定類型(根據%d),作爲變量不是在shell腳本類型,除非你跳過(不必要的)箍使它們如此;如果你想使用一個值作爲一個小數,那麼這是一個評估它的上下文的問題,而不是它被讀取或存儲的方式。

例如:

((b == 1)) 

...把​​$b爲小數,而

[[ $b = 1 ]] 

...做B和"1"之間的字符串比較

+0

爲什麼這不起作用?閱讀我的編輯它說在第19行(最後一行)意外} – Nightlock32

+0

@ Nightlock32代碼示例應該採取_exactly_作爲給定:'((b == 1))',而不是'(b == 1)' - 它需要_two_ parens才能使數學情境受到打擊。 –

2

儘管您可以在Bash中將變量聲明爲整數,但結果並不符合您的期望。一個非整數值將被轉換爲零,這可能不是你想要的。這裏是一個更防彈方式,以確保您收集的整數

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

當你想告知爲什麼值被拒絕的用戶,而不僅僅是再次提示這是特別有用。

+0

現在你只是檢查*字符串中的任何地方有一個整數*。如果你想確定它只包含*整數,你需要將它錨定:'^ [[:digit:]] + $' –

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 
}