Linux 输入读取

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本实验将向你介绍在 Linux shell 脚本中读取输入的方法。读取输入是创建能够响应用户输入的交互式 shell 脚本的一项基本技能。通过学习如何使用 read 命令,你将能够收集和处理用户输入的数据,使你的脚本更加通用和用户友好。

在本实验中,你将学习如何读取用户输入,在脚本中处理这些输入,并创建能够根据不同用户输入动态响应的交互式 shell 脚本。这些技能对于在 Linux 环境中编写有效的命令行工具和脚本至关重要。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/VersionControlandTextEditorsGroup(["Version Control and Text Editors"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicSystemCommandsGroup -.-> linux/read("Input Reading") linux/BasicSystemCommandsGroup -.-> linux/exit("Shell Exiting") linux/BasicFileOperationsGroup -.-> linux/touch("File Creating/Updating") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/VersionControlandTextEditorsGroup -.-> linux/nano("Simple Text Editing") subgraph Lab Skills linux/echo -.-> lab-271367{{"Linux 输入读取"}} linux/read -.-> lab-271367{{"Linux 输入读取"}} linux/exit -.-> lab-271367{{"Linux 输入读取"}} linux/touch -.-> lab-271367{{"Linux 输入读取"}} linux/chmod -.-> lab-271367{{"Linux 输入读取"}} linux/cd -.-> lab-271367{{"Linux 输入读取"}} linux/nano -.-> lab-271367{{"Linux 输入读取"}} end

基本输入读取

read 命令是一个内置的 shell 命令,用于从标准输入(通常是键盘)读取一行输入,并将其赋值给变量。这使得脚本能够接收和处理用户输入。

在这一步中,你将创建一个简单的脚本,该脚本读取用户输入并将其显示给用户。

  1. 首先,确保你位于项目目录中:

    cd /home/labex/project
  2. 创建一个名为 input_reader.sh 的新脚本文件:

    touch input_reader.sh
  3. 使脚本可执行:

    chmod +x input_reader.sh
  4. 使用 nano 文本编辑器打开脚本文件:

    nano input_reader.sh
  5. 在脚本中添加以下代码:

    #!/bin/bash
    
    ## A simple script to demonstrate basic input reading
    echo "Please enter your name:"
    read name
    echo "Hello, $name! Welcome to Linux input reading."

    此脚本:

    • 以 shebang (#!/bin/bash) 开头,指定脚本应使用 bash 运行
    • 显示一个提示,要求用户输入姓名
    • 使用 read 命令捕获用户输入的内容,并将其存储在名为 name 的变量中
    • 显示包含用户输入姓名的问候语
  6. Ctrl+O 保存文件,然后按 Enter 确认文件名,再按 Ctrl+X 退出 nano。

  7. 运行脚本进行测试:

    ./input_reader.sh

    你应该会看到类似以下的输出:

    Please enter your name:
    John
    Hello, John! Welcome to Linux input reading.

    实际输出将显示你输入的任何姓名,而不是 "John"。

read 命令会等待用户输入,并将其存储在一个或多个变量中。在这个例子中,输入被存储在一个名为 name 的单个变量中。稍后,你将学习如何使用单个 read 命令捕获多个输入。

在循环中使用 read 命令

在这一步中,你将改进你的脚本,使其使用循环持续读取输入,直到满足特定的退出条件。这种模式常用于需要从用户那里收集多条信息的交互式脚本中。

  1. 打开你的脚本进行编辑:

    nano input_reader.sh
  2. 将现有内容替换为以下代码:

    #!/bin/bash
    
    ## Enhanced script with a loop for multiple inputs
    echo "Enter multiple inputs (type 'exit' to quit):"
    
    while true; do
      ## Prompt for input
      echo -n "> "
      read input
    
      ## Check if user wants to exit
      if [[ "$input" == "exit" ]]; then
        echo "Exiting the input reader."
        break
      fi
    
      ## Process the input
      echo "You entered: $input"
    done
    
    echo "Thank you for using the input reader!"

    此脚本:

    • 使用 while true 循环创建一个无限循环,持续接受输入
    • 使用 echo -n 在每次输入前显示一个提示符 (>),echo -n 可防止换行
    • 将用户输入读取到 input 变量中
    • 检查输入是否为 "exit",如果是则跳出循环
    • 否则,将输入回显给用户
    • 最后,在退出循环后显示一条感谢信息
  3. Ctrl+O 保存文件,然后按 Enter 确认文件名,再按 Ctrl+X 退出 nano。

  4. 运行改进后的脚本:

    ./input_reader.sh

    你应该会看到类似以下的输出:

    Enter multiple inputs (type 'exit' to quit):
    > hello
    You entered: hello
    > world
    You entered: world
    > exit
    Exiting the input reader.
    Thank you for using the input reader!

这种循环结构在你需要按顺序处理多个输入时特别有用,比如构建一个简单的命令行界面或数据录入工具。当用户输入 "exit" 时,break 语句用于退出循环,但你可以根据需要修改退出条件。

带提示信息和默认值的输入读取

在这一步中,你将学习如何为输入提供默认值,并使用 -p 选项创建更简洁的提示信息。当你希望让用户可以直接按回车键接受建议值时,这非常有用。

  1. 打开你的脚本进行编辑:

    nano input_reader.sh
  2. 将现有内容替换为以下代码:

    #!/bin/bash
    
    ## Script demonstrating read with default values
    
    ## Using -p flag for prompt and providing default with || operator
    read -p "Enter your country (default: USA): " country
    country=${country:-USA}
    echo "Country set to: $country"
    
    ## Another example with a default value
    read -p "Enter your preferred programming language (default: Bash): " language
    language=${language:-Bash}
    echo "Programming language set to: $language"
    
    ## Combining with a timeout using -t option
    echo "Quick response needed:"
    read -t 5 -p "What is your favorite color? (You have 5 seconds, default: Blue): " color
    color=${color:-Blue}
    echo "Favorite color set to: $color"

    此脚本:

    • 使用 -p 标志在同一个 read 命令中显示提示信息,使代码更简洁
    • 应用 ${variable:-default} 语法,在用户输入为空时设置默认值
    • 演示了 -t 选项,该选项为输入设置了超时时间(在这个例子中是 5 秒)
  3. Ctrl+O 保存文件,然后按 Enter 确认文件名,再按 Ctrl+X 退出 nano。

  4. 运行脚本进行测试:

    ./input_reader.sh

    尝试以下几种情况:

    • 当提示输入国家名称时,输入一个国家名,然后按回车键
    • 直接按回车键(不输入任何内容)以接受默认值
    • 对于超时示例,尝试等待超过 5 秒,看看会发生什么

    接受默认值时的示例输出如下:

    Enter your country (default: USA):
    Country set to: USA
    Enter your preferred programming language (default: Bash):
    Programming language set to: Bash
    Quick response needed:
    What is your favorite color? (You have 5 seconds, default: Blue):
    Favorite color set to: Blue

read 命令的 -p 选项允许你在同一个命令中提供提示信息,使你的脚本更简洁、易读。${variable:-default} 语法是 shell 的一个强大特性,当变量未设置或为空时,它会用默认值进行替换,这非常适合在脚本中提供默认选项。

读取安全输入和多个变量

在这最后一步中,你将学习另外两种高级技巧:

  1. 读取安全输入(如密码),且不在屏幕上显示输入的字符

  2. 使用单个 read 命令读取多个变量

  3. 打开你的脚本进行编辑:

    nano input_reader.sh
  4. 将现有内容替换为以下代码:

    #!/bin/bash
    
    ## Script demonstrating secure input and multiple variable reading
    
    ## Secure input reading with -s flag (no echo)
    echo "Secure Input Example:"
    read -p "Username: " username
    read -s -p "Password: " password
    echo ## Add a newline after password input
    echo "Username entered: $username"
    echo "Password length: ${#password} characters"
    
    ## Reading multiple variables at once
    echo -e "\nMultiple Variable Example:"
    read -p "Enter first name, last name, and age (separated by spaces): " first_name last_name age
    
    echo "First name: $first_name"
    echo "Last name: $last_name"
    echo "Age: $age"
    
    ## Reading with a custom delimiter
    echo -e "\nCustom Delimiter Example:"
    read -p "Enter comma-separated values: " -d "," value1
    echo ## Add a newline
    echo "First value before comma: $value1"
    
    echo -e "\nThank you for completing this lab on Linux input reading!"

    此脚本:

    • read 命令中使用 -s 标志来隐藏输入内容(适用于密码或其他敏感信息)
    • 展示了如何通过在 read 命令中提供多个变量名,从一行输入中读取多个变量
    • 演示了使用 -d 标志指定自定义分隔符(而非默认的换行符)
  5. Ctrl+O 保存文件,然后按 Enter 确认文件名,再按 Ctrl+X 退出 nano。

  6. 运行脚本进行测试:

    ./input_reader.sh

    示例输出(你的输入会有所不同):

    Secure Input Example:
    Username: john_doe
    Password:
    Username entered: john_doe
    Password length: 8 characters
    
    Multiple Variable Example:
    Enter first name, last name, and age (separated by spaces): John Doe 30
    First name: John
    Last name: Doe
    Age: 30
    
    Custom Delimiter Example:
    Enter comma-separated values: test,
    First value before comma: test
    
    Thank you for completing this lab on Linux input reading!

在处理密码等敏感信息时,安全性至关重要。-s 标志可确保输入的字符不会显示在屏幕上。注意在密码示例中,脚本仅显示密码的长度用于验证,而不显示实际的密码。

一次性读取多个变量可以使你的脚本更高效、更用户友好。当 read 命令接收到多个变量名时,它会根据 IFS(内部字段分隔符)环境变量对输入进行分割,该变量默认以空白字符(空格、制表符和换行符)作为分隔符。

-d 标志允许你更改表示输入结束的分隔符。默认情况下,read 命令在遇到换行符(即你按下回车键)时停止读取,但你可以将其更改为任何字符,如示例中的逗号。

总结

在这个实验中,你学习了在 Linux bash 脚本中读取和处理用户输入的关键技术:

  1. 基本输入读取:使用 read 命令将用户输入捕获到变量中。
  2. 基于循环的输入:实现循环以持续读取输入,直到满足特定条件。
  3. 默认值和提示信息:为输入设置默认值,并通过内联提示信息创建更简洁的脚本。
  4. 高级技术:读取安全输入(不在屏幕上显示)、在单个命令中捕获多个变量,以及使用自定义分隔符。

这些输入读取技能是创建交互式 shell 脚本的基础,这些脚本能够适应用户输入、提供合适的默认值,并处理各种类型的数据。现在,你可以运用这些技术来创建更具响应性和用户友好性的命令行工具和脚本。

随着你继续提升 Linux 技能,可以考虑将这些输入读取方法与其他 bash 特性(如条件语句、函数和文件操作)相结合,以创建更复杂、强大的自动化和系统管理工具。