【问题标题】:scanf equivalent for Bash?Bash的scanf等价物?
【发布时间】:2013-03-16 00:10:59
【问题描述】:

如何在 bash shell 中查找来自键盘的用户输入?我在想这会行得通,

int b;

scanf("%d", &b);

但它说

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

【问题讨论】:

  • 我很好奇——什么文档或其他上下文导致尝试在 shell 脚本中使用 C 库函数?
  • 我是一个菜鸟程序员,我从学习LUA开始,离开了一年,然后开始学习C,然后今天才开始尝试学习bash。
  • 你也不需要声明你的变量——int b 可以省略,结尾处的分号也可以。我建议从头开始使用 mywiki.wooledge.org/BashGuide 之类的东西,而不是假设来自完全不同语言的语法适用于 bash。
  • @CharlesDuffy 回复“什么上下文导致尝试在 shell 脚本中使用 C 库函数?”:嗯,一个 printf 内置函数!
  • @CharlesDuffy 当然可以。我只是概述了一个可能的思路,这可能会导致 bash 中有一个 scanf 的假设。事实上,我来到这个页面是因为我搜索了“bash scanf”;我正在尝试用最少的子进程集解析一个字符串。甚至有许多内置的 bash 字符串操作函数可以用来代替 scanf。也不太清楚如何实现scanf 目标变量的按引用语义。但仍然:没有scanfprintf 是明显的不对称:-)。

标签: bash terminal scanf


【解决方案1】:

只需使用 read 内置:

read -r b

无需指定类型(根据%d),因为变量不会在 shell 脚本中键入,除非您跳过(不必要的)箍来使它们如此;如果您想将一个值用作小数,那是计算它的上下文的问题,而不是读取或存储它的方式。

例如:

(( b == 1 ))

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

[[ $b = 1 ]]

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

【讨论】:

  • 为什么这不起作用?阅读我的编辑它在第 19 行(最后一行)说意外 }
  • @Nightlock32 代码示例应该完全按照给定:(( b == 1 )),而不是(b == 1)——它需要 两个 括号来获得 bash进入数学环境。
【解决方案2】:

虽然您可以在 Bash 中将变量声明为整数,但结果不会如您所愿。非整数值将被转换为零,这可能不是您想要的。这是确保您收集整数的更安全的方法:

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

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

【讨论】:

  • 现在您只检查字符串中任何地方是否有一个整数。如果您想确保它由整数组成,则需要锚定它:^[[:digit:]]+$
【解决方案3】:

您正在尝试将类 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
}

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多