我正在编写一个脚本,我有一段时间想要获取用户输入并用作带有计数器的整数值,如下所示:
read -p "How many bytes would you like you replace :> " $numOfBytes
echo "$numOfBytes bytes to replace"
while [ $counter -le $numOfBytes ]
do
echo "testing counter value = $counter"
let $counter++
done
据我了解,它目前不起作用,因为它将 numOfBytes 变量作为字符串。
我需要如何将字符串转换为 int 吗?有可能做这样的事情吗?有替代方案吗?
您想读取一个整数,然后从 1 循环到该整数,在每次迭代中打印该数字:
注意
$
读取值时如何不使用。随着$var
您获得变量的值var
,但read
需要知道要读取的变量的名称,而不是它的值。或者,使用 while 循环,
(( ... ))
inbash
是算术上下文。在这种情况下,您不需要放入$
变量,变量的值将被解释为整数。或者,与
/bin/sh
,(
-le
"小于或等于") 测试需要作用于两个带引号的变量扩展(在此代码中)。如果它们没有被引用,如[ $i -le $num ]
,那么,如果任一变量包含 shell 通配符或空格,您可能会得到意想不到的结果或错误。IFS
此外,如果变量恰好包含数字,引用可以保护数字。相关问题:
要解决具体问题:
答案是不。Shell 变量都是字符串,但根据使用它们的上下文,它们可以被视为整数或字符串。在命令
-le
运算符[
(又名test
命令)的情况下,变量将被视为整数。您的脚本需要初始化
counter
变量、$
从numOfBytes
in 中read
删除并$
从let
.这是这样工作的:
请注意,由于
let
是bash
/ksh
关键字,这会降低脚本的可移植性。建议使用算术扩展counter=$((counter+1))
,这是POSIX 的 Shell 语言标准(第 2.6.4 节)的一部分。另见:https ://askubuntu.com/a/939299/295286
正如Storm Dragon所指出的,shell 变量根据其上下文进行处理这一事实也意味着需要对用户的输入进行清理。一种可能的方法是像this answer
numOfBytes
中那样考虑便携式声明,它负责确定输入是否实际上是数字。case
Bash 并没有真正可分配的类型。变量是其声明的类型。因此,如果您将变量声明为
abc
,则它是一个字符串。如果您将其声明为138
,则它是一个 int。Bash 并不真正处理小数,因此如果您将变量声明为138.0
,它会将其视为字符串。所以,你需要小心用户输入,因为你不能从
0
to循环abc
。这是一个示例,它应该通过循环中的字节进行一些错误检查和增量。