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

linux系统编程中Shell脚本配置,及linux脚本中的man test

Shell脚本配置是指在脚本中设置各种参数、选项和环境,以确保脚本能够根据预期的需求和环境执行。配置可以包括变量设置、环境变量、命令选项和错误处理等。

1. 脚本开头的配置

Shebang 
第一行通常是shebang,它告诉系统使用哪个解释器来执行脚本。例如:
#!/bin/bash
这行代码指示系统使用Bash解释器来运行脚本。

注释
注释用于解释脚本的功能或配置:
#!/bin/bash

# This script performs a backup of the specified directory

2. 变量和常量

定义变量
变量用来存储数据,定义时不需要指定类型:
directory="/path/to/directory"
filename="backup_$(date +%F).tar.gz"

只读变量
使用`readonly`标记变量为只读,防止被修改:
readonly MAX_RETRIES=5

环境变量
设置环境变量以影响脚本的运行环境:
export PATH="/usr/local/bin:$PATH"

3. 配置选项

脚本参数
脚本可以接受命令行参数,使用`$1`, `$2`, ... 来引用这些参数:
#!/bin/bash

input_file="$1"
output_file="$2"

if [ -z "$input_file" ] || [ -z "$output_file" ]; then
    echo "Usage: $0 <input_file> <output_file>"
    exit 1
fi

# 脚本主体

选项处理
可以使用`getopts`来解析命令行选项:
#!/bin/bash

while getopts "d:f:" opt; do
    case $opt in
        d) directory="$OPTARG" ;;
        f) file="$OPTARG" ;;
        *) echo "Usage: $0 [-d directory] [-f file]" ;;
    esac
done

4. 配置文件

使用配置文件
将配置选项存储在外部文件中,并在脚本中读取:
#!/bin/bash

# 读取配置文件
source /path/to/config.conf

# 使用配置参数
echo "Directory is $directory"
echo "Filename is $filename"

配置文件示例 (`config.conf`)
directory="/path/to/directory"
filename="backup_$(date +%F).tar.gz"

5. 错误处理和调试

错误处理 
处理命令的返回值以确保脚本的健壮性:
#!/bin/bash

cp "$source_file" "$destination"
if [ $? -ne 0 ]; then
    echo "Error: Failed to copy file"
    exit 1
fi

调试 
使用`set -x`来显示命令执行过程,有助于调试:


#!/bin/bash

set -x  # 开始调试
echo "Starting the script"
# 你的脚本内容
set +x  # 结束调试

设置严格模式  
使用`set -e`、`set -u` 和 `set -o pipefail`来提高脚本的健壮性:
#!/bin/bash

set -euo pipefail

# 脚本内容
- set -e:遇到错误时退出脚本。
- set -u:使用未初始化的变量时退出脚本。
- set -o pipefail:管道中任何命令失败时退出脚本。

6. 日志记录

输出日志  
将脚本的输出和错误记录到日志文件中:

#!/bin/bash

log_file="/path/to/logfile.log"

exec > >(tee -a "$log_file") 2>&1

echo "Starting script"
# 脚本内容

这里使用了`exec`来重定向标准输出和标准错误到日志文件中,并使用`tee`来将日志同时输出到终端和文件中。

7. 定时任务

使用Cron定时执行脚本
编辑crontab文件来定期运行脚本:


crontab -e


添加定时任务,例如每天凌晨1点运行脚本:

0 1 * * * /path/to/script.sh
 

示例脚本

以下是一个配置化的Shell脚本示例,它包括了参数处理、错误处理、日志记录等功能:


#!/bin/bash

# 配置
log_file="/var/log/myscript.log"
source_dir="/path/to/source"
backup_dir="/path/to/backup"
timestamp=$(date +"%Y-%m-%d_%H-%M-%S")

# 处理输入参数
while getopts "s:b:" opt; do
    case $opt in
        s) source_dir="$OPTARG" ;;
        b) backup_dir="$OPTARG" ;;
        *) echo "Usage: $0 [-s source_dir] [-b backup_dir]" ;;
    esac
done

# 记录日志
exec > >(tee -a "$log_file") 2>&1

echo "Starting backup at $timestamp"

# 执行备份
tar -czf "$backup_dir/backup_$timestamp.tar.gz" "$source_dir"
if [ $? -ne 0 ]; then
    echo "Backup failed"
    exit 1
else
    echo "Backup successful"
fi

在Linux中,`man test` 指的是查看 `test` 命令的手册页。`test` 是一个用于在Shell脚本中执行条件测试的命令,通常用于判断文件属性或比较值。这个命令也可以用 `[` 和 `]` 替代,这两个符号通常用作条件判断。

`test` 命令简介

`test` 命令用于检查文件属性、字符串和整数等条件,并返回一个退出状态码。它的退出状态码(通常是 `$?`)用于指示测试结果:返回 `0` 表示测试条件为真(true),返回 `1` 表示测试条件为假(false)。

基本语法


test EXPRESSION
 

或者使用 `[` 和 `]` 作为替代:


[ EXPRESSION ]
 

常用测试选项

1. 文件测试

- `-e FILE`: 检查文件是否存在。
- `-f FILE`: 检查文件是否存在且为普通文件。
- `-d FILE`: 检查文件是否存在且为目录。
- `-r FILE`: 检查文件是否存在且可读。
- `-w FILE`: 检查文件是否存在且可写。
- `-x FILE`: 检查文件是否存在且可执行。

示例:


if [ -f "/path/to/file" ]; then
    echo "File exists and is a regular file."
else
    echo "File does not exist or is not a regular file."
fi
 

2. 字符串测试

- `-z STRING`: 检查字符串是否为空。
- `-n STRING`: 检查字符串是否非空。
- `STRING1 = STRING2`: 检查两个字符串是否相等。
- `STRING1 != STRING2`: 检查两个字符串是否不相等。

示例:


if [ -z "$var" ]; then
    echo "Variable is empty."
else
    echo "Variable is not empty."
fi
 

3. 整数比较

- `INT1 -eq INT2`: 检查两个整数是否相等。
- `INT1 -ne INT2`: 检查两个整数是否不相等。
- `INT1 -lt INT2`: 检查第一个整数是否小于第二个整数。
- `INT1 -le INT2`: 检查第一个整数是否小于或等于第二个整数。
- `INT1 -gt INT2`: 检查第一个整数是否大于第二个整数。
- `INT1 -ge INT2`: 检查第一个整数是否大于或等于第二个整数。

示例:
a=5
b=10
if [ $a -lt $b ]; then
    echo "$a is less than $b."
else
    echo "$a is not less than $b."
fi

手册页 (`man test`)

你可以使用 `man test` 命令查看 `test` 命令的详细手册页。手册页会包含所有支持的选项和用法示例。要查看手册页,请在终端中运行:
man test

示例脚本

以下是一个使用 `test` 命令的完整Shell脚本示例,用于检查文件属性和变量值:
#!/bin/bash

file="/path/to/file"
var="Hello"

# 检查文件是否存在且为普通文件
if [ -f "$file" ]; then
    echo "File exists and is a regular file."
else
    echo "File does not exist or is not a regular file."
fi

# 检查变量是否为空
if [ -z "$var" ]; then
    echo "Variable is empty."
else
    echo "Variable is not empty."
fi

# 比较两个整数
a=5
b=10
if [ $a -lt $b ]; then
    echo "$a is less than $b."
else
    echo "$a is not less than $b."
fi

在编写Shell脚本时,`test` 命令是一个非常有用的工具,用于条件判断和逻辑控制。

相关文章:

linux系统编程中Shell脚本配置,及linux脚本中的man test

Shell脚本配置是指在脚本中设置各种参数、选项和环境&#xff0c;以确保脚本能够根据预期的需求和环境执行。配置可以包括变量设置、环境变量、命令选项和错误处理等。 1. 脚本开头的配置 Shebang 第一行通常是shebang&#xff0c;它告诉系统使用哪个解释器来执行脚本。例如…...

Win7虚拟机分享(已安装VMware Tools)

前言 之前写过VMware安装Win7并安装VMware tools的博客&#xff0c;但操作仍显繁琐。后来发现可以直接分享已经配置好的虚拟机&#xff0c;所有软件都是安装好的&#xff0c;解压即用。 一. VMware Win7虚拟机配置 已完成的配置和安装的软件 专业版Win7系统(已永久激活)VMware…...

CANOpen EMCY紧急报文介绍

什么是CANOpen紧急报文 CANOpen中的Emcy紧急报文用于当设备出现故障或警告时&#xff0c;向其它节点报告故障或警告使用的。如设备某个设备出现过压或过流时&#xff0c;就可以发送紧急报文。 紧急报文的格式 错误代码&#xff1a;是0x1003索引预定义错误字段的内容&#xff…...

JAVA项目

目录 一、前言 二、技术介绍 三、项目实现流程 四、论文流程参考 五、核心代码截图 专注于大学生实战开发、讲解和毕业答疑等辅导&#xff0c;获取源码后台 一、前言 在数字化音乐时代&#xff0c;个性化推荐已成为提升用户体验、促进音乐消费的重要手段。为此&#xff0…...

️ LangChain +Streamlit+ Llama :将对话式人工智能引入您的本地设备(下篇)

引言&#xff1a;种下一棵树最好的时间是十年前,其次是现在 书接上回&#xff1a;将对话式人工智能引入您的本地设备成为可能CSDNhttps://mp.csdn.net/mp_blog/creation/editor/140865426 目的&#xff1a;在这个大模型横行的时候&#xff0c;我们常用电脑如何开展大模型的工作…...

Kafka实战(Scala操作)

Kafka基础讲解部分 Kafka基础讲解部分 Kafka实战&#xff08;Scala操作&#xff09; 1、引入依赖 版本&#xff1a; <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.report…...

Android Framework 之WMS详解

1.WMS说的就是 WindowManagerService&#xff1a;负责为Activity对应的窗口分配Surface&#xff0c;管理Surface的显示顺序以及位置尺寸&#xff0c;控制窗口动画 。 它是Android系统中为各个客户端即每个app来提供这样的服务的一个类。 在Android系统中在systemServer 进程和各…...

opencv-图像仿射变换

仿射变换设计图像位置角度的变化&#xff0c;是深度学习预处理中常用的功能。仿射变换就是对图像的平移缩放旋转翻转操作的组合 如下图&#xff0c;对图中点1,2,3与图二中三个点一一映射&#xff0c;仍然形成三角形&#xff0c;但形状已经发生改变&#xff0c;通过这两组三点求…...

算法的基本概念

一、算法的基本概念思维导图 二、什么是算法&#xff1a; 1.我们知道数据结构就是将我门现实的世界中的问题数据化&#xff0c;存入计算机中&#xff0c;并实现对数据结构的一些基本操作。 2.算法就是如何处理这些存入计算机中的信息&#xff0c;以求高效的解决实际问题。 3…...

124. Go Template应用实例:用代码生成代码

文章目录 生成器模式生成器代码生成 本文用生成器模式作为例子&#xff0c;来演示如何用代码生成代码。 生成器模式 熟悉 Java 开发的同学都知道&#xff0c;lombok 有一个著名的注解 Builder &#xff0c;只要加在类上面&#xff0c;就可以自动生成 Builder 模式的代码。如下…...

【AI实践】阿里云方言文本转语音TTS

最近要做一些普通话和方言demo 找一个免费工具 免费在线文字转语音工具 | edge-tts 在线体验 (bingal.com) 还有一些方言在阿里云上找了下&#xff0c;基于官方demo改了一下 阿里云语音合成接口说明_智能语音交互(ISI)-阿里云帮助中心 (aliyun.com) 如何下载安装、使用语音…...

java 之 各类日期格式转换

一、前言 大家在开发过程中必不可少得和日期打交道&#xff0c;对接别的系统时&#xff0c;时间日期格式不一致&#xff0c;每次都要转换! 从 Java1 到 Java8 将近 20 年&#xff0c;再加上 Java8 的普及时间、各种历史 API 兼容过渡时间。我们很多时候需要在旧时间 API 与新时…...

Nvidia黄仁勋对话Meta扎克伯格:AI和下一代计算平台的未来 | SIGGRAPH 2024对谈回顾

在今年的SIGGRAPH图形大会上&#xff0c;Nvidia创始人兼CEO黄仁勋与Meta创始人马克扎克伯格进行了一场长达60分钟的对谈。这场对话不仅讨论了AI的未来发展和Meta的开源哲学&#xff0c;还发布了不少新产品&#xff0c;并深入探讨了下一代计算平台的可能性。 引言 人工智能的发…...

【JAVA设计模式】适配器模式——类适配器模式详解与案例分析

前言 在软件设计中&#xff0c;适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在使不兼容的接口能够协同工作。它通过引入一个适配器类&#xff0c;帮助两个接口之间进行适配&#xff0c;使得它们能够互相操作。本文将详细介绍适配器模…...

【Vue】全局组件和局部组件

一、全局组件 定义&#xff1a; 全局组件是在整个Vue应用中都可以使用的组件。它们被注册在Vue的根实例上&#xff0c;因此可以在任何子组件的模板中被引用&#xff0c;而无需在每个组件中重复注册。 注册方式&#xff1a; 全局组件通过Vue.component方法进行注册。这个方法接…...

react引入高德地图并初始化卫星地图

react引入高德地图并初始化卫星地图 1.安装依赖 yarn add react-amap amap/amap-jsapi-loader2.初始化地图 import AMapLoader from "amap/amap-jsapi-loader"; import { FC, useEffect, useRef, useState } from "react";const HomeRight () > {con…...

2024最简七步完成 将本地项目提交到github仓库方法

2024最简七步完成 将本地项目提交到github仓库方法 文章目录 2024最简七步完成 将本地项目提交到github仓库方法一、前言二、具体步骤1、github仓库创建2、将远程仓库拉取并合并&#xff08;1&#xff09;初始化本地仓库&#xff08;2&#xff09;本地仓库与Github仓库关联&…...

前端WebSocket入门,看这篇就够啦!!

在HTML5 的早期开发过程中&#xff0c;由于意识到现有的 HTTP 协议在实时通信方面的不足&#xff0c;开发者开始探索能够在 Web 环境下实现双向实时通信的新的通信协议&#xff0c;提出了 WebSocket 协议的概念。 一、什么是 WebSocket&#xff1f; WebSocket 是一种在单个 T…...

漏洞复现-F6-11泛微-E-Cology-SQL

本文来自无问社区&#xff0c;更多漏洞信息可前往查看http://www.wwlib.cn/index.php/artread/artid/15575.html 0x01 产品简介 泛微协同管理应用平台e-cology是一套企业级大型协同管理平台 0x02 漏洞概述 该漏洞是由于泛微e-cology未对用户的输入进行有效的过滤&#xff0…...

Turbo Boost 禁用

最近在做OAI NR的时候关闭CPU 睿频的时候出了一些问题&#xff0c;这里我把我找到的资料记录一下&#xff1a; 禁用 Turbo Boost 的过程可能会因不同的 BIOS/UEFI 和操作系统设置而有所不同。以下是一些可能的原因及解决方法&#xff1a; 可能的原因 BIOS/UEFI 设置问题: 你的…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...