- (꒪ꇴ꒪ ),Hello我是祐言QAQ
- 我的博客主页:C/C++语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍
- 快上🚘,一起学习,让我们成为一个强大的攻城狮!
- 送给自己和读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!
- 作者水平很有限,如果发现错误,请在评论区指正,感谢🙏
一、Shell 脚本简介
Shell 是一种命令行解释器,提供了用户与操作系统内核之间的接口。Shell 脚本是一种文本文件,其中包含一系列 Shell 命令,它们按照脚本的顺序执行。Shell 脚本通常用于自动化任务、批处理和系统管理。
一些基本的 Shell 脚本概念和元素包括:
- 变量: 存储和引用数据的标识符。
- 条件语句: 根据条件执行不同的命令。
- 循环结构: 重复执行一组命令。
- 函数: 将一组命令封装为可重复使用的代码块。
- 管道和重定向: 通过管道传递输出,重定向输入/输出到文件。
Shell 脚本可以使用不同的 Shell,如 Bash(Bourne Again SHell)、sh、zsh 等。它们有不同的语法和功能,但基本的概念在它们之间通常是相似的。 Shell 脚本是 Linux 和 Unix 系统中非常强大和灵活的自动化工具。
二、内容筛选保存
这个脚本的目标是从名为 download.lst
的文件中提取符合特定条件的行,然后保存到名为 output.txt
的文件中。脚本使用了 awk
来进行文本处理和筛选,并使用了一些基本的 Shell 命令来管理文件。
1.需求
在类似download.lst这样的文件中,我们都会遇到一些需要把其中的重要部分来筛选出来并保存的问题,发现我们需要的工具包都是以XXX_TARBALL的形式出现,并且是在:=后边。
因此我们的筛选方向就是不以#开头但包含‘ TARBALL ’的行中‘ := ’之后的部分就是我们先要的文件名,因此shell脚本如下:
#!/bin/bash
# 定义输入文件和输出文件
input_file="download.lst"
output_file="output.txt"
# 使用awk筛查并保存文件名
awk '!/^#/ && /TARBALL/ { # 不以#开头且包含TARBALL的行
sub(/^[^:]+:=/, "", $0); # 移除:=之前的部分
gsub(/^[[:space:]]+|[[:space:]]+$/, "", $0); # 去除行首和行尾的空白字符
print $0 # 输出处理过的行,即文件名
}' "$input_file" | tr -d ' ' > "$output_file" # 使用tr命令去除输出行中的空格
echo "筛查并保存完成,结果保存在$output_file中"
2.解释这个脚本
-
文件定义:
input_file="download.lst" output_file="output.txt"
定义了输入文件和输出文件的变量。
-
awk命令:
!/^#/ && /TARBALL/:不以 # 开头且包含 TARBALL 的行。awk '!/^#/ && /TARBALL/ { sub(/^[^:]+:=/, "", $0); gsub(/^[[:space:]]+|[[:space:]]+$/, "", $0); print $0 }' "$input_file"
sub(/^[^:]+:=/, "", $0):移除行中 := 之前的部分。
gsub(/^[[:space:]]+|[[:space:]]+$/, "", $0):去除行首和行尾的空白字符。
print $0:输出处理过的行,即文件名。 -
tr命令:
| tr -d ' '
使用管道将awk的输出传递给tr命令,
tr -d ' '
用于去除输出行中的空格。 -
输出信息:
> "$output_file"
将处理后的结果保存到输出文件中。
-
最后echo语句:
echo "筛查并保存完成,结果保存在$output_file中。"
输出一个提示消息。
在筛查时遇到了有变量替换的地方,如下:
这里呢提供一个极少目标用export定义变量然后sed命令替换的方法。
脚本源码修改为:
#!/bin/bash
export CAIRO_VERSION_MICRO=0
export ETONYEK_VERSION_MICRO=9
# 定义输入文件和输出文件
input_file="download.lst"
output_file="output.txt"
# 使用awk筛查并保存文件名
awk '!/^#/ && /TARBALL/ { # 不以#开头且包含TARBALL的行
sub(/^[^:]+:=/, "", $0); # 移除:=之前的部分
gsub(/^[[:space:]]+|[[:space:]]+$/, "", $0); # 去除行首和行尾的空白字符
print $0 # 输出处理过的行,即文件名
}' "$input_file" | tr -d ' ' | sed -e "s/\$(CAIRO_VERSION_MICRO)/$CAIRO_VERSION_MICRO/g" \
-e "s/\$(ETONYEK_VERSION_MICRO)/$ETONYEK_VERSION_MICRO/g" > "$output_file"
echo "筛查并保存完成,结果保存在$output_file中"
三、文件下载
这个脚本的目标是从一个名为 outputlist.txt
的文件中读取文件名,然后根据指定的 URL 前缀下载这些文件。脚本使用了 curl
命令来执行下载,并使用了 while
循环来逐行读取文件名。其中的网址或者具体命令还需自行修改。
#!/bin/bash
# 网址前缀
url_prefix="https://dev-www.libreoffice.org/src/"
# 从outputlist.txt逐行读取文件名
while IFS= read -r file_name; do
# 删除文件名中的回车符
file_name=$(echo "$file_name" | tr -d '\r')
# URL编码文件名
encoded_file_name=$(printf "%s" "$file_name" | jq -s -R -r @uri)
# 拼接完整的下载链接
download_url="$url_prefix$encoded_file_name"
# 使用curl下载文件
curl -k -L -O "$download_url"
done < outputlist.txt
# 输出下载完成的信息
echo "文件下载完成。"
成功下载的界面:
四、扩展安装与错误分析
在运行过程中呢,如果未安装一下三个中的任意一个都会报错,依次按提示安装即可。
sudo apt-get install dos2unix
install dos2unix
: 安装名为dos2unix
的软件包,该软件包提供了将文本文件从 DOS 格式(回车换行)转换为 Unix 格式(换行符)的工具。
这个命令对于处理不同操作系统格式的文本文件很有用,例如在 Windows 上创建的文本文件,因为它们使用不同的换行符。
sudo apt install curl
install curl
: 安装名为curl
的软件包,curl
是一个用于在命令行中进行网络请求的工具,支持多种协议。
这个命令安装了 curl
工具,使你能够方便地从命令行中下载文件或访问 Web 服务。
sudo apt-get install jq
install jq
: 安装名为jq
的软件包,jq
是一个轻量级的命令行 JSON 处理工具。
这个命令安装了 jq
,它对于处理和解析 JSON 数据非常方便,是在 Shell 脚本中进行 JSON 处理的有用工具。
这个错误提示表明 curl
在执行HTTPS请求时遇到了证书验证的问题。有几种可能的解决方案:
-
信任证书: 确保你的系统上的证书是最新的。你可以尝试更新证书:
- 在 Ubuntu 上,可以运行
sudo apt-get install --reinstall ca-certificates
。 - 在 CentOS 上,可以运行
sudo yum reinstall ca-certificates
.
- 在 Ubuntu 上,可以运行
-
使用
-k
选项: 在curl
命令中添加-k
或--insecure
选项,以跳过对证书的验证。请注意,这会降低安全性,因为它将禁用对服务器证书的验证,只有在你确信目标网站是可信任的情况下才使用。(推荐直接-k)curl -k -L -O "$download_url"
-
指定证书文件: 使用
--cacert
选项指定一个证书文件:curl --cacert /path/to/ca-certificates.crt -L -O "$download_url"
更多C/C++语言、Linux系统、数据结构和ARM板实战相关文章,关注专栏:
手撕C语言
玩转linux
脚踢数据结构
系统、网络编程
探索C++
6818(ARM)开发板实战
📢写在最后
- 今天的分享就到这啦~
- 觉得博主写的还不错的烦劳
一键三连喔
~ - 🎉🎉🎉感谢关注🎉🎉🎉