首页 > 系统相关 >shell语言

shell语言

时间:2024-06-12 21:45:16浏览次数:23  
标签:shell 语言 eg 用户 命令 sed txt log

shell既是应用程序,也是一种脚本语言。

开头以bash为解释器:

#!/bin/bash

变量:系统变量、用户变量、环境变量
系统变量:

    HOME:当前用户的主目录
    PATH:定义了Shell在查找命令时应该搜索的目录列表。
    USER 或 USERNAME(取决于系统):当前登录的用户名。
    PWD:当前工作目录的路径。
    SHELL:当前Shell的路径。
    UID 和GID:当前用户的用户ID(UID)和组ID(GID)。
    RANDOM:生成一个0到32767之间的随机整数。
    HOSTNAME:当前系统的主机名。

用户变量:
定义变量:变量名=变量值

eg: age= 10

引用变量:

使用$符号引用

删除变量:

unset 变量名

键盘输入:

read 参数 变量名
        -p:提示信息,eg:read -p "请输入一个数字"  num
        -t:规定时间内输入的有效,秒为单位。eg:read -t 10 lock
        -n:指定输入字符数,eg:read -n 2 times
        -s:隐藏输入的数据

接受用户的参数

    $$是shell的PID
    $?:上一个条件判断的结果,0为真,其他为假

判断用户参数,
文件测试:判定文件存在或者权限是否满足,返回值0是真,1是假。

    -d:是否为目录
    -e:是否存在
    -f:是否为文件
    -r/-w/x:是否有读/写/执行权限

逻辑判断

    与:&&或者 -a,前面的命令执行成功才执行后面的命令
    或:|| 或者-o,前面的命令执行失败才执行后面的命令
    非:!,将判断结果取反


管道符

A|B,A命令的结果作为B的输入

重定向符

    覆盖写:>
    追加写:>>
    0:标准输入, 
    1:标准输出,
    2:错误输出,
        eg,将错误信息输出到err.log,将信息输出到out.log之中:cmd  2>err.log  1>out.log
        eg,将cmd >alloutput.log 2>&1,2>&1:重定向符号组合,用于将标准错误重定向到标准输出所指向的位置。

整数比较

    -eq:是否等于,equal
    -ne:是否不等于,not equal
    -gt:是否大于,greater than
    -lt:是否小于,less than
    -ge:是否大于等于,greater than or equal
    -le:是否小于等于,less than or equal

字符串比较

    =:比较字符串内容是否想等
    !=:比较字符串内容是否不等
    -z:判断字符串内容是否为空

if条件测试

    if 条件测试
    then 
    elif 命令2
    then 
    else 命令3
    fi

for循环
这个 Bash 脚本的目的是读取一个密码,并尝试根据 user.txt 文件中列出的用户名来创建用户

    for 变量名 in 取值列表
    do
           命令序列
    done

while循环
    whlie 测试条件
    do
           命令序列
    done

case条件测试
    case 变量值 in
    模式1)
    ;;
    命令序列1
    模式2)
    ;;
    命令序列2
    *)
    命令序列3
    esac

corn:用于定期执行任务的守护进程。它允许用户设置周期性被执行的任务,并以指定的时间间隔(分钟、小时、每天、每周、每月或每年)运行,字段的顺序是:
分钟(0 - 59)
小时(0 - 23)
日期(1 - 31)
月份(1 - 12 或 JAN-DEC)
星期(0 - 7,其中 0 和 7 都表示星期日,或者使用 SUN-SAT)
(可选)要运行命令的用户
例如,要在每天的中午 12 点运行某个命令,你可以使用以下 cron 表达式:
复制代码0 12 * * * /path/to/your/command
如何设置 Cron Jobs
编辑用户的 crontab 文件:
使用 crontab -e 命令编辑当前用户的 crontab 文件。这将打开一个文本编辑器,你可以在其中添加或修改 cron 表达式和命令。
查看用户的 crontab 文件:
使用 crontab -l 命令查看当前用户的 crontab 文件内容。
删除用户的 crontab 文件:
使用 crontab -r 命令删除当前用户的 crontab 文件。

grep:文本搜索工具,它允许你在文件中搜索特定的字符串或模式,并将匹配的行打印出来。

eg:grep -i "hello" example.txt
可选参数
-i:忽略大小写
-n:显示匹配行号
-v:反选,显示不匹配的行号

awk:文本处理工具,主要用于模式扫描和文本/数据提取。它通常用于处理结构化文本文件,如 CSV、日志文件等。

     $NF代表最后一列,倒数第二列可以用$(NF-1)表示
    awk 'NR>=2 && NR<=4 {print $2, $3, $4, $5, $6}' data.txt         NR>=2,NR<=4{print}',取2-4行
    awk -v  OFS="---" 'NR==2,NR==4{print $1, $2}'  hello.txt        -v:定义或者修改awk内置变量,OFS:输出分隔符,默认是空格
    grep -n "^$" file1:查找空行并打印出行号,^ 表示行的开始,$ 表示行的结束。当这两者之间没有字符时,它们就匹配一个没有任何字符的行,即空行。

sed:流编辑器(stream editor),对输入流(或文件)的每一行进行文本替换、删除、添加和其他操作。通常用于自动编辑文件、脚本和命令输出。

替换,使用 s 命令将 file.txt 中所有的 "apple" 替换为 "orange","g"表示全局替换。
        eg:sed 's/apple/orange/g' file.txt
        sed '2,9s/^mo/hi/' hello.txt 替换2-9行mo开头为hi
        sed -e '2,9s/^mo/hi/' -e 's/^can/yes/g' hello.txt  -e:可以多次编辑
        sed  's/^[[:space:]]/#/g' hello.txt:将以"空格"开头的行空格替换为"#"
        [[:space:]]+,一个或多个空格
        sed -r 's/^/@/' hello.txt:开头加@
        sed 's/^[md].*[oe]$/ggggg/' hello.txt 以m或d开头,o或e结尾的行,并替换为ggggg,.*代表长度任意

删除,使用 d 命令删除 file.txt 中包含 "banana" 的所有行:
        eg:sed '/banana/d' file.txt
        sed -i '2,$d' test.log:表示直接删除2和2后面的所有行。2表示2及后面所有行,$d表示删除。
        sed  '2,$d'  input.log > output.log:删除2和2后的所有行,并将数据保存到ouput.log,ouput.log不存在会自己创建
        sed -i '100d' inputfile  # 删除第100行
        sed -i '100,200d' inputfile  # 删除从第100行到第200行的内容
        sed '/^peach/,/^dsd/d' hello.txt:从“peach”开头删除到“dsd”开头的行
插入和追加
        使用 i 命令在当前行之前插入文本。
            sed 'iPrefix: ' file.txt

其他技巧:
生成序列

    for i in {1..6};do
    echo $i;done

清空一个文本

>test.txt

序列迭代

$(seq 1 6) 或者{1..6},取值1,2,3,4,5,

算数运算:

    1、((a=1+1))
    2、let a=1+1
    3、a=$(expr 1 + 1),+两边要空开
    3、乘法:a=$(expr 4 \* 2)
    4、除法:a=$(expr 4 / 2)

自加

    ((i++)
    let i++,let命令中的变量不需要使用$前缀

遍历test.txt文件中的内容:

    for i in $(cat test.txt)

目录或文件要用""起来

    eg: find . -name "8001.go":(.) 表示当前目录,-name "*.go" 是用于匹配文件名的表达式。

计算指定目录($rec_path)下所有.txt文件的总大小(以字节为单位)

total_size=$(find "$rec_path" -type f -name "*.txt" -exec stat -c%s {} \; | awk '{sum+=$1} END {print sum}')

1+...+50

    seq 1 50 | awk '{sum+=$1} END{print sum}'  
    echo {1..50} | tr ' ' '\n' | awk '{sum+=$1} END{print sum}'    #  tr 是一个字符转换或删除工具。tr ' ' '\n' 是将输入中的空格字符( ' ')替换为换行符(\n)。

创建一个以1开始,8结束的,步长为2的数列

方法一:seq 1 2 8
方法二:{1..8..2}

字符串切片输出

phone="01086013387"  
formatted_phone="${phone:0:3}-${phone:3}"  
echo "$formatted_phone"

正则表达式()捕获组

    ^(010|0[2-9][0-9]),匹配010,020-099,匹配严谨,只匹配开头的
    ^010|0[2-9][0-9],匹配010,020-099,匹配宽松,例如22029,239022会匹配

标签:shell,语言,eg,用户,命令,sed,txt,log
From: https://www.cnblogs.com/larks-islands/p/18244745

相关文章

  • 初阶C语言(01)—学习笔记
    if语言if语句其一C语言被称为结构化的程序设计语言,包括顺序结构、选择结构(ifswitch)和循环结构(for while dowhile)。因为今天要下雨,所以必须带伞。这就是一个简单的选择语句。例如:如果你的年龄大于18岁,那么输出成年。#include<stdio.h>intmain(){ intage=20;......
  • 为什么机器这么难理解人类语言?
    人类自然语言的多样性、灵活性、歧义性、上下文依赖性、语言的变化以及世界知识和常识的应用等因素都使得让机器难以理解人的自然语言:多样性和灵活性:包括语法、词汇、语义、上下文等方面。同一个词汇在不同语境中可能有不同的含义,例如“他被杀死了”的“死”和“笑死我了”的......
  • 零基础非科班也能掌握的C语言知识21 编译链接(介于作者实力有限并且没有可以演示的过程
    编译链接1.翻译环境和运行环境2.翻译环境2.1编译2.1.1预处理(预编译)2.1.2编译2.1.3汇编2.2链接3.运行环境1.翻译环境和运行环境在ANSIC的任何⼀种实现中,存在两个不同的环境。编译环境运行环境2.翻译环境翻译环境由编译和链接两个大的过程组成的,而编译又可......
  • C语言指针介绍加练习
    #指针相关介绍定义    指针(Pointer),通常用于数据的间接访问,指针存储的是指向变量的首地址,16位平台就是2位,如果在32位平台,地址就是4个字节,如果实在64位平台,地址就是8个字节(1Byte=8bit),Int类型4Byte char类型1Byte这个是变量在内存中,分配的地址大小,在内存中一个By......
  • 第壹章第14节 C#和TS语言对比-委托事件(仅C#)
    水一篇,因为《函数方法》章节已经说了,但那个章节比较长,知识点又多,可能有人会看不到。委托事件是C#中的一个难点,但我觉得,和TS/JS中的函数表达式放在一起时,委托和事件就变得很简单了。一、从TS的函数表达式说起TS/JS中函数是一等公民,function是一种类型,定义的具体函数是一......
  • C语言王国——数组的旋转(轮转数组)三种解法
    一、题目给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。示例1:输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,5]向右轮转3步:[5,6,7,1,2,3,4]示例......
  • C语言字符串处理函数strstr的用法
    C语言字符串处理函数strstr的用法在C语言中,strstr函数是一个字符串处理函数,用于在一个字符串(称为“主字符串”)中查找另一个字符串(称为“子字符串”)的首次出现。如果找到子字符串,则该函数返回一个指向主字符串中子字符串首次出现位置的指针;如果没有找到,则返回NULL。函数的原型定......
  • 基于GO语言,K8s+gRPC实战云原生微服务
    介绍K8s在云原生微服务开发中,作为微服务治理框架越来越受企业的青睐,掌握该技术解决方案更有竞争力,课程从企业实际开发中提取精髓,从K8s、gRPC底层原理剖析到服务治理解决方案设计落地,到云上部署,更平滑的学习曲线,助力你成为云原生开发领域的牛人。你将学到掌握整套K8s微服务......
  • 【jmeter】使用beanshell simpler测试redis性能
    一、场景   由于redisdataset支持的类型有限,所以采取使用beanshellsampler 二、安装jedis包https://mvnrepository.com/artifact/redis.clients/jedis 三、添加BeanShellSampler添加脚本importjava.util.Map;importredis.clients.jedis.Jedis;importorg.a......
  • 数据类型与深浅拷贝理解 vs 不同语言环境下深浅拷贝实例
    一、在探讨深浅拷贝的问题之前需要先理解两种数据类型值类型数据(基本数据类型):存储在栈内存,占据固定大小的空间,直接存储其数据(值的赋值是深拷贝);引用类型数据:这种数据类型的变量通常存储在栈区,存的是指向实际数据的指针,而实际的数据是存储在堆区,访问数据通过指针去访问(值的赋值......