【Linux知识】shell编程知识科普
文章目录
- 概述
- 文件格式
- 语法及例子
- 文件读写
- 文件读取
- 文件写入
- 错误处理
- 后台执行shell
- 1. 使用 `&` 符号
- 2. 使用 `nohup` 命令
- 3. 使用 `screen` 或 `tmux`
- 使用 `screen`
- 使用 `tmux`
- 4. 使用 `disown` 命令
- 5. 使用系统服务管理器(如 `systemd`)
概述
Linux shell脚本文件通常使用.sh作为扩展名,但实际上这不是强制性的,关键在于文件的内容要遵循shell的语法规则。以下是对Linux shell脚本文件格式及语法的详细解释,并为每个语法提供了对应的使用例子。
文件格式
- 扩展名:通常使用
.sh,例如script.sh。 - 执行权限:通过
chmod +x script.sh赋予执行权限。 - Shebang:文件的第一行通常是
#!/bin/bash或#!/usr/bin/env bash,指定了脚本的解释器。
语法及例子
- 变量
#!/bin/bash
# 定义变量
myvar="Hello, World!"
# 使用变量
echo $myvar
- 特殊变量
#!/bin/bash
# 脚本名
echo "Script name: $0"
# 位置参数
echo "First argument: $1"
echo "Second argument: $2"
# 参数个数
echo "Number of arguments: $#"
# 所有参数
echo "All arguments: $@"
运行此脚本时,可以传递参数,如./script.sh arg1 arg2。
- 运算符
算术运算符
#!/bin/bash
# 算术运算
a=5
b=3
sum=$((a + b))
echo "Sum: $sum"
字符串运算符
#!/bin/bash
# 字符串比较
str1="hello"
str2="world"
if [ "$str1" != "$str2" ]; thenecho "Strings are not equal"
fi
文件测试运算符
#!/bin/bash
# 文件测试
file="testfile.txt"
if [ -e "$file" ]; thenecho "File exists"
elseecho "File does not exist"
fi
- 条件语句
if语句
#!/bin/bash
# if语句
num=10
if [ $num -gt 5 ]; thenecho "Number is greater than 5"
fi
case语句
#!/bin/bash
# case语句
var="apple"
case $var inapple)echo "Fruit";;carrot)echo "Vegetable";;*)echo "Unknown";;
esac
- 循环语句
for循环
#!/bin/bash
# for循环
for i in 1 2 3 4 5; doecho "Number: $i"
done
或使用C风格的for循环
#!/bin/bash
# C风格for循环
for ((i=1; i<=5; i++)); doecho "Number: $i"
done
while循环
#!/bin/bash
# while循环
counter=1
while [ $counter -le 5 ]; doecho "Counter: $counter"((counter++))
done
until循环
#!/bin/bash
# until循环
counter=1
until [ $counter -gt 5 ]; doecho "Counter: $counter"((counter++))
done
- 函数
#!/bin/bash
# 定义函数
myfunc() {echo "This is a function"
}# 调用函数
myfunc
- 输入与输出
echo
#!/bin/bash
# 输出文本
echo "Hello, World!"
read
#!/bin/bash
# 读取输入
echo "Enter your name: "
read name
echo "Hello, $name!"
重定向
#!/bin/bash
# 重定向输出到文件
echo "This will be written to a file" > output.txt# 追加输出到文件
echo "This will be appended to the file" >> output.txt
- 引号
单引号
#!/bin/bash
# 单引号,不解释变量
str='This is a string with $variable which will not be interpreted'
echo $str
双引号
#!/bin/bash
# 双引号,解释变量
str="This is a string with $variable which will be interpreted"
variable="a variable"
echo $str
反引号(或$(command))
#!/bin/bash
# 命令替换
date=`date`
echo "Current date and time: $date"# 或者使用$()
current_date=$(date)
echo "Current date and time using $(): $current_date"
- 注释
#!/bin/bash
# 这是一个单行注释:<<'EOF'
这是一个多行注释块,
虽然它实际上是通过使用:命令和here document语法
来创建的,但它看起来像一个多行注释。
EOF
echo "This is not part of the comment block"
请注意,上面的多行注释方法并不是shell的标准特性,而是利用了:命令(它是一个空操作,通常用作占位符或用于忽略命令的输出)和here document语法。在某些shell中,这种方法可能不起作用或行为不同。对于真正的多行注释,通常建议使用单行注释逐行注释掉代码。
文件读写
Shell脚本中的文件读写是一项基础而重要的功能,它允许脚本从文件中读取数据,或者将数据写入文件中。以下是对Shell文件读写的详细介绍,并附有具体例子。
文件读取
Shell脚本读取文件内容通常包括打开文件、读取内容、关闭文件等步骤。可以使用内置的read命令或者重定向操作符来打开并读取文件。
- 使用
read命令读取文件
read命令可以从标准输入或者指定的文件描述符读取一行数据,并将其分配给变量。如果文件包含多行数据,可以将read命令放在循环中,以便逐行读取。
例子:
#!/bin/bash
# 逐行读取文件内容
while IFS= read -r line; doecho "Line: $line"
done < filename.txt
在这个例子中,IFS=确保行首和行尾的空白字符被保留,-r选项防止反斜杠转义。每次迭代,变量line都会被赋予文件中的下一行内容。
- 使用
cat命令读取文件
cat命令可以将文件内容输出到终端,或者使用重定向操作符将内容输出到变量或另一个文件中。
例子:
#!/bin/bash
# 使用cat命令读取文件内容到变量
file_content=$(cat filename.txt)
echo "$file_content"
或者将文件内容输出到另一个文件:
#!/bin/bash
# 使用cat命令将文件内容输出到另一个文件
cat filename.txt > anotherfile.txt
- 使用
while循环和cat命令结合读取文件
可以通过管道将cat命令的输出传递给while循环,并使用read命令逐行读取。
例子:
#!/bin/bash
# 使用while循环和cat命令结合读取文件
cat filename.txt | while read line; doecho "Line: $line"
done
文件写入
Shell脚本写入文件操作涉及到数据的输出。要进行文件写入,首先需要打开文件。如果文件不存在,可以使用>操作符创建一个新文件;如果文件已存在,则会清空原有内容。使用>>操作符可以在文件末尾追加内容。
- 覆盖写入文件
例子:
#!/bin/bash
# 覆盖写入文件
echo "This will overwrite the file." > filename.txt
在这个例子中,如果filename.txt文件存在,它的内容将被"This will overwrite the file."替换。如果文件不存在,将创建一个新文件。
- 追加写入文件
例子:
#!/bin/bash
# 追加写入文件
echo "This will be appended to the file." >> filename.txt
在这个例子中,如果filename.txt文件存在,"This will be appended to the file."将被追加到文件的末尾。如果文件不存在,将创建一个新文件并写入内容。
- 使用文件描述符写入文件
可以通过exec命令创建文件描述符,并使用该描述符进行文件写入。
例子:
#!/bin/bash
# 使用文件描述符写入文件
exec 4>filename.txt
echo "This will be written to the file using file descriptor 4." >&4
exec 4>&- # 关闭文件描述符
在这个例子中,exec 4>filename.txt创建了一个文件描述符4,并将其与filename.txt文件关联。然后,使用>&4将内容写入该文件。最后,使用exec 4>&-关闭文件描述符。
错误处理
在进行文件读写操作时,应当考虑到可能出现的错误,如文件不存在、没有读写权限等。可以使用if语句结合命令的执行状态码来检查并处理这些错误。
例子:
#!/bin/bash
# 检查文件是否存在并具有读权限
if [ ! -r filename.txt ]; thenecho "Error: File does not exist or read permission is denied." >&2exit 1
fi# 检查文件是否存在并具有写权限(覆盖写入)
if [ ! -w filename.txt ] || [ -e filename.txt && -n "$(cat filename.txt)" ]; thenecho "Error: File does not exist or write permission is denied, or file is not empty (for overwrite check)." >&2exit 1
fi# 读取和写入操作(省略具体实现)
在这个例子中,首先检查文件是否存在并具有读权限,然后检查文件是否存在并具有写权限(对于覆盖写入的情况,还检查文件是否为空)。如果任何检查失败,脚本将输出错误信息并退出。
后台执行shell
在 Linux 中,有多种方法可以将一个 Shell 脚本或命令在后台执行。以下是一些常用的方法:
1. 使用 & 符号
在命令的末尾添加 & 符号,可以将该命令放到后台执行。例如:
my_script.sh &
或者:
sleep 60 &
2. 使用 nohup 命令
nohup 命令用于在用户注销后继续运行命令。通常与 & 符号结合使用,以便将输出重定向到一个文件中(如果不希望输出显示在终端上)。例如:
nohup my_script.sh > output.log 2>&1 &
这里,> output.log 将标准输出重定向到 output.log 文件,2>&1 将标准错误也重定向到标准输出(即 output.log 文件)。
3. 使用 screen 或 tmux
screen 和 tmux 是两个强大的终端复用器,允许你在一个单独的终端会话中运行多个窗口或面板,并且可以在断开连接后重新连接到这些会话。
使用 screen
- 启动一个新的
screen会话:screen -S mysession - 在
screen会话中运行你的脚本或命令。 - 按
Ctrl-a然后按d键来分离(detach)会话。 - 使用以下命令重新连接到会话:
screen -r mysession
使用 tmux
- 启动一个新的
tmux会话:tmux new -s mysession - 在
tmux会话中运行你的脚本或命令。 - 按
Ctrl-b然后按d键来分离(detach)会话。 - 使用以下命令重新连接到会话:
tmux attach -t mysession
4. 使用 disown 命令
如果你已经在前台启动了一个命令,然后希望将其放到后台并使其不受当前 Shell 会话的影响,可以使用 Ctrl-z 暂停命令,然后使用 bg 将其放到后台,最后使用 disown 命令。例如:
my_script.sh
# 按 Ctrl-z 暂停命令
bg
# 获取后台作业的作业号(假设为 %1)
disown %1
5. 使用系统服务管理器(如 systemd)
对于需要长期运行的任务,可以考虑将其配置为 systemd 服务。创建一个服务单元文件(例如 /etc/systemd/system/my_service.service),然后启用并启动该服务。
服务单元文件示例:
[Unit]
Description=My Long Running Script[Service]
ExecStart=/path/to/my_script.sh
Restart=always
User=your_username[Install]
WantedBy=multi-user.target
启用并启动服务:
sudo systemctl enable my_service.service
sudo systemctl start my_service.service
以上方法可以根据具体需求选择使用。如果只是临时运行一些命令或脚本,& 和 nohup 通常就足够了。如果需要更复杂的会话管理或长期运行的任务管理,可以考虑使用 screen、tmux 或 systemd。
相关文章:
【Linux知识】shell编程知识科普
文章目录 概述文件格式语法及例子 文件读写文件读取文件写入错误处理 后台执行shell1. 使用 & 符号2. 使用 nohup 命令3. 使用 screen 或 tmux使用 screen使用 tmux 4. 使用 disown 命令5. 使用系统服务管理器(如 systemd) 概述 Linux shell脚本文件…...
小程序学习06——uniapp组件常规引入和easycom引入语法
目录 一 组件注册 1.1 组件全局注册 1.2 组件全局引入 1.3 组件局部引入 页面引入组件方式 1.3.1 传统vue规范: 1.3.2 通过uni-app的easycom 二 组件的类型 2.1 基础组件列表 一 组件注册 1.1 组件全局注册 (a)新建compoents文件…...
平安产险安徽分公司携手安徽中医药临床研究中心附属医院 共筑儿童安全防护网
为响应金融知识普及教育号召,平安产险安徽分公司联动安徽中医药临床研究中心附属医院,于近日在朝霞小学举办了一场儿童安全防范与健康守护活动。此次活动旨在提升学生的安全防范意识,守护儿童健康成长,同时有力推动金融知识与传统…...
C语言练习:求数组的最大值与最小值
文章目录 1. 提出任务2. 完成任务2.1 方法一:通过返回结构体指针来间接返回结果2.1.1 编写程序,实现功能2.1.2 运行程序,查看结果 2.2 方法二:通过参数传递数组,并在函数中修改传入的参数2.2.1 编写程序,实…...
c++ thread线程join、detach、joinable方法
(621条消息) 线程中断Thread的interrupt()方法_thread interrupt_萝卜阿咕咕的博客-CSDN博客 C/C编程:std::thread 详解-CSDN博客 #include <iostream> #include <thread>void do_some_work() {std::cout<<"Hello Concurrent World\n"…...
【算法刷题】leetcode hot 100 哈希篇
文章目录 1. 两数之和49. 字母异位词分组128. 最长连续序列总结 1. 两数之和 leetcode:https://leetcode.cn/problems/two-sum/description/?envTypestudy-plan-v2&envIdtop-100-liked暴力解决: public int[] twoSum(int[] nums, int target) {for …...
linux系统(ubuntu,uos等)连接鸿蒙next(mate60)设备
以前在linux上是用adb连接,现在升级 到了鸿蒙next,adb就不好用了。得用Hdc来了,在windows上安装了hisuit用的好好的,但是到了linux(ubuntu2204)下载安装了 下载中心 | 华为开发者联盟-HarmonyOS开发者官网,共建鸿蒙生…...
支付宝实名认证
实名认证后台服务主要涉及两个接口:人脸核身初始化接口、人脸核身结果查询接口 import com.alibaba.fastjson.JSONObject; import com.alipay.api.*; import com.alipay.api.domain.DatadigitalFincloudGeneralsaasFaceVerificationInitializeModel; import com.ali…...
GO随想:GO的并发等待
协程并发等待技术——WaitGroup 类型和 errgroup 包 waitgroup 阻塞等待多个并发任务执行完成。WaitGroup 类型主要包含下面几个方法。 func (wg *WaitGroup) Add(delta int) func (wg *WaitGroup) Done() func (wg *WaitGroup) Wait() 第一个是 Add 方法,在任务运…...
kubernetes第五天
1.容器的健康检查Probe(探针)之readinessProbe就绪探针 1.exec方式检查 #通过rc资源创建了三个pod,然后使用services资源,对外提供三个pod的容器的访问入口。 apiVersion: v1 kind: ReplicationController metadata:name: web-rc-readlinepr…...
扩散模型论文概述(三):Stability AI系列工作【学习笔记】
视频链接:扩散模型论文概述(三):Stability AI系列工作_哔哩哔哩_bilibili 本期视频讲的是Stability AI在图像生成的工作。 同样,第一张图片是神作,总结的太好了! 介绍Stable Diffusion之前&…...
JVM调优,参数在哪里设置的?
JVM调优,参数在哪里设置的? 在Java应用程序中,JVM(Java Virtual Machine)的调优通常通过设置JVM启动参数来实现。这些参数可以控制JVM的内存分配、垃圾回收策略、线程管理、性能优化等方面。 1. JVM参数的位置 JVM参…...
2024年最新Stable Diffusion 新手入门教程,安装使用及模型下载
一、安装要求: ① 操作系统:Windows10以后的系统 ② CPU:不做强制性要求 ③ 内存:推荐8G以上 ④ 显卡:必须是Nvidia的独立显卡,显存最低4G,推荐20系以后;A卡、核显只能用CPU跑 …...
Ubuntu 20.04安装gcc
一、安装GCC 1.更新包列表 user596785154:~$ sudo apt update2.安装gcc user596785154:~$ sudo apt install gcc3.验证安装 user596785154:~$ gcc --version二 编译C文件 1.新建workspace文件夹 user596785154:~$ mkdir workspace2.进入workspace文件夹 user596785154:~…...
IT运维的365天--024 闲置路由器关闭了dhcp,如何知道它的IP是啥
有时候各种原因,我们关闭了路由器的Dhcp,比如需要获取的无线IP和有线同一个网段的情况。时间久了,如果没做标记,大部分时候就会忘了路由器原来设置的是什么IP,没有路由器的对应IP,自然也无法进路由器后台去…...
kaggle竞赛:纽约出租车行程时间NYC Taxi Trip Duration
1.引言 作为一名(坦白说有点懒的)图像处理方向的研究生,说实话最近新开一个坑,可能是因为要寒假了比较无聊,这次带来的系列是kaggle数据处理竞赛的经典例题:纽约出租车行程时间问题。希望大家多多支持&…...
Freemarker模板进行判空
文章目录 freemarker判断对象是否为null使用 ?? 操作符使用 ?has_content 内建函数直接使用 ! 操作符取反 freemarker判断列表是否为空 freemarker判断对象是否为null 在 FreeMarker 模板引擎中,你可以使用内建的指令和条件判断来检测一个对象是否为 null。Free…...
C++ const关键字(八股总结)
作用 const修饰符用来定义常量,具有不可变性。 修饰变量,说明该变量不可以被改变;修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer&…...
Linux 清楚历史命令
在 Linux 中,执行完命令后,如果你想清除终端屏幕上的内容,可以使用以下几种方法: 1. 使用 clear 命令 clear 是 Linux 中最常用的清除屏幕命令。它会将终端屏幕清空,并将光标移动到屏幕左上角。 bash clear 2. 使用快…...
服务器双网卡NCCL通过交换机通信
1、NCCL变量设置 export CUDA_DEVICE_MAX_CONNECTIONS1 export NCCL_SOCKET_IFNAMEeno2 export NCCL_IB_DISABLE0 #export NCCL_NETIB export NCCL_IB_HCAmlx5_0,mlx5_1 export NCCL_IB_GID_INDEX3 export NCCL_DEBUGINFOGPUS_PER_NODE4MASTER_ADDR192.168.1.2 MASTER_PORT600…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
简单介绍C++中 string与wstring
在C中,string和wstring是两种用于处理不同字符编码的字符串类型,分别基于char和wchar_t字符类型。以下是它们的详细说明和对比: 1. 基础定义 string 类型:std::string 字符类型:char(通常为8位)…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
