利用用户输入的整数使用计数器进行循环

0si*_*ris 3 bash shell-script

我正在编写一个脚本,有一段时间我想获取用户输入并用作带有计数器的整数值,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

据我了解,它目前不起作用,因为它将 numOfBytes 变量作为字符串。

我需要如何将字符串转换为 int 吗?有可能做这样的事情吗?有替代方案吗?

Kus*_*nda 6

您想读取一个整数,然后从 1 到该整数进行循环,在每次迭代中打印数字:

#!/bin/bash

read -p 'number please: ' num

for (( i = 1; i <= num; ++i )); do
    printf 'counter is at %d\n' "$i"
done 
Run Code Online (Sandbox Code Playgroud)

请注意$在读取值时如何不使用 。随着$var您获得变量的值var,但read需要知道要读入的变量的名称,而不是它的值。

或者,使用 while 循环,

#!/bin/bash

read -p 'number please: ' num

i=0
while (( ++i <= num )); do
    printf 'counter is at %d\n' "$i"
done
Run Code Online (Sandbox Code Playgroud)

(( ... ))bash是一个算术上下文。在这种情况下,您不需要放置$变量,变量的值将被解释为整数。

或者,用/bin/sh

#!/bin/sh

printf 'number please: ' >&2
read num

i=1
while [ "$i" -le "$num" ]; do
    printf 'counter is at %d\n' "$i"
    i=$(( i + 1 ))
done
Run Code Online (Sandbox Code Playgroud)

-le(“小于或等于”)测试需要作用于两个引述可变膨胀(在该代码)。如果它们没有被引用,如[ $i -le $num ],那么,如果任一变量包含 shell 通配符或空格,您可能会得到意外的结果或错误。此外,引用可以保护数字,以防IFS变量碰巧包含数字。

相关问题: