Shell脚本5 -- 脚本与用户交互read

声明:
本文的学习内容来源于B站up主“泷羽sec”视频【shell编程(4)脚本与用户交互以及if条件判断】的公开分享,所有内容仅限于网络安全技术的交流学习,不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题,请联系本人,我将立即删除相关内容。
本文旨在帮助网络安全爱好者提升自身安全技能,并严格遵守国家法律法规。任何人利用本文中的信息从事违法活动,均与本文作者和“泷羽sec”无关。请读者自觉遵纪守法,合理合法使用相关知识。


read 是 Shell 中用于从标准输入(通常是用户输入)中读取数据的命令。它常用于交互式脚本,让用户输入内容,并将输入值存储到变量中以供后续使用。


1 read 的基本语法

read [选项] [变量...]
  • 变量:指定接收输入的变量。如果不指定变量,默认将输入存储到环境变量 REPLY 中。
  • 选项read 提供了多个选项来控制行为。

2 基本用法

读取单个输入:

echo "Enter your name:"
read name
echo "Hello, $name!"
  • 用户输入会存储在变量 name 中。
  • 如果用户输入为 Alice,脚本将输出:Hello, Alice!

3 read 的常用选项

选项含义示例
-p显示提示信息,在读取输入前打印提示文字read -p "Enter your name: " name
-t设置超时时间(秒),超过时间未输入则返回非零值并退出read -t 5 -p "Enter your name: " name
-s静默模式,隐藏输入内容(常用于密码输入)read -s -p "Enter password: " password
-n限制输入字符数,当输入达到指定字符数时自动结束read -n 1 -p "Press any key to continue"
-d指定输入结束符,默认是换行符read -d ':' var
-r禁用反斜杠转义,防止用户输入的反斜杠被解释为转义字符read -r line

4 读取多个变量

如果提供多个变量,read 会根据空白分隔符拆分输入,将每一部分存储到相应的变量中。

示例:

echo "Enter your first name and last name:"
read first_name last_name
echo "Hello, $first_name $last_name!"
  • 用户输入 Alice Johnson
    • first_name 存储 Alice
    • last_name 存储 Johnson

多余的输入处理:

  • 如果用户输入超过变量数目,最后一个变量将包含剩余的所有内容。

5 read 默认行为

如果没有指定变量,read 会将输入存储到默认变量 REPLY 中。

示例:

echo "Enter something:"
read
echo "You entered: $REPLY"

6 进阶用法

要使用bash才可使用-p等参数,kali默认的shell是zsh,所以在命令行输入bash

6.1 静默输入密码

read -s -p "Enter your password: " password
  • 用户输入的内容不会显示在屏幕上。

6.2 限制输入字符数

read -n 1 -p "Press any key to continue"
  • 限制输入一个字符,输入后立即结束。

6.3 设置超时时间

if read -t 5 -p "Enter your name (5 seconds to respond): " name; then
	echo "Hello, $name!"
else
	echo "Timeout, no input received."
fi
  • 用户有 5 秒时间输入,超时后会提示 Timeout

6.4 自定义结束符

read -d ':' -p "Enter a colon-separated string: " var
echo "You entered: $var"
  • 输入以冒号 : 结束,而不是默认的换行符。

6.5 从文件读取输入

read 可以从文件中逐行读取数据。

示例:

while read line; do
  echo "Read line: $line"
done < input.txt
  • 文件 input.txt 的每一行会被依次读取并存储到 line 变量中。

7 错误处理与返回值

  • 成功read 成功读取输入时返回值为 0
  • 失败:如超时或到达文件末尾时返回非零值。

示例:

if read -t 3 -p "Enter your name: " name; then
  echo "You entered: $name"
else
  echo "No input received (timeout)."
fi

8 实际应用案例

8.1 创建交互式菜单

while true; do
	echo "Choose an option:"
	echo "1. Show date"
	echo "2. Show current directory"
	echo "3. Exit"
	read -p "Enter your choice: " choice
	
	case $choice in
		1) date ;;
		2) pwd ;;
		3) echo "Goodbye!"; exit ;;
		*) echo "Invalid choice";;
	esac
done

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

8.2 自动化用户输入确认

read -n 1 -p "Do you want to continue? (y/n): " answer
echo
if [[ $answer == "y" || $answer == "Y" ]]; then
  echo "Continuing..."
else
  echo "Exiting..."
  exit 1
fi

Pasted image 20241118202537

8.3 批量处理数据

# 假设 input.txt 包含多行用户数据
while read username email; do
  echo "Username: $username, Email: $email"
done < users.txt
编写一个1到100之间的猜数字小游戏的Shell脚本是一个经典的编程练习,它可以帮助理解基本的脚本逻辑和用户交互。以下是一个实现该功能的完整Shell脚本示例: ```sh #!/bin/sh # 定义最大可能的数字 biggest=100 # 初始化猜测次数和用户输入 guess=0 guesses=0 # 生成一个1到100之间的随机数 number=$((RANDOM % biggest + 1)) # 开始游戏循环 while [ "$guess" -ne "$number" ]; do echo -n "Guess? " read guess # 检查输入是否为有效数字 if ! [ "$guess" -eq "$guess" ] 2>/dev/null; then echo "Please enter a valid number." continue fi # 判断猜测值目标值的关系 if [ "$guess" -lt "$number" ]; then echo "... bigger!" elif [ "$guess" -gt "$number" ]; then echo "... smaller!" fi # 增加猜测次数 guesses=$((guesses + 1)) done # 游戏结束时输出结果 echo "Right!! Guessed $number in $guesses guesses." exit 0 ``` ### 脚本说明 - **随机数生成**:使用`$RANDOM`环境变量生成一个随机整数,并通过取模运算将其限制在1到100之间。 - **用户输入处理**:使用`read`命令获取用户的输入,并进行简单的验证以确保输入的是一个有效的整数。 - **逻辑判断**:根据用户的猜测值目标值的比较,提示用户猜测值是偏大还是偏小。 - **猜测次数统计**:每次猜测后,增加猜测次数计数器,并在游戏结束后显示总猜测次数。 ### 使用方法 1. 将上述代码保存为一个文件,例如`guess_game.sh`。 2. 给文件添加可执行权限: ```sh chmod +x guess_game.sh ``` 3. 运行脚本: ```sh ./guess_game.sh ``` 这个脚本提供了一个完整的猜数字游戏体验,同时具备基本的错误处理能力,能够检测无效输入并给出提示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值