跟着GPT学习shell脚本,理论与实践相结合的学习计划。

学习计划:初学者到高手

第1-2周:基础入门
  • 目标:了解Shell脚本的基本概念,掌握基础命令。
  • 内容
    • Shell脚本是什么,为什么使用Shell脚本。
    • 基本的Shell命令(如ls, cd, mkdir, rm等)。
    • 简单的脚本编写和执行方法。
  • 实践:编写一个简单的脚本,比如一个自动创建和删除文件夹的脚本。
第3-4周:进阶学习
  • 目标:学习Shell脚本的控制结构和数据处理。
  • 内容
    • 条件判断(if-else)和循环(for,while)。
    • 文件和字符串的基本操作。
    • 简单的函数使用。
  • 实践:编写一个更复杂的脚本,比如一个自动备份文件的脚本。
第5-8周:高级应用
  • 目标:掌握Shell脚本的高级特性,提高效率。
  • 内容
    • 高级数据处理(如awk, sed)。
    • 脚本的调试和错误处理。
    • 性能优化。
  • 实践:编写一个复杂的数据处理脚本或自动化任务脚本。
第9-12周:项目实战
  • 目标:通过实际项目来巩固和提高。
  • 内容
    • 选择一个实际项目,如自动化部署脚本。
    • 从规划到实现,完整的项目流程。
  • 实践:完成项目,进行测试和优化。
持续学习:
  • 继续关注Shell脚本的新特性和最佳实践。
  • 加入在线社区,如GitHub,参与开源项目

第1周:Shell脚本基础入门

学习目标
  • 了解Shell脚本的基本概念。
  • 掌握基础的Shell命令。
  1. Shell脚本简介

    • 定义:Shell脚本是一种用来自动化执行多个命令的脚本语言。它是在Unix或Linux操作系统上运行的一种程序,用来方便地执行命令序列。
    • 作用:自动化任务处理,如文件管理、程序执行、文本处理等。
  2. 基础Shell命令

    • ls:列出目录内容。
    • cd [目录]:更改当前目录。
    • mkdir [目录名]:创建新目录。
    • rm [文件或目录]:删除文件或目录。
    • echo [文本]:显示一行文本。
  3. 编写和执行简单脚本

    • 创建一个文本文件,如my_script.sh
    • 在文件中写入Shell命令,如echo "Hello, Shell!"
    • 通过在终端中输入bash my_script.sh来执行脚本。
实践任务
  • 任务:编写一个简单的Shell脚本,该脚本能够创建一个名为test_dir的目录,然后在该目录中创建一个名为hello.txt的文件,并在文件中写入Hello, Shell!
  • 步骤
    1. 打开文本编辑器,创建一个新文件,命名为create_dir_and_file.sh
    2. 编写脚本内容
#!/bin/bash
mkdir test_dir
echo "Hello, Shell!" > test_dir/hello.txt

                  3. 保存文件,并在终端中运行脚本。
                  4. 检查test_dir目录和hello.txt文件是否已创建,并查看文件内容。

第2周:深入理解和练习基础命令

学习目标
  • 掌握更多的基础Shell命令。
  • 学会使用命令参数和选项。
  1. 深入基础命令

    • cp [源文件] [目标位置]:复制文件或目录。
    • mv [源文件] [目标位置]:移动文件或目录,也可用于重命名。
    • grep [模式] [文件]:搜索文件中的文本。
    • find [路径] [选项]:在目录中查找文件。
  2. 命令参数和选项

    • 大多数命令都有参数和选项可以使用,以增强其功能。
    • 例如,ls -l(以长格式列出文件详细信息),grep -i(忽略大小写进行搜索)。
  3. 管道和重定向

    • 管道 |:将一个命令的输出作为另一个命令的输入。例如,ls | grep "txt" 会找出所有包含"txt"的文件名。
    • 重定向 >>>:用于将命令的输出保存到文件中。例如,echo "Hello" > file.txt 会创建或覆盖文件file.txt,并写入"Hello"。
实践任务
  • 任务:编写一个Shell脚本,该脚本能完成以下功能:
    1. 在当前目录下创建一个名为practice的新目录。
    2. practice目录中创建几个测试文件。
    3. 使用grep命令查找包含特定文本的文件。
    4. grep命令的输出重定向到一个新文件中。
#!/bin/bash
mkdir practice
cd practice
echo "Test file 1" > test1.txt
echo "Another test file 2" > test2.txt
echo "Different file 3" > test3.txt
grep "test" *.txt > results.txt

第3周:探索控制结构和数据处理

学习目标
  • 理解并使用Shell脚本的控制结构。
  • 学习文件和字符串的基本操作。

控制结构

  • 条件判断if-else):根据条件执行不同的命令。
if [ 条件 ]; then命令
else另一些命令
fi

循环forwhile):重复执行一系列命令。

  for 循环示例:

for i in 1 2 3; doecho $i
done

   while 循环示例:

count=1
while [ $count -le 3 ]; doecho $count((count++))
done

        脚本中的比较符号:

shell脚本中-eq、-ne、-gt、-ge、-lt、-le_shell脚本中-gt-CSDN博客

文件和字符串操作

  • 读取文件内容:使用 cat 或循环逐行读取。
  • 字符串操作:比较、连接和提取字符串。
  • 例如,字符串比较:if [ "$str1" == "$str2" ]; then
实践任务
  • 任务:编写一个Shell脚本,实现以下功能:
    1. 创建一个包含多个数字的文件。
    2. 读取文件中的数字,并计算它们的总和。
#!/bin/bash
echo -e "2\n4\n6" > numbers.txt
total=0
while read num; dototal=$((total + num))
done < numbers.txt
echo "Total sum is: $total"
  1. #!/bin/bash

    • 这是一个"shebang"行,用于指示脚本应该用哪个解释器来执行。在这个例子中,它指定使用bash来执行这个脚本。
  2. echo -e "2\n4\n6" > numbers.txt

    • echo命令用于输出文本。
    • -e选项允许echo解释转义字符,如\n(新行)。
    • "2\n4\n6"是被输出的字符串,包含数字2、4和6,每个数字后面跟着一个换行符。
    • >是重定向符号,用于将echo命令的输出写入numbers.txt文件。如果文件已存在,则会被覆盖。
  3. total=0

    • 这行代码初始化变量total为0。在循环中,total将用于累加所有数字。
  4. while read num; do

    • 这是一个while循环的开始。循环会一直执行,直到读取文件的行结束。
    • read num命令读取输入(在这个例子中是文件numbers.txt的每一行)并将其存储在变量num中。
  5. total=$((total + num))

    • 这行代码更新变量total的值。它使用$((...))来进行算术运算,将total的当前值加上变量num的值。
  6. done < numbers.txt

    • 这是while循环的结束部分。
    • < numbers.txtnumbers.txt文件的内容重定向到while循环中,即read命令读取的输入来自于这个文件。
  7. echo "Total sum is: $total"

    • 最后,这行代码输出计算得到的总和。
    • 这里使用了双引号来允许变量$total在字符串中被扩展(即替换为其值)。

 第4周:深入学习Shell函数和文本处理

学习目标
  • 理解并使用Shell函数。
  • 学习基础的文本处理工具。

Shell函数

  • 函数允许您将代码组织成可重用的模块。
  • 基本语法:
function_name () {# 函数体命令
}

文本处理工具

  • sed:流编辑器,用于执行文本替换、删除、插入等操作。
  • awk:强大的文本分析工具,适用于模式扫描和处理。
  • 示例:使用awk来分析文件并输出特定列。
实践任务
  • 任务:编写一个Shell脚本,实现以下功能:
    1. 使用函数来组织代码。
    2. 使用sedawk对文本文件进行处理。
#!/bin/bash# 定义一个函数
print_file () {cat $1
}# 使用sed来替换文本
replace_text () {sed -i 's/old/new/g' $1
}echo "Creating a sample file..."
echo "This is old text" > sample.txtecho "Before replacement:"
print_file sample.txtecho "Replacing text..."
replace_text sample.txtecho "After replacement:"
print_file sample.txt
  1. #!/bin/bash

    • 这行是shebang,它告诉系统使用bash解释器来执行这个脚本。
  2. 定义函数 print_file

    • print_file () {
      • 这行开始定义一个名为print_file的函数。
    • cat $1
      • cat命令用于显示文件的内容。$1是函数的第一个参数,在这里它将被解释为传递给函数的文件名。
    • }
      • 这行结束函数定义。
  3. 定义函数 replace_text

    • replace_text () {
      • 开始定义一个名为replace_text的函数。
    • sed -i 's/old/new/g' $1
      • 这行使用sed命令对文件进行文本替换。-i表示原地编辑文件。's/old/new/g'sed的替换命令,意味着将所有出现的“old”替换为“new”。$1代表函数的第一个参数,即要处理的文件名。
    • }
      • 结束函数定义。
  4. 脚本主体:

    • echo "Creating a sample file..."
      • 输出提示信息。
    • echo "This is old text" > sample.txt
      • 创建一个名为sample.txt的新文件,并写入文本“This is old text”。
    • echo "Before replacement:"
      • 输出提示信息。
    • print_file sample.txt
      • 调用print_file函数,将sample.txt作为参数传递,打印文件内容。
    • echo "Replacing text..."
      • 输出提示信息。
    • replace_text sample.txt
      • 调用replace_text函数,将sample.txt作为参数传递,对文件进行文本替换。
    • echo "After replacement:"
      • 输出提示信息。
    • print_file sample.txt
      • 再次调用print_file函数,打印替换文本后的文件内容。

第5周:学习高级数据处理和脚本调试

学习目标
  • 掌握使用awksed进行高级文本处理。
  • 学习Shell脚本的调试技巧。
学习内容
  1. 高级文本处理

    • awk高级用法:处理复杂文本格式,如字段提取、模式匹配、统计信息等。
    • sed高级用法:进行更复杂的文本替换和删除操作。
  2. 脚本调试

    • 使用set -xset +x在脚本中开启和关闭调试模式。
    • 使用bash -x your_script.sh来运行脚本,以显示每个命令及其参数。
实践任务
  • 任务:编写一个Shell脚本,使用awk处理文本文件,并包含脚本调试元素。
#!/bin/bash
set -x  # 开启调试# 使用awk处理文本
process_text_with_awk () {awk '{print $1, $3}' $1
}echo "Creating a sample file..."
echo -e "1 apple 3.5\n2 banana 4.2\n3 cherry 2.8" > fruits.txtecho "Processed text:"
process_text_with_awk fruits.txtset +x  # 关闭调试
  1. set -x

    • 这行命令开启了脚本的调试模式。在调试模式下,脚本会打印每个命令及其扩展后的参数到标准输出,帮助理解脚本的执行过程。
  2. 定义函数 process_text_with_awk

    • process_text_with_awk () {
      • 这行开始定义一个名为process_text_with_awk的函数。
    • awk '{print $1, $3}' $1
      • 使用awk命令处理文本。awk会读取传入的文件(在这个例子中是函数的第一个参数$1),并对每一行执行花括号内的操作。这里的操作是打印每行的第一个和第三个字段,字段默认由空格分隔。
    • }
      • 这行结束函数的定义。
  3. 创建示例文件:

    • echo "Creating a sample file..."
      • 打印提示信息。
    • echo -e "1 apple 3.5\n2 banana 4.2\n3 cherry 2.8" > fruits.txt
      • 创建一个名为fruits.txt的新文件,并写入三行文本。每行包含一个数字、一个水果名和一个价格,字段间由空格分隔。
  4. 调用函数处理文本:

    • echo "Processed text:"
      • 打印提示信息。
    • process_text_with_awk fruits.txt
      • 调用process_text_with_awk函数,并传入fruits.txt作为参数。
  5. set +x

    • 这行命令关闭了脚本的调试模式。执行到这一行时,脚本会停止打印后续命令的执行细节。

 

第6周:Shell脚本的错误处理和性能优化

学习目标
  • 学习在Shell脚本中处理错误。
  • 了解如何优化Shell脚本的性能。
学习内容
  1. 错误处理

    • 使用set -e使脚本在出现错误时立即退出。
    • 使用trap命令捕获并处理信号和脚本退出。
    • 检查命令的返回值来决定是否继续执行。
  2. 性能优化

    • 避免在循环中使用管道和外部命令。
    • 使用内建命令和shell功能而不是外部程序。
    • 减少不必要的文件读写操作。
实践任务
  • 任务:编写一个Shell脚本,包含错误处理和性能优化的元素。
#!/bin/bash
set -e  # 出现任何错误时退出脚本trap 'echo "Error occurred at $LINENO"; exit 1' ERR# 一个可能失败的操作
possibly_failing_operation () {false  # 这个命令会失败
}# 性能优化的操作
optimized_operation () {for i in {1..1000}; do: # 内建的空操作done
}echo "Running possibly failing operation..."
possibly_failing_operationecho "Running optimized operation..."
optimized_operationecho "Script completed successfully."

trap 'echo "Error occurred at $LINENO"; exit 1' ERR

  • trap命令用于在脚本接收到指定的信号时执行特定的操作。在这里,它被配置为在脚本因任何错误而退出时(接收到ERR信号),输出错误发生的行号($LINENO变量)并以状态1退出。

 

第7周:探索Shell脚本中的数组和字符串操作

学习目标
  • 理解并使用Shell脚本中的数组。
  • 掌握字符串操作和处理技巧。
学习内容
  1. 数组操作

    • 创建和使用数组:array=(元素1 元素2 元素3)
    • 访问数组元素:${array[索引]}
    • 获取数组长度:${#array[@]}
    • 循环遍历数组元素。
  2. 字符串操作

    • 字符串拼接:直接将字符串放在一起。
    • 子字符串提取:${字符串:起始位置:长度}
    • 字符串替换:${字符串/旧字符串/新字符串}
实践任务
  • 任务:编写一个Shell脚本,实现数组和字符串的操作。
#!/bin/bash# 数组操作
fruits=("apple" "banana" "cherry")
echo "First fruit: ${fruits[0]}"
echo "All fruits: ${fruits[@]}"
echo "Number of fruits: ${#fruits[@]}"# 字符串操作
greeting="Hello, World!"
echo "Substring: ${greeting:7:5}"
replaced_greeting=${greeting/World/Shell}
echo "Replaced Greeting: $replaced_greeting"
  1. 数组操作部分

    • fruits=("apple" "banana" "cherry")
      • 这行创建了一个名为fruits的数组,包含三个元素:applebananacherry
    • echo "First fruit: ${fruits[0]}"
      • 这行打印数组fruits的第一个元素(索引为0)。结果是apple
    • echo "All fruits: ${fruits[@]}"
      • 这行打印数组fruits的所有元素。${fruits[@]}表示数组中的所有元素。
    • echo "Number of fruits: ${#fruits[@]}"
      • 这行打印数组fruits的长度,即它包含的元素数量。${#fruits[@]}用于获取数组长度。
  2. 字符串操作部分

    • greeting="Hello, World!"
      • 这行创建了一个名为greeting的字符串变量,内容为Hello, World!
    • echo "Substring: ${greeting:7:5}"
      • 这行打印字符串greeting从第7个字符开始的5个字符。结果是World
    • replaced_greeting=${greeting/World/Shell}
      • 这行将字符串greeting中的World替换为Shell,并将结果赋值给新变量replaced_greeting
    • echo "Replaced Greeting: $replaced_greeting"
      • 这行打印修改后的问候语。结果是Hello, Shell!

第8周:Shell脚本的高级特性和自动化任务

学习目标
  • 探索Shell脚本的高级特性,如子shell和进程替换。
  • 学习如何利用Shell脚本进行自动化任务。
学习内容
  1. 高级特性

    • 子shell:在子shell中运行命令(使用括号())。
    • 进程替换:使用<()>()将命令输出作为文件处理。
  2. 自动化任务

    • 使用Shell脚本自动化日常任务,如备份文件、监控系统状态等。
    • 编写脚本以定期执行任务(使用cron计划任务)。
实践任务
  • 任务:编写一个Shell脚本,演示子shell的使用,并创建一个简单的自动化任务。
  • 脚本示例
#!/bin/bash# 子shell示例
(cd /tmp && echo "Current directory: $(pwd)")# 自动化任务示例
backup_files () {tar -czf "backup-$(date +%Y%m%d).tar.gz" $1
}echo "Performing backup..."
backup_files /path/to/important/filesecho "Backup completed."
子Shell(Subshell)

子Shell是在一个新的Shell会话中执行命令的一种方式,它独立于当前的Shell。在子Shell中执行的命令不会影响当前Shell的环境(如变量和当前目录)。子Shell通常用于临时改变目录、设置局部变量或执行一系列命令,而不希望这些改变影响到当前的Shell环境。

 

自动化任务

自动化任务指的是通过脚本或程序自动执行一系列操作,而不需要人工干预。在Shell脚本中,自动化任务通常用于定期执行某些任务,如备份文件、监控系统状态、自动更新等。

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

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

相关文章

封装hook函数【便于复用】

目录 一般函数封装封装hook函数 一般函数封装 普通的删除逻辑封装函数—子组件点击删除-通过 defineEmits 通知父组件&#xff08;自定义事件&#xff09;进行删除 const deleteLoading ref(false) const emits defineEmits<{(e: click-delete, id: string): void }>()…

二叉树的层序遍历(广度搜索法) Python

思路&#xff1a; 层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树 需要借用一个辅助数据结构即队列来实现&#xff0c;队列先进先出&#xff0c;符合一层一层遍历的逻辑&#xff0c;而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。 而这种层序遍历方式就是…

ELK配置记录

1. filebeat.yml配置 启动命令&#xff1a; ./filebeat -e -c filebeat.yml # 输入 filebeat.inputs: - type: logenabled: truepaths:- /soft/log/base.*#跨行日志正则&#xff0c;从有时间的开始&#xff0c;到下一个时间之前结束multiline.pattern: ^\[[0-9]{4}-[0-9]{2}…

Python数据类型字典分析

文章目录 1. 创建字典1.1 创建空字典1.2 创建非空字典 2. 新增字典元素2.1 thisdict[new_key] new_value2.2 update 方法 3. 删除字典元素4. 查找字典元素4.1 in 和 in not 操作符4.2 get 方法4.3 thisdict[key] 5. 修改字典元素6. 遍历字典元素6.1 for 循环遍历6.2 keys 方法…

使用纯js码2个实用功能banner图标切换和表格制作

“I can accept failure, but I cant acceptnot trying.”—— by Michael Jordan    “我可以接受失败&#xff0c;但我不能接受放弃。” ——迈克尔•乔丹   banner图标切换 js原生&#xff1a;图片地址你们自己设置位置&#xff0c;相对位置或者绝对位置即可 <!DOCTY…

【CTA认证】Android8实现android6以下的应用运行时也要申请权限

需求 CTA入网认证&#xff0c;要求低版本比如Android6以下的应用&#xff0c;运行时&#xff0c;也需要有运行时权限(Runtime Permission)功能&#xff0c;不能默认就取到权限&#xff0c;必须人工在设置中打开才可。 环境 Android 8 实现 frameworks 修改思路是所有APP都…

蓝桥杯物联网竞赛_STM32L071_6_RTC显示

作用&#xff1a; RTC在STM32微控制器中通常由一个独立的低功耗晶振和相关的寄存器组成。它可以独立于主处理器运行&#xff0c;即使在系统电源关闭的情况下(需要备用纽扣电池)&#xff0c;也能继续计时和记录日期。注意&#xff1a;RTC是芯片内部的功能&#xff0c;并没有和G…

Android跨进程通信,RPC,IPC

文章目录 Android跨进程通信&#xff0c;RPC&#xff0c;IPC1.IPC原理2.RPC原理2.RPC原理 Android跨进程通信&#xff0c;RPC&#xff0c;IPC RPC&#xff08;基于IPC实现&#xff09; Android binder就是一个RPC框架&#xff0c;在已经启动的一个进程a中&#xff0c;访问到进…

Eaxyx 让圆球跟随鼠标移动

如果出现2023&#xff0c;代表配置成功: 进入Eaxy官方网站&#xff0c;点击文档&#xff1a; 选择 函数->绘图函数->initgraph: 可以看见initgraph&#xff08;&#xff09;函数有如下三个参数: 现在我们想生成一个1280*720大小的窗口&#xff1a; 我们需写如下代码: 但…

AIGC: 关于ChatGPT中的核心API调用示例

Open AI 的 api 调用示例 API的调用的文档&#xff1a;https://platform.openai.com/docs/api-reference/introductionChatGPT官方提供了 Python版的包 和 Nodejs版的包 $pip install openai$npm install openai 我们使用 python3.8版本来安装: $sudo python3.8 -m pip instal…

数据结构算法-冒泡排序算法

引言 虽然选择排序好用 &#xff0c;但有点问题 也就是频繁找最大值下标 放到 未排序的后面 因为每次需要扫描整个未排序序列&#xff0c;找到最大值或最小值的下标&#xff0c;并将其交换到未排序序列的最后一个位置。这样做的问题在于&#xff0c;在后面的迭代中&#xff0c…

C# WPF上位机开发(计算器界面设计)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 c# wpf最大的优势就是开发业务软件比较快、效率比较高。一般来说&#xff0c;它的界面和逻辑部分可以同时开发。界面的部分用xaml编写即可&#xf…

Spring Framework详解

学习目标 能够说出Spring的体系结构 能够编写IOC入门案例 能够编写DI入门案例 能够配置setter方式注入属性值 能够配置构造方式注入属性值 能够理解什么是自动装配 一、Spring简介 1 Spring课程介绍 问题导入 我们为什么要学习Spring框架&#xff1f; 1.1 为什么要学 Spri…

Nat. Mach. Intell. | 预测人工智能的未来:在指数级增长的知识网络中使用基于机器学习的链接预测

今天为大家介绍的是来自Mario Krenn团队的一篇论文。一个能够通过从科学文献中获取洞见来建议新的个性化研究方向和想法的工具&#xff0c;可以加速科学的进步。一个可能受益于这种工具的领域是人工智能&#xff08;AI&#xff09;研究&#xff0c;近年来科学出版物的数量呈指数…

数据结构—两个有序单链表的合并排序算法

viod merge(LNode *A,LNode *B){ LNode *C;//新节点 LNode *p C;//辅助指针 while(A->next !null && B->next !null){ if(A->next->data > B->next->data){//A节点大 p->nextA->next;//A元素插入C AA>next; pp->next; }else{ p->…

如何选择适合的光电传感器与 STM32 微控制器进行接口设计

本文介绍了如何选择适合的光电传感器与 STM32 微控制器进行接口设计的方法。首先我们将介绍一些选择光电传感器的关键因素&#xff0c;包括测量范围、响应时间、分辨率和输出类型。然后我们将介绍如何根据所选传感器的特性进行硬件连接和接口设计。最后&#xff0c;我们将提供示…

机器学习在缺陷检测中的实际效果与应用案例

机器学习在缺陷检测中的实际效果与应用案例 机器学习在缺陷检测中的应用已经变得非常广泛&#xff0c;并且在许多行业中都得到了实践验证。通过使用机器学习算法&#xff0c;我们能够训练模型来自动检测产品或过程中的缺陷&#xff0c;从而提高生产效率&#xff0c;降低人工检…

项目开发维护技术文档(总结梳理)

目录 一、项目背景 二、架构设计 1.技术栈 2.架构图 3.代码结构 三、模块划分 1.用户模块 2.商品模块 四、开发规范 1.命名规范 2.代码格式 3.版本控制 五、部署流程 1.环境要求 2.部署流程 六、问题解决 1.数据库连接异常 2.Redis缓存失效 七、参考资料 项…

同旺科技 USB TO SPI / I2C --- 调试W5500

所需设备&#xff1a; 内附链接 1、USB转SPI_I2C适配器(专业版); 首先&#xff0c;连接W5500模块与同旺科技USB TO SPI / I2C适配器&#xff0c;如下图&#xff1a; 读取重试时间值寄存器&#xff0c;默认值0x07D0 输出结果与默认值一致&#xff0c;芯片基本功能已经调通&am…

go自定义端口监听停用-------解决端口被占用的问题

代码 package mainimport ("fmt""log""net""os/exec""strconv""strings" )func getSelect(beign int, end int) int {var num intfor {_, err : fmt.Scan(&num)if err ! nil {fmt.Println("输入错误&am…