AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 443976
Accepted
0siris
0siris
Asked: 2018-05-16 09:10:40 +0800 CST2018-05-16 09:10:40 +0800 CST 2018-05-16 09:10:40 +0800 CST

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

  • 772

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

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 吗?有可能做这样的事情吗?有替代方案吗?

bash shell-script
  • 3 3 个回答
  • 8282 Views

3 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2018-05-16T09:19:54+08:002018-05-16T09:19:54+08:00

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

    #!/bin/bash
    
    read -p 'number please: ' num
    
    for (( i = 1; i <= num; ++i )); do
        printf 'counter is at %d\n' "$i"
    done 
    

    注意$读取值时如何不使用。随着$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
    

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

    或者,与/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
    

    ( -le"小于或等于") 测试需要作用于两个带引号的变量扩展(在此代码中)。如果它们没有被引用,如[ $i -le $num ],那么,如果任一变量包含 shell 通配符或空格,您可能会得到意想不到的结果或错误。IFS此外,如果变量恰好包含数字,引用可以保护数字。

    相关问题:

    • 忘记在 bash/POSIX shell 中引用变量的安全隐患
    • 为什么我的 shell 脚本会因空格或其他特殊字符而窒息?
    • 6
  2. Sergiy Kolodyazhnyy
    2018-05-16T09:43:42+08:002018-05-16T09:43:42+08:00

    要解决具体问题:

    我需要如何将字符串转换为 int 吗?

    答案是不。Shell 变量都是字符串,但根据使用它们的上下文,它们可以被视为整数或字符串。在命令-le运算符[(又名test命令)的情况下,变量将被视为整数。

    # integer comparison
    $ var=25; test "$var" -le "$HOME"
    bash: test: /home/username: integer expression expected
    $ test "$var" -le 30 && echo Lower
    Lower
    # string comparison
    $ test $var = 24 && echo 'same string' || echo 'different string'
    different string
    $ test $var = 25 && echo 'same string' || echo 'different string'
    same string
    

    您的脚本需要初始化counter变量、$从numOfBytesin 中read删除并$从let.

    #!/bin/bash
    
    read -p "How many bytes would you like you replace :> " numOfBytes
    echo "$numOfBytes bytes to replace"
    counter=0
    while [ "$counter" -le "$numOfBytes" ]
    do
        echo "testing counter value = $counter"
        let counter++
    done
    

    这是这样工作的:

    $ ./counter.sh 
    How many bytes would you like you replace :> 5
    5 bytes to replace
    testing counter value = 0
    testing counter value = 1
    testing counter value = 2
    testing counter value = 3
    testing counter value = 4
    testing counter value = 5
    

    请注意,由于let是bash/ksh关键字,这会降低脚本的可移植性。建议使用算术扩展counter=$((counter+1)),这是POSIX 的 Shell 语言标准(第 2.6.4 节)的一部分。

    另见:https ://askubuntu.com/a/939299/295286


    正如Storm Dragon所指出的,shell 变量根据其上下文进行处理这一事实也意味着需要对用户的输入进行清理。一种可能的方法是像this answernumOfBytes中那样考虑便携式声明,它负责确定输入是否实际上是数字。case

    • 3
  3. Storm Dragon
    2018-05-16T10:36:41+08:002018-05-16T10:36:41+08:00

    Bash 并没有真正可分配的类型。变量是其声明的类型。因此,如果您将变量声明为abc,则它是一个字符串。如果您将其声明为138,则它是一个 int。Bash 并不真正处理小数,因此如果您将变量声明为138.0,它会将其视为字符串。

    所以,你需要小心用户输入,因为你不能从0to循环abc。这是一个示例,它应该通过循环中的字节进行一些错误检查和增量。

    #!/bin/bash
    
    # Handle non-numeric input
    read -p "How many bytes would you like you replace :> " numOfBytes
    while [[ ! "$numOfBytes" =~ ^[0-9]+$ ]]; do
        echo
        echo "Please enter whole numbers only:"
        read -p "How many bytes would you like you replace :> " numOfBytes
    done
    
    echo "$numOfBytes bytes to replace $numOfBytes"
    for i  in $(seq $numOfBytes) ; do
        echo "i has been incremented to $i."
    done
    exit 0
    
    • 3

相关问题

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • MySQL Select with function IN () with bash array

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve