0

0

Linux shell 编程进阶技巧

舞姬之光

舞姬之光

发布时间:2026-02-15 10:46:40

|

186人浏览过

|

来源于php中文网

原创

set -e 仅对单独命令或管道末尾命令生效,不捕获管道中间失败、if/&&/|| 中非末尾命令;需显式判断 $? 或用 ${var:?} 校验变量;循环应避免 for f in $(ls),改用 find -print0 | while read -r -d '';set -x 需配对 set +x 防止日志泄露。

linux shell 编程进阶技巧

set -e 之前先搞清它到底在什么情况下不退出

很多人加了 set -e 就以为脚本“出错自动停”,结果发现 grep 没匹配到却没退出,|| 后面的命令照常执行——因为 set -e 对管道、if 判断、&&/|| 链里的非最后一个命令默认不生效。

真正可靠的写法是:把关键检查单独成行,或显式判断返回值:

grep "pattern" file.txt
if [ $? -ne 0 ]; then exit 1; fi

常见踩坑点:

  • set -e 不捕获 command || echo "fallback"command 的失败
  • 管道中只有最后一个命令失败才会触发退出:cat file.txt | grep "x" | sort,中间 grep 失败不会退出
  • 函数内部的 set -e 不会继承到调用者作用域

变量未定义就引用?${var:?}test -z "$var" 更直接

空值或未定义变量导致脚本逻辑错乱,但每次手动 if [ -z "$var" ] 太啰嗦。直接用参数扩展强制校验更省事,也更早暴露问题。

实操建议:

Linux+PHP+MySQL案例教程
Linux+PHP+MySQL案例教程

本书以培养高级网站建设与管理人才为目标,内容循序渐进,由浅入深,通过大量的实例系统全面地介绍了Linux+PHP+MySQL环境下的网络后台开发技术。本书详尽分析了近30个典型案例。包括计数器、网站流量统计、留言板、论坛系统、聊天室、投票与调查、用户管理、新闻发布系统、广告轮播、购物系统等等,力求让读者通过对案例的学习,轻松掌握PHP和MySQL的编程精要,迅速掌握网络后台开发技巧。   本书适

下载
  • 必须存在的变量:用 ${var:? "var is required"},未定义或为空时立即报错退出
  • 允许为空但不能未定义:用 ${var?}(注意没冒号),只对未定义报错
  • 别混用 ${var:-default}${var:?}——前者是兜底,后者是断言,目的完全不同
  • source 配置文件里大量用 ${var:?},比运行时才发现变量缺失强得多

循环处理文件名含空格?别用 for f in `ls`

for f in `ls`for f in $(find ...) 在遇到带空格、换行、* 等特殊字符的文件名时必然崩,这不是边缘情况,而是日常。

可靠方案只有两个:

  • while read -r 配合 find -print0
    find . -name "*.log" -print0 | while IFS= read -r -d '' file; do
      echo "Processing: $file"
    done
  • 用数组 + glob(bash 4.4+):
    files=( *.log )
    for f in "${files[@]}"; do
      [ -e "$f" ] || continue  # 防空匹配
      echo "Processing: $f"
    done
  • 永远别在循环变量里直接插 $f,一律用 "$f" 包裹

调试时想看每条命令实际执行啥?set -x 要和 set +x 配对关

set -x 打印执行前的命令(带变量展开),非常有用,但开太久会导致日志爆炸,尤其在循环或递归调用里。

实用习惯:

  • 只在怀疑段落前后加:
    set -x
    some_tricky_command arg1 "$var"
    set +x
  • set -x 输出里的 + 是提示符,不是命令一部分;看到 + cd /tmp 说明 cd 真被执行了
  • 如果脚本被其他脚本 sourceset -x 会影响父脚本,所以优先用局部子 shell:
    (set -x; some_command)
  • 别依赖 set -x 查变量值——它只显示展开后的命令,不显示变量原始内容

最常被忽略的是:set -x 开启后,所有后续子 shell、函数调用都会继承,除非显式关闭。漏关 set +x 的脚本上线后可能把敏感路径、参数全打到日志里。

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

810

2023.08.22

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

399

2023.09.04

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

102

2023.09.25

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2023.12.07

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1500

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

714

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

298

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

791

2023.07.05

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

76

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 9.1万人学习

Git 教程
Git 教程

共21课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号