shell脚本编写注意细节 ==、=等的区别

在这里插入图片描述

文章目录

  • `==`和`=`的使用主要区别
      • 小结
  • Shell脚本要注意的细节
      • 1. 变量引用和空格处理
      • 2. `[[ ... ]]` vs `[ ... ]`
      • 3. 使用`-n`和`-z`来检测变量是否为空
      • 4. 整数运算和浮点运算
      • 5. 避免使用反引号执行命令
      • 6. `for`循环中的命令替换
      • 7. 使用`trap`来清理临时文件
      • 8. 避免使用硬编码路径
      • 9. 使用`-eq`、`-lt`、`-gt`等来比较整数
      • 10. 检测命令的存在性
      • 11. 防止“未定义变量”引起的错误

===的使用主要区别

在Shell脚本中,===的使用主要区别在于它们所处的上下文和具体的Shell版本:

  1. =

    • POSIX标准中,=被定义为字符串比较运算符,适用于test命令或[命令。
    • 例如:[ "$a" = "$b" ] 用于判断$a$b是否相等,若相等则返回true。
    • 这是更通用的字符串比较方式,在所有的Shell环境中(如shbashzsh等)都可以使用。
  2. ==

    • 在**bashzsh等Shell中**,==同样可用于字符串比较,且功能和=类似。
    • 但是,==只在bashzsh等一些高级Shell中支持,如果需要确保脚本的可移植性(兼容更多Shell环境),建议使用=
    • bash使用[[ ... ]]命令时,==可以用作模式匹配(pattern matching),支持通配符(如*?等),而=则没有这种功能。

    示例:

    # 使用==做字符串比较
    if [[ "$a" == "$b" ]]; thenecho "相等"
    fi# 使用==做模式匹配
    if [[ "$a" == *"pattern"* ]]; thenecho "匹配"
    fi
    

小结

  • =:通用的字符串比较,适用于所有Shell(POSIX标准)。
  • ==:特定于bashzsh,在[[ ... ]]下还可以用于模式匹配。

Shell脚本要注意的细节

在编写Shell脚本的过程中,有许多细节需要注意,尤其是涉及到不同Shell的兼容性、变量处理、命令执行等。以下是一些常见的注意事项:

1. 变量引用和空格处理

  • 变量引用:在使用变量时,尽量用"$VAR"而不是$VAR,尤其是在变量可能为空或包含空格的情况下,否则会导致意外的分割或错误。
  • 避免无引号的字符串比较:如[ $a = $b ]可能会在$a$b为空时引发错误,改用[ "$a" = "$b" ]
# 不推荐,可能出错
[ $a = $b ]# 推荐
[ "$a" = "$b" ]

2. [[ ... ]] vs [ ... ]

  • [[ ... ]]:是bashzsh的增强条件表达式,支持更强大的特性(如模式匹配==)。
  • [ ... ]:是POSIX标准的条件表达式,兼容性更广,但功能略微受限。
  • 注意:在[ ... ]中使用&&||时需要用-a-o,而[[ ... ]]可以直接使用&&||

3. 使用-n-z来检测变量是否为空

  • -n "$VAR" 检查变量是否非空。
  • -z "$VAR" 检查变量是否为空。
  • 避免直接用[ $VAR ]来检查空变量,若$VAR未定义则可能报错。
if [ -z "$VAR" ]; thenecho "变量为空"
fi

4. 整数运算和浮点运算

  • expr(( ... ))用于整数运算,而bc用于浮点运算。
  • (( ... ))bash的算术表达式,直接支持整数运算,推荐使用。
# 推荐:整数运算
a=5
b=3
result=$((a + b))# 浮点运算
result=$(echo "scale=2; 3.5 / 2" | bc)

5. 避免使用反引号执行命令

  • 使用$(command)替代旧式反引号`command`,提高可读性。
  • 嵌套执行命令时,$(...)也更简洁。
# 推荐
result=$(echo "Hello World")

6. for循环中的命令替换

  • for循环遍历列表时,命令替换如$(ls)要用引号包裹,以避免因文件名中空格等字符引发错误。
# 遍历当前目录文件
for file in "$(ls)"; doecho "$file"
done

7. 使用trap来清理临时文件

  • 使用trap命令捕获脚本退出或中断信号,进行清理操作。
trap 'rm -f /tmp/tempfile' EXIT

8. 避免使用硬编码路径

  • 使用变量或$HOME代替硬编码的路径,以提高脚本的可移植性。

9. 使用-eq-lt-gt等来比较整数

  • 在Shell脚本中使用-eq-lt-gt等运算符来进行整数比较,而不是=!=
if [ "$a" -eq "$b" ]; thenecho "整数相等"
fi

10. 检测命令的存在性

  • 检查依赖的命令是否存在,以避免脚本在命令缺失时崩溃。例如用command -v检查命令。
if ! command -v wget &> /dev/null; thenecho "wget 未安装"exit 1
fi

11. 防止“未定义变量”引起的错误

  • 通过在脚本开头使用set -u来启用未定义变量报错,以防止变量未定义时引发的不可预料的错误。
set -u # 未定义变量时报错

通过以上注意事项,Shell脚本会更加健壮、便于维护,并且在不同环境中具备更好的兼容性。


结束语
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/58678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker Swarm简介

注意事项 Swarm 模式是用于管理 Docker 守护进程集群的一项高级特性。如果你打算将 Swarm 用作生产运行时环境,那就使用 Swarm 模式。如果你不打算使用 Swarm 进行部署,可改用 Docker Compose。如果正在为 Kubernetes 部署进行开发,可以考虑使…

接口测试及常用接口测试工具(postman/jmeter)详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 首先,什么是接口呢? 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口&#…

CVE-2024-51567 CyberPanel upgrademysqlstatus 远程命令执行

该漏洞源于upgrademysqlstatus接口未做身份验证和参数过滤,未授权的攻击者可以通过此接口执行任意命令获取服务器权限,从而造成数据泄露、服务器被接管等严重的后果。 影响版本 CyberPanel v2.3.5CyberPanel v2.3.6 目前官方已有可更新版本&#xff0…

Kaggle “Reducing Commercial Aviation Fatalities” 比赛 生理数据分析

1、背景 Kaggle在2018 年 12 月 20 日举办“Reducing Commercial Aviation Fatalities” 比赛,通过收集飞行员的生理数据,判断飞行员何时会遇到麻烦吗?该比赛主要分析飞行员的问题,因为航班多、时间不固定,飞行员会出…

无套路领取《AI应用开发专栏》

最近有些时间没有更新技术文章了,都在忙着写《AI应用开发入门》专栏,专栏已整理放到了github上,有兴趣的小伙伴可以移步github阅读,地址见文末。 1、为什么写这个文档 之前陆续写了一些零散的AI相关的技术文章,也有不…

Webserver(1.8)操作函数

目录 文件属性操作函数access函数chmod函数chown函数truncate函数 目录操作函数mkdir函数rmdir函数rename函数chdir函数*getcwd函数 目录遍历函数*opendir函数*readdir函数closedir函数 dup、dup2函数dupdup2 fcntl函数 文件属性操作函数 access函数 判断某个文件是否有某个权…

基础IO -- 标准错误输出stderr

目录 1)为什么要有 fd 为 2 的 stderr 2)使2和1重定向到一个文件中 这里我们谈一下以前只是了解过的stderr 通过两段代码,显然,我们可以知道两个FILE*都是指向显示器的 对于重定向,只有stdout才会将打印的数据重定向…

基于Multisim的四位抢答器设计与仿真

四位选手进行抢答比赛,用基本门电路及集成逻辑器件构成四人抢答器。选手编号分别为1,2,3,4号,用S1,S2,S3,S4四个按钮作为抢答按钮,S0按钮为总清零按钮。当四人中任何一个…

Python毕业设计选题:基于Django+Vue的物资配送管理系统的设计与实现

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录界面 管理员功能界面 申领者管理 后勤处管理 物资信息管理 入库信息管理 …

网安秋招面试

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect 《Web安全》h…

springboot092安康旅游网站的设计与实现(论文+源码)_kaic

毕业设计(论文) 基于JSP的安康旅游网站的设计与实现 姓  名 学  号 院  系 专  业 指导老师 2021 年 月 教务处制 目 录 目 录 摘 要 Abstract 第一章 绪论 1.1 研究现状 1.2 设…

字符串逆序(c语言)

错误代码 #include<stdio.h>//字符串逆序 void reverse(char arr[], int n) {int j 0;//采用中间值法//访问数组中第一个元素和最后一个元素//交换他们的值&#xff0c;从而完成了字符串逆序//所以这个需要临时变量for (j 0; j < n / 2; j){char temp arr[j];arr[…

Fakelocation 步道乐跑(Root真机篇)

前言:需要 Fakelocation&#xff0c;真机Root,步道乐跑&#xff0c;Dia&#xff0c;MT管理器系统需求 Fakelocation | MT管理器 | Dia | 环境模块 任务一 真机Root&#xff08;德尔塔&#xff0c;过momo&#xff0c;刷环境模块&#xff09; 任务二 前往Dia查看包名&#xff08…

【实战篇】requests库 - 有道云翻译爬虫 【附:代理IP的使用】

目录 〇、引言一、目标二、请求参数分析三、响应分析四、编写爬虫脚本【隧道代理的使用】 〇、引言 无论是学习工作、旅游出行、跨境电商、日常交流以及一些专业领域都离不开翻译工具的支持。本文就带大家通过爬虫的方式开发一款属于自己的翻译工具~ 一、目标 如下的翻译接口…

MyBatis 源码分析 - SQL执行过程(三)之 ResultSetHandler

MyBatis的SQL执行过程 在前面一系列的文档中&#xff0c;我已经分析了 MyBatis 的基础支持层以及整个的初始化过程&#xff0c;此时 MyBatis 已经处于就绪状态了&#xff0c;等待使用者发号施令了 那么接下来我们来看看它执行SQL的整个过程&#xff0c;该过程比较复杂&#xff…

达梦数据迁移工具DTS使用实践

1、环境描述 2、DTS概述 1.支持视图、存储过程/函数、包、类、同义词、触发器等对象迁移&#xff1b; 2.支持数据类型的自动映射&#xff0c;编码转换&#xff1b; 3.支持根据条件自定义迁移部分数据&#xff1b; 4.向导式迁移步骤&#xff0c;上手简单&#xff1b; 5.支持 we…

【Web.路由】——路由约束

我们需要明确的一点就是&#xff0c;一个URL地址就是一个路由值。 而路由约束&#xff0c;就是制定出的一套规则&#xff0c;只有路由值与路由约束中的规则匹配&#xff0c;才可以进行下一步操作。 路由约束不仅可用于路由请求&#xff0c;还可以用于链接的生成。 参数值约束 …

c++编解码封装

多态版编解码 对服务器和客户端的结构体进行序列化然后对数据进行反序列化 案例分析 代码demo Codec.h #pragma once #include <iostream>class Codec { public:Codec();virtual std::string encodeMsg();//string是标准库的string类virtual void* decodeMsg();virtu…

Android 圆形进度条CircleProgressView 基础版

一个最基础的自定义View 圆形进度条&#xff0c;可设置背景色、进度条颜色&#xff08;渐变色&#xff09;下载进度控制&#xff1b;可二次定制度高&#xff1b; 核心代码&#xff1a; Overrideprotected void onDraw(NonNull Canvas canvas) {super.onDraw(canvas);int mW g…

SSH登录介绍

说明&#xff1a;一般登录服务器&#xff0c;我们可以用远程连接工具&#xff0c;如XShell、Windterm等&#xff0c;或者通过公司搭建的JumpServer&#xff08;跳板机、堡垒机&#xff09;来连接。前者是点对点登录&#xff0c;输入主机、端口&#xff0c;通过SSH协议登录&…