2012-05-22 49 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 
}