我怎样才能在 bash 中读取一个变量,像在 C 的 scanf 中指定的类型?

问题描述 投票:0回答:3

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

int b;

scanf("%d", &b);

但是它说

-bash: /Users/[name]/.bash_profile: line 17: unexpected token `"%d",'附近的语法错误

-bash: /Users/[name]/.bash_profile: 第 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   
}
bash terminal scanf
3个回答
7
投票

只需使用内置的

read

read -r b

无需指定类型(根据

%d
),因为变量不会在 shell 脚本中键入,除非您跳过(不必要的)箍来使它们如此;如果你想使用一个值作为小数,这是一个评估它的上下文的问题,而不是它被读取或存储的方式。

例如:

(( b == 1 ))

...将

$b
视为小数,而

[[ $b = 1 ]]

...在 b 和 "1" 之间进行

string 比较


2
投票

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

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

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


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
}
© www.soinside.com 2019 - 2024. All rights reserved.