scanf相当于Bash?

时间:2012-05-22 00:11:27

标签: bash terminal scanf

如何在bash shell中查找键盘的用户输入?我以为这会起作用,

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   
}

3 个答案:

答案 0 :(得分:7)

只需使用read内置:

read -r b

不需要指定类型(根据%d),因为变量不会在shell脚本中输入,除非你跳过(不必要的)箍来制作它们;如果你想把一个值用作小数,那就是它所评估的上下文的问题,而不是它读取或存储的方式。

例如:

(( b == 1 ))

...将$b视为小数,而

[[ $b = 1 ]]

...在b和"1"之间执行字符串比较

答案 1 :(得分:2)

虽然您可以在Bash中将变量声明为整数,但结果将无法达到预期效果。非整数值将转换为零,这可能不是您想要的。这是一种更加防弹的方法来确保您收集整数:

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

当您想要通知用户为什么某个值被拒绝时,这非常有用,而不仅仅是重新提示。

答案 2 :(得分: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
}