当前位置: 首页 > news >正文

shell每日三题大神之路:第三天

🏋️ 例题 1:静默读密码

read -rsp "Password: " pw
echo        # 换行
if [[ $pw == secret ]]; thenecho "Login ok"
elseecho "Wrong pwd"
fi

知识点1:read的用法

read是shell中专门用来获取标准输入的命令,具有多种参数应用于不同场景,参数如下:

参数作用
-r关掉反斜杠转义(99% 场景都要加
-p直接给出提示符(read -p "name: " name)
-s静默输入(密码不回显)
-n N读够 N 个字符就停
-t S超时 S 秒自动结束(备注:超时退出时返回代码是1)
-a array把整行按空格切成数组
-d delim自定义行结束符(默认是换行)

知识点2:测试语法易错点

牢记扩展测试符中,变量,运算符,字符串之间需要用空号隔开。

🏋️ 例题 2:带超时读菜单

#!/usr/bin/bash
while true;do
read -rn 1 -t 5 -p 'choice[1-5]' choice || { echo -e "\n超时输入,请重新输入";(exit 1)}
if [[ $? == "1" ]];then
continue
else
case $choice in
1) echo "choice is 1" ;;
2) echo "choice is 2" ;;
3) echo "choice is 3" ;;
*) echo "none choice" ;;
esac
fi
break
done

知识点1:case的用法需要牢记

知识点2:{}与()的区别

{}:代码块,将多条命令打包到本地shell中执行

():子shell命令组:将多条命令打包到一个子shell中执行,环境是隔离的。

在 Bash 里,{}() 看起来很相似,但底层行为完全不同,记住一句话即可:

() 一定开子进程{} 永远不开子进程,只是“打包”命令。

语法是否开子 shell变量/函数是否隔离示例
{ cmd1; cmd2; }❌ 否❌ 共享a=1; { a=9; }; echo $a → 9
( cmd1; cmd2 )✅ 是✅ 隔离a=1; (a=9); echo $a → 1

注意:

  • {} 内每条命令后必须加 ;(或换行),且左大括号后要有空格:
    { echo 1; echo 2; } >log.txt

  • () 末尾可省略分号:(echo 1; echo 2)

知识点3:return和exit的区别

exit 与 return 的底层差异可以概括为一句话:

exit 终止整个进程;return 只结束当前函数 / source 调用层,进程仍在。

作用对象

指令作用对象场景
exit [n]整个 Shell 进程脚本顶层、交互式 Shell、函数、source 文件——任何地方
return [n]当前函数或 source 脚本仅能在 函数 或 被 source 的脚本 里使用

疑问:为什么return作用于source的脚本中呢

两者最大的不一样在于是否结束掉那个运行shell的进程,exit会结束掉shell进程,但是return不会,他在source中只是结束掉了那个shell从读取脚本命令的这个过程并且返回一个代码,原来脚本的后续命令仍然会继续。

执行模型:没有新的进程或子 Shell

  • source filename(或 . filename)执行时,当前 Shell 进程通过 open()/read() 逐行读取文件内容,并在 同一个解释器上下文 中立即执行,相当于把文件内容“嵌入”到当前脚本中。

  • 因此,文件里的任何变量、函数、别名都直接写入 当前 Shell 的全局符号表,无需复制或隔离。

  • int
    source_builtin(list *words)
    {int fd = open(...);int status = 0;while (line = read_line(fd)) {status = execute_command(line);   /* ← 逐行执行 */if (current_token == TOKEN_RETURN) {/* 解析 return <n> */status = parse_return_value();break;                        /* 停止继续读取文件 */}}close(fd);return status;                        /* 此时成为 source 命令的退出码 */
    }

🏋️ 例题 5:整行变数组

read -ra nums -p "输入若干数字: "
sum=0
for n in "${nums[@]}"; do((sum += n))
done
echo "Sum = $sum"

知识点1:

遍历数组的方式需要用${array[@]}的格式来做,直接用array返回的是array名字或者0

知识点2:

shell中一般碰到需要数字运算的时候都要用(())或者$(())来完成,不然默认都是字符串碰到运算就会寄。

知识点3:

echo -e 的作用是 “启用反斜杠转义”,让字符串里的转义序列真正生效。
默认情况下,echo 会把反斜杠当成普通字符原样输出;加了 -e 之后,下面这些序列就会被解释成对应的控制字符:

转义符含义说明
\n换行
\t水平制表符(Tab)
\r回车,光标移到行首
\b删除前一个字符
\c输出到此结束,不再追加换行
\a响铃(BEL)
\\反斜杠本身
\033[31m …终端颜色码(ANSI 颜色)


http://www.lryc.cn/news/602772.html

相关文章:

  • 轻量级远程开发利器:Code Server与cpolar协同实现安全云端编码
  • AR眼镜:工业4.0时代高风险作业的安全守护者
  • 深度思考和搜索研究 最新的GSPO强化学习算法
  • 解决 xshell 无法连接win10 、win11的linux子系统
  • python每日一题练习
  • Java集合遍历的几种方式
  • 【docker】DM8达梦数据库的docker-compose以及一些启动踩坑
  • Thymeleaf th:object核心用法精解
  • LeetCode|Day28|67. 二进制求和|Python刷题笔记
  • OpenLayers 入门指南【四】:项目初始化
  • org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path
  • 下载k8s官方组件chart和容器镜像
  • 自动化测试常用函数
  • 网络编程概述与UDP编程
  • 关于前端的性能优化
  • 【数据架构09】人工智能及数据智能架构篇
  • pg数据库,本地服务器下不同端口迁移
  • 用了Flutter包体积增大就弃用Flutter吗?包体积与开发效率,这两者之间如何权衡?
  • 微信小程序点击输入框时,顶部导航栏被遮挡问题如何解决?
  • 鸿蒙打包签名
  • Linux驱动23 --- RkMedia 使用
  • gdb 基本命令
  • 3DGRUT: 革命性的3D高斯粒子光线追踪与混合光栅化技术深度解析
  • Error: Unable to find a match: python3.8
  • 【Linux操作系统】简学深悟启示录:Linux环境基础开发工具使用
  • Spring IOC与DI
  • 【服务器知识】nginx配置ipv6支持
  • JVM 内存共享区域详解
  • RabbitMQ概念与管理端配置说明
  • 学习游戏制作记录(改进剑投掷状态)7.28