Bash的scanf等价物?

Bash的scanf等价物?,bash,terminal,scanf,Bash,Terminal,Scanf,如何从bashshell中的键盘查找用户输入?我在想这会管用的 int b; scanf("%d", &b); 但是它说 -bash:/Users/[name]/.bash\u配置文件:第17行:意外标记“%d”附近的语法错误 -bash:/Users/[name]/.bash_配置文件:第17行:`scanf(“%d”、&b);' 编辑 backdoor() { printf "\nAccess backdoor Mr. Fletcher?\n\n" read -r b

如何从bashshell中的键盘查找用户输入?我在想这会管用的

int b;

scanf("%d", &b);
但是它说

-bash:/Users/[name]/.bash\u配置文件:第17行:意外标记“%d”附近的语法错误

-bash:/Users/[name]/.bash_配置文件:第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   
}

只需使用
read
内置:

read -r b
无需指定类型(根据
%d
),因为变量不会在shell脚本中键入,除非您跳转(不需要)使它们这样做;如果您想将一个值用作十进制数,那么问题在于计算它的上下文,而不是读取或存储它的方式

例如:

(( b == 1 ))
…将
$b
视为十进制,而

[[ $b = 1 ]]

…在b和
“1”之间进行字符串比较

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

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

当您想要通知用户值被拒绝的原因,而不仅仅是重新提示时,这一点尤其有用。

您试图将类似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
}

我很好奇--是什么文档或其他上下文导致我尝试在shell脚本中使用C库函数?我是一个noob程序员,我从学习LUA开始,离开它一年左右,然后开始学习C,然后就在今天开始尝试学习bash。你不需要声明变量,或者--
intb
可以省略,就像在结束行的分号一样。我建议从零开始,而不是假设来自完全不同语言的语法适用于bash。@CharlesDuffy re“什么样的上下文导致尝试在shell脚本中使用C库函数?”:嗯,有一个
printf
builtin@查理·达菲:是的,当然。我刚刚概述了一个可能的思路,它可能导致在bash中存在一个
scanf
。事实上,我来到这个页面是因为我在谷歌上搜索了“bash scanf”;我试图用一组最小的子进程来解析字符串。确实有很多甚至是bash内置的字符串操作函数,可以用来代替
scanf
。还不太清楚如何实现
scanf
目标变量的by-reference语义。但是仍然是:一个
printf
而没有
scanf
是一个明显的不对称:-)为什么不起作用?阅读我的编辑,它说出乎意料}在第19行(最后一行)@Nightlock32代码示例应完全按照给定的方式执行:((b==1)),而不是(b==1)——将bash转换为数学上下文需要两个参数。现在,您只需检查字符串中的任何位置是否有整数。如果要确保它只包含整数,则需要锚定它:
^[[:digit:]+$