首页 > 系统相关 >shell编程

shell编程

时间:2024-11-14 09:49:55浏览次数:3  
标签:shell name 编程 echo sed file txt bash

学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页B站泷羽sec

本人第一篇文章,以后也会经常跟新监督自身学习

首先建立一个x.sh文件
vim x. sh
可以利用 #!/bin/bash ,#!/bin/dash ,#!/bin/sh 这种其实不管用哪种脚本解释器 最后调用的还是这个dash

(#! ,由 “#” 和 “!” 两个字符组成的特殊标记。当一个可执
行文件以这两个字符开头时,内核会将该行的其余部分作为解释
器的路径来读取,并使用该解释器来执行这个文件的后续内容。
/bin/bash 是指 bash解释器的路径。)

比如我们用 echo hello word 保存退出,运行一下 ./x.sh

如果写进去之后没有权限,无法执行要加执行权限 +x

第二种办法

比如说我们新建一个 1.sh vim 1.sh,直接编辑模式输入echo longyusec.com 我们默认是没有权限的 但是我们利用 sh1.sh 照样执行成功 bash 1.sh 一样成功我们执行脚本是在当前目录下执行的,但是如果你的脚本在别的目录你就要去到那个目录,或者指定好对应路径 这三个可以临时提高基本权限直接执行(bash、dash、sh)

第三种办法
利用source 1.sh执行和sh命令差不多,只不过这个命令就是对颜色加深标注了

变量声明和定义

举例 定义一个name变量,name=“xiaoyu”
再利用echo $name 打印出来,这就是简单的变量声明
比如 age=27

echo $age

打印出来的age=27
写复杂点,比如说 echo my name is $name,and my age is $age years old
然后就直接打印出了 姓名,和年纪
-般来说加双引号和不加效果是一样的 echo"my name is $name,and my age is $age years old”
加单引号效果是一样的 echo’my name is $name,and my age is $age years old’你会发现他并没有把变量赋值打印出来,而是直接把变量写进来了,区别就是不加或者双引号可以输出变量,但是加入单引号他会把变量当字符串输出出来

变量拼接
echo “my name is $name,and my age is $ageyears old”
这个例子中 years与age之间没有空格 所以打印出来为空,因为变量没有事先定义 所以为空
解决办法 将变量用双引号括起来 它就会做一个区分
cho “my name is n a m e , a n d m y a g e i s " name,and my age is " name,andmyageis"age"years old’
那么除了”"还能用什么呢 用{花括号也是可以的
echo "my name is KaTeX parse error: Expected '}', got 'EOF' at end of input: …and my age is {age}years old’

这样输出的变量会将输出内容利用花括号框起来上面详的全部是临时的一个变量,变量是由数字,字符串下划线组成,但是不能以数字开头例如9name 这种是不行的,变量中间最好不要有空格

比如说 long yu 如果非要用这种可以加个下划线long_yu_="xiaoyu"这种我们怎么查看我们定义的变量呢 比如说利用set命令,比如说set l grep name,怎么删除变量呢 我们使用 unset name 再次查看 set l grep name 就发现没有了(grep检索文本中的内容)

set |grep name 查看变量名为name的变量

unset name 删除name这个变量

拓展:

基础语法

1. 基本的 Shell 脚本结构

Shell 脚本通常以 #! 开头,表示脚本的解释器。例如:

bash
#!/bin/bash
# 这是一个简单的脚本

echo "Hello, world!"
  • #!/bin/bash 是解释器声明,告诉操作系统使用 bash 来执行脚本(还有上面提的sh、dash)。
  • echo 用来输出文本。
2. 变量

在 Shell 脚本中,变量不需要声明类型,直接赋值即可:

bash
#!/bin/bash
name="John"
echo "Hello, $name!"
  • name="John" 声明一个变量 name 并赋值。
  • $name 用来访问变量的值。
3. 条件语句

Shell 支持常见的条件语句,如 ifelseelif

bash
#!/bin/bash
age=20

if [ $age -lt 18 ]; then
    echo "You are a minor."
else
    echo "You are an adult."
fi
  • [ $age -lt 18 ] 检查 age 是否小于 18,-lt 是小于的比较操作符。
4. 循环

Shell 支持 forwhileuntil 循环。

  • for 循环
bash
#!/bin/bash
for i in {1..5}; do
    echo "Number: $i"
done
  • while 循环
bash
#!/bin/bash
count=1
while [ $count -le 5 ]; do
    echo "Count: $count"
    ((count++))
done
  • until 循环
bash
#!/bin/bash
count=1
until [ $count -gt 5 ]; do
    echo "Count: $count"
    ((count++))
done
5. 函数

Shell 脚本支持函数定义和调用:

bash
#!/bin/bash

greet() {
    echo "Hello, $1!"
}

greet "Alice"
  • greet 是函数名,$1 表示第一个参数。
6. 输入和输出
  • 用户输入
bash
#!/bin/bash
echo "Enter your name:"
read name
echo "Hello, $name!"
  • 命令输出到文件
bash
#!/bin/bash
echo "This is a test" > output.txt
  • 从文件读取
bash
#!/bin/bash
while read line; do
    echo $line
done < input.txt

常用命令

  1. 文件操作

    • 创建文件或目录:

      bash
      
touch file.txt
mkdir new_directory

删除文件或目录:

bash
rm file.txt
rm -r directory

复制文件:

bash
cp file.txt backup.txt

移动文件:

bash
  • mv file.txt /path/to/destination
    

文件权限

  • 查看文件权限:

    bash
    
ls -l file.txt

修改文件权限:

bash
  • chmod 755 file.txt
    

查找文件

  • 查找文件:

    bash
    
  • find /path/to/search -name "file.txt"
    

管道与重定向

  • 管道:将一个命令的输出传递给另一个命令:

    bash
    
ps aux | grep bash

重定向:将输出写入文件:

bash
    • echo "Some text" > file.txt
      

Shell 脚本示例:备份文件

以下是一个简单的备份脚本,定期备份某个目录下的文件:

bash
#!/bin/bash

# 设置源目录和目标目录
source_dir="/home/user/documents"
backup_dir="/home/user/backup"

# 获取当前日期
current_date=$(date +%Y-%m-%d)

# 创建备份文件夹(如果不存在)
mkdir -p "$backup_dir/$current_date"

# 备份文件
cp -r "$source_dir"/* "$backup_dir/$current_date"

echo "Backup completed successfully!"

文件内容替换

  • 1.替换文本(Substitution)

    最常见的 sed 用法是替换文本。它的基本语法是:

    bash
    sed 's/pattern/replacement/' file
    
    • s:表示替换操作。

    • pattern:要匹配的模式(可以是正则表达式)。

    • replacement:替换文本。

    • 示例:
      • 将文件中所有的 apple 替换为 orange

        bash
        
      sed 's/apple/orange/' file.txt
      

      将文件中所有的 apple 替换为 orange,并修改原文件内容(使用 -i 选项):

      bash
      sed -i 's/apple/orange/g' file.txt
      
      • -i:表示直接修改文件。

      • g:表示全局替换(替换每行中的所有匹配项)。如果不加g只会替换第一个匹配的

      • 2. 删除行(Delete)
        • 删除包含特定模式的行:

          bash
          
        sed '/pattern/d' file.txt
        

        这会删除所有包含 pattern 的行。

        删除第 2 行:

        bash
        sed '2d' file.txt
        

        删除从第 2 行到第 4 行的内容:

        bash
        sed '2,4d' file.txt
        

        删除空行:

        bash
        
        • sed '/^$/d' file.txt
          
        3. 插入文本(Insert)
        • 在指定行前插入文本:

          bash
          
        sed '2i This is inserted text' file.txt
        
        • 2i:表示在第 2 行之前插入文本。

        在指定行后插入文本:

        bash
        
        • sed '2a This is appended text' file.txt
          
          • 2a:表示在第 2 行之后插入文本。
        4. 替换行内容(Change)
        • 替换指定行的内容:

          bash
          
        • sed '2c This is the new content' file.txt
          

          这会将第 2 行的内容替换为 This is the new content

        5. 打印行(Print)
        • 打印指定的行:

          bash
          
        sed -n '2p' file.txt
        

        这会打印第 2 行的内容。

        打印第 2 到第 4 行的内容:

        bash
        
        • sed -n '2,4p' file.txt
          
        6. 多条命令
        • 可以将多个 sed 命令一起使用,通过 -e 选项或者将多个命令放在一个 -e 参数中。

          bash
          
        sed -e 's/apple/orange/' -e 's/banana/pear/' file.txt
        

        或者将多个命令放在一个脚本文件中:

        bash
        sed -f script.sed file.txt
        

        script.sed 可以包含多条 sed 命令。

        7. 正则表达式

        sed 支持常见的正则表达式语法,可以用来处理复杂的模式匹配。

        1. 匹配数字
        • 查找包含数字的行:

          bash
          
        • sed '/[0-9]/p' file.txt
          
        2. 匹配行首和行尾
        • 匹配行首(以 “apple” 开头的行):

          bash
          
        sed '/^apple/p' file.txt
        

        匹配行尾(以 “pie” 结尾的行):

        bash
        sed '/pie$/p' file.txt
        
  • 后台执行进程

  • 使用 & 将进程放到后台运行:

    bash
    
./long-running-process.sh &

使用 jobs 查看后台任务:

bash
jobs

使用 fg 将后台进程切换到前台:

bash
fg %1  # 将后台的第一个任务切换到前台

使用 nohup 命令保持进程在会话结束后继续运行:

bash
  • nohup ./long-running-process.sh &
    

9. 信号与trap

在 shell 脚本中,处理信号和错误非常重要。trap 命令允许你在接收到某些信号时执行特定操作。

  • 捕获信号

    bash
    
# 捕获 SIGINT(Ctrl+C)信号并执行某个清理操作
trap "echo 'Caught SIGINT signal'; exit" SIGINT

常见信号

  • SIGINT:用户按下 Ctrl+C 发送的信号。
  • SIGTERM:程序的终止信号。
  • SIGKILL:强制杀死进程的信号(无法被捕获)。
bash
  • # 捕获 SIGTERM 信号
    trap "echo 'Terminated by user'; exit" SIGTERM
    

10. 正则表达式

Shell 中的许多工具(如 grepsedawk)都支持正则表达式。学习正则表达式能够让你更有效地处理文本。

grep 中的正则表达式
  • 查找包含某个模式的行:

    bash
    
# 查找以 "error" 开头的行
grep "^error" logfile.txt

查找包含数字的行:

bash
  • grep "[0-9]" logfile.txt
    
sed 中的正则表达式
  • 使用 sed 删除包含特定模式的行:

    bash
    
sed '/error/d' logfile.txt  # 删除包含 "error" 的行

使用 sed 替换文本:

bash
  • sed 's/old/new/g' file.txt  # 将 "old" 替换为 "new"
    
awk 中的正则表达式
  • 使用 awk 按列处理文件:

    bash
    
awk '{ print $1, $3 }' file.txt  # 打印第一列和第三列

使用 awk 基于模式进行过滤:

bash
  • awk '/error/ { print $0 }' logfile.txt  # 查找包含 "error" 的行
    

11. 调试技巧

调试 shell 脚本可以帮助你发现和解决问题。以下是一些调试技巧。

  • -x 选项:启用脚本调试模式,显示每个命令及其参数。

    bash
    
# 在脚本开头启用调试模式
set -x

-e 选项:脚本中任意命令失败时立即退出。

bash
# 在脚本开头启用错误检查
set -e

打印变量:通过 echo 打印变量值,有助于调试脚本。

bash
echo "Variable value: $my_var"

标签:shell,name,编程,echo,sed,file,txt,bash
From: https://blog.csdn.net/Free_Sea_/article/details/143758987

相关文章

  • 计算机编程:二进制、八进制、十进制、十六进制转换
    1、二进制我们不妨将思维拓展一下,既然可以用0~9共十个数字来表示数值,那么也可以用0、1两个数字来表示数值,这就是二进制(Binary)。例如,数字0、1、10、111、100、1000001都是有效的二进制。在计算机内部,数据都是以二进制的形式存储的,二进制是学习编程必须掌握的基础。本节......
  • C语言编程 1.11 寻找素数对
     #include<stdio.h>#include<math.h>intsushu(longlongn)        {            longlongsqrt_n=sqrt(n);            for(longlongi=2;i<=sqrt_n;i++)                {                 ......
  • 基于华为云FunctionGraph和ModelArts的智能动漫头像生成:从自拍到AI风格化的编程
    文章目录1引言2背景介绍2.1华为云FunctionGraph与ModelArts简介3项目准备3.1注册与登录华为云账号4实验步骤4.1首先我们配置云主机4.2安装FunctionGraph插件4.3创建函数4.4部署函数4.5函数配置委托4.6函数配置触发器4.7函数添加依赖包4.8订阅模型并部署A......
  • aider: 一个 terminal 中的开源 AI 编程助手 & benchmark
    1.AIpairprogramminginterminalaiderGitHub可自由配置任意的LLM接口功能:接收需求:Addnewfeaturesortestcases.Describeabug.PasteinanerrormessageororGitHubissueURL.Refactorcode.Updatedocs.修改代码文件自动执行gitcommits并携带......
  • Python 面向对象编程
    一、面向对象编程1.1面向过程与面向对象在理解面向对象编程(OOP)之前,我们先要了解 面向过程(POP) 和 面向对象(OOP) 的区别。1.1.1面向过程(POP)-面向过程的编程思想将一个功能分解为一个一个小的步骤,我们通过完成一个一个的小的步骤来完成一个程序-这种编程方式,符合我们......
  • 【进阶系列】带你看懂python的面向对象编程#类 #对象 #继承 #封装 #多态
    进阶系列一、面向对象编程1.1面向过程与面向对象1.1.1面向过程pop:1.1.2面向对象oop:1.2类、对象1.2.1类的定义与实例化对象1.2.2访问属性/方法1.2.3对象与类的关系1.2.5⭐魔方——构造函数与析构函数1.2.6⭐类属性/方法与实例对象属性/方法与静态方法小练习1......
  • Python中的面向对象编程,类,对象,封装,继承,多态
    一、面向对象编程1.面向过程和面向对象面向过程和面向对象都是一种编程方式,只不过再设计上有区别。面向过程C语言细分成每一个过程优点:简单直观、性能高效、代码简洁。缺点:不易维护、不易扩展、代码重用性低。面向对象python、java、C++要使用某个功能,直接找到对应的......
  • Rust 在 Android 的编程实践——技术驱动的车云一体化解决方案探索
    Greptime车云一体化解决方案颠覆了从前传统的车云协同模式,采用更加低成本、高效率的方案来满足当前的市场需求。其中GreptimeDBEdge作为核心组件,专为车机环境量身打造。本文旨在详尽探讨在Android平台利用Rust语言进行开发过程中所积累的经验和教训。交叉编译在车机场景......
  • shell正则表达式、sed基本用法及sed应用案例
    一、正则表达式●可以使用若干符号配合某工具对字符串进行增删改查操作1.1基本正则列表正则符号描述^匹配行首$匹配行尾[]集合,匹配集合中任意单个字符[^]对集合取反.匹配任意字符*匹配前一个字符任意次数【*不允许单独使用】\{n,m}匹配......
  • 阿里云通义大模型团队开源Qwen2.5-Coder:AI编程新纪元
    ......