【Shell】基础语法(三)

news2024/9/23 9:32:43

文章目录

  • 一、Shell基础语法
    • 1. 位置参数和特殊变量
    • 2. 输入输出
    • 3. 管道
    • 4. 文件重定向
    • 5. 函数
    • 6. 脚本调试方法
  • 二、Shell高级和正则表达式
    • 1. sort命令
    • 2. uniq命令
    • 3. wc命令
    • 4. grep命令
    • 5. find命令
    • 6. xargs
    • 7. sed命令
    • 8. crontab

一、Shell基础语法

1. 位置参数和特殊变量

$0          相当于C语言main函数的argv[0]
$1、$2...    这些称为位置参数(Positional Parameter),相当于C语言main函数的argv[1]、argv[2]...
$#          相当于C语言main函数的argc - 1,注意这里的#后面不表示注释
$@          表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。
$*          表示参数列表"$1" "$2" ...,同上
$?          上一条命令的Exit Status
$$          当前进程号

位置参数默认就支持10个 ,当然$@还是支持n个,可以配合shift来进行参数左移,来操作不定参数

#!/bin/bash

echo "before shift"
echo '$0:' $0
echo '$1:' $1
echo '$2:' $2
echo '$3:' $3
echo '$4:' $4
echo '$5:' $5
echo '$#:' $#
echo '$@:' $@
echo '$*:' $*
echo '$$:' $$

在这里插入图片描述


2. 输入输出

echo -n 表示不换行
echo -e 解析转义字符
    echo -e "123\t234"

printf "%d\t%s\n" 123 "hello"
    跟C的printf一样

在这里插入图片描述


3. 管道

使用 | 将多个命令拼接在一起。原理:就是将前一个命令的标准输出作为后一个命令的标准输入来重定向 ,标准错误输出是不会重定向。实际上是将前面进程的标准输出重定向到后边进程的标准输入。

#include <stdio.h>
#include <ctype.h>
int main()
{
    int ch= getchar();
    while(ch!=EOF)
    {
        putchar(toupper(ch));
        ch=getchar();
    }
    return 0;
}

在这里插入图片描述

tee命令:tee命令把结果输出到标准输出,另一个副本输出到相应文件。

在这里插入图片描述
在这里插入图片描述


4. 文件重定向

cmd > file              把标准输出重定向到新文件中
cmd >> file             追加
cmd > file 2>&1         标准出错也重定向到1所指向的file里

    2>&1 
        文件描述符2 也重定向到文件描述符1的位置
        标准错误输出也重定向到标准输出的位置

cmd >> file 2>&1
cmd < file
    将file的内容重定向到cmd命令的标准输入
cmd < file1 > file2     输入输出都定向到文件里
cmd < &fd               把文件描述符fd作为标准输入

cmd > &fd               把文件描述符fd作为标准输出

cmd < &-                关闭标准输入
#include <stdio.h>

int main()
{
  fprintf(stdout,"this is a stdout!\n");
  fprintf(stderr,"this is a stderr!\n");
  return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


5. 函数

function 函数名()        #小括号里边也不需要填参数列表
{
    local var=value   #局部变量

    return 1          #return 只能返回整数,不能返回其他类型 ,返回值是作为退出状态来使用
}
  • function关键字可以省略 ,小括号也可以省略 ,但是两个必须要保留一个,不然解析器不知道你要定义的是一个函数。
  • 调用函数的方法,就跟普通命令一样:函数名 arg1 arg2 ...
  • 函数的执行状态看return语句,如果没有return语句,就以函数里边最后一条执行的指令的返回状态作为整个函数的退出状态。
testfunc()
{
    echo "Testfunc"
    return 1
}

testfunc
echo $?

在这里插入图片描述

Shell函数没有参数列表并不表示不能传参数,事实上,函数就像是迷你脚本,调用函数时可以传任意个参数,在函数内同样是用$0、$1、$2等变量来提取参数,函数中的位置参数相当于函数的局部变量,改变这些变量并不会影响函数外面的$0、$1、$2等变量。函数中可以用return命令返回,如果return后面跟一个数字则表示函数的Exit Status。

递归遍历当前目录下的所有文件:

#!/bin/bash
function visit
{
    local dir="$1"
    for f in `ls $1`
    do
        if [ -f "$dir/$f" ]
        then
            echo "$dir/$f is a file"
        elif [ -d "$dir/$f" ]
        then
            echo "$dir/$f is a dir"
            visit "$dir/$f"
        else
            echo "$dir/$f is not recognized" 
        fi
    done
}
visit .

在这里插入图片描述


6. 脚本调试方法

  • bash -n test.sh 遍历一下脚本,检查语法错误,如果没有语法错误,则什么都不会显示。
    在这里插入图片描述

  • bash -v test.sh 一边执行脚本一边将解析到的脚本输出来
    在这里插入图片描述

  • bash -x test.sh 执行脚本的同时打印每一句命令,把变量的值都打印出来 (常用)
    在这里插入图片描述


二、Shell高级和正则表达式

1. sort命令

命令从标准输入中读取数据然后按照字符串内容进行排序
-f 忽略字符大小写
-n 比较数值大小
-t 指定分割符,默认是空格或者tab
-k 指定分割后进行比较字段
-u 重复的行只显示一次
-r 反向排序
-R 打乱顺序
    同样的两行洗不乱

/etc/passwd 根据用户id来排序:sort -t: -k3 -n < /etc/passwd

在这里插入图片描述

2. uniq命令

去除重复的行,前提是重复的行连续
-c 显示每行重复的次数
-d 仅显示重复过的行
-u 仅显示不曾重复的行
    sort < test.txt | uniq

在这里插入图片描述


3. wc命令

word count
-l 统计行数
-c 统计字节数
-w 统计单词数

在这里插入图片描述


4. grep命令

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

grep家族包括grep、egrep和fgrepegrepfgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。Linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrepfgrep的功能。

在这里插入图片描述

global regular expression print
   -c 只输出匹配行的计数
   -i 不区分大小写
   -H 文件名显示
   -r 递归遍历目录
   -n 显示行号
   -s 不显示不存在或无匹配文本的错误信息
   -v 显示不包含匹配文本的所有行,这个参数经常用于过滤不想显		示的行
   -E 使用扩展的正则表达
   -P 使用perl的正则表达式
   -F 匹配固定的字符串,而非正则表达式

egrep  = grep -E
fgrep  = grep -F
rgrep  = grep -r

grep 默认使用的是基础的正则

在这里插入图片描述


5. find命令

find命令的一般形式为 find pathname -options [-print -exec -ok ...]

option 选项如下:
    -name 按照文件名查找文件。
        find . -name "1.txt"
    -perm 按照文件权限来查找文件。
        find . -perm 660
    -user 按照文件属主来查找文件。
    -group 按照文件所属的组来查找文件。
    -mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在
        n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。
    -atime 访问时间
    -ctime 创建时间
    -nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
    -nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
    -newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
    -type 查找某一类型的文件,诸如:
        b - 块设备文件。
        d - 目录。
        c - 字符设备文件。
        p - 管道文件。
        l - 符号链接文件。
        f - 普通文件。
        s - socket文件
-exec
        find . -name "*.txt" -exec gzip {} \;

        查找当前目录下的txt文件并且打包成为gzip
        每找到一个文件,就会执行exec后面的命令
            gzip ./a/2.txt
            gzip ./a/6.txt

            最后是一个\;  反斜杠不能省,作为当前exec后面命令的结束符
-ok 
        跟-exec用法一样,但是每找到一个文件要执行后面的命令前会给用户确认

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


6. xargs

将标准输入的参数整齐的拼凑到同一行中,单独使用该命令没有任何作用,需要配合其他命令来使用。

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现 溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在这里插入图片描述
在这里插入图片描述


7. sed命令

sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出。sed和vi都源于早期UNIX的ed工具,所以很多sed命令和vi的末行命令是相同的。

文本1 ->  sed + 脚本 -> 文本2 

ed 编辑器   ->  sed   -> vim 

sed option 'script' file1 file2 ...             sed 参数  ‘脚本(/pattern/action)’ 待处理文件
sed option -f scriptfile file1 file2 ...        sed 参数 –f ‘脚本文件’ 待处理文件


    p,  print           打印
    a,  append          追加
    i,  insert          插入
    d,  delete          删除
    s,  substitution    替换
// file.txt
qwertyuiop
asdfghjkl
zxcvbnm

1234567890

9876543210

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


8. crontab

Linux crontab 是用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

linux 系统定时器
需求,每天什么时候去做什么事情

/etc/crontab

# m h dom mon dow user  command                                                                            
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly                                        
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )        
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )       
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )      

crontab.sh

#!/bin/bash 

# 获取当前路径
curPath=$(cd `dirname $0`;pwd)
date >> "$curPath/date.txt"

在这里插入图片描述


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

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

相关文章

循环队列详解

1. 循环队列 1.1 概念及结构 循环队列是一种特殊类型的队列数据结构&#xff0c;也被称为”唤醒缓冲器“。它在数组的基础上实现了循环利用空间的功能。在循环队列中&#xff0c;队尾和队头之间形成了一个循环&#xff0c;当队尾指针“追上”队头指针时&#xff0c;队列不再继…

IDEA设置Tabs多行显示的方法

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 前言 在开发的时候、不知不觉我们就会打开很多代码页。如果打开的页面…

在线原型设计工具有好用的吗?就是这10个

随着设计工作的不断发展&#xff0c;原型设计在设计工作中越来越重要&#xff0c;而在线原型设计工具在减轻了设计师工作负担的同时也提高了设计师的工作效率&#xff0c;今天本文将为大家推荐10个能在线使用的原型设计工具&#xff0c;一起来看看吧&#xff01; 1、即时设计 …

CDC 数据复制:技术、权衡、见解

推荐&#xff1a;使用NSDT场景编辑器助你快速搭建可编辑的3D应用场景 在本文中&#xff0c;我将定义 CDC 数据复制&#xff0c;简要讨论最常见的用例&#xff0c;然后讨论常见技术及其权衡。最后&#xff0c;我将提供一些我作为数据集成公司Dataddo的首席执行官和创始人所学到…

使用logback异步打印日志

文章目录 一、介绍二、运行环境三、演示项目1. 接口2. 日志配置文件3. 效果演示4. 异步输出验证 四、异步输出原理五、其他参数配置六、源码分析1. 同步输出2. 异步输出 七、总结 一、介绍 对于每一个开发人员来说&#xff0c;在业务代码中添加日志是至关重要的&#xff0c;尤…

CSS:弹性盒子模型详解(用法 + 例子 + 效果)

目录 弹性盒子模型flex-direction 排列方式 主轴方向换行排序控制子元素缩放比例缩放是如何实现的&#xff1f; 控制子元素的对其方式justify-content 横向 对齐方式align-items 纵向 对齐方式 align-content 多行 对齐方式 弹性盒子模型 flex-direction 排列方式 主轴方向 f…

webshell免杀项目-Auto-JSPwebshell(五)

Auto-JSPwebshell/jsp免杀/webshell免杀/自动生成 项目地址&#xff1a; https://github.com/G0mini/Bypass 具体使用请参考&#xff1a; https://mp.weixin.qq.com/s/9-__B0MBRSXHla6O0KU7Gg

PCB制造中铜厚度的重要性

电子产品中的PCB是现代电子设备中不可或缺的一部分。在PCB制造过程中&#xff0c;铜厚度是一个非常重要的因素。正确的铜厚度可以保证电路板的质量和性能&#xff0c;同时也影响着电子产品的可靠性和稳定性。 一般我们常见的铜厚有17.5um&#xff08;0.5oz&#xff09;&#x…

SpringBootWeb案例-准备工作

目录 前言 准备工作 需求&环境搭建 需求 环境搭建 开发规范 Restful开发规范 统一的响应结果 开发流程 前言 根据过往的文章可以知道目前我已经学习完了前端、后端、数据库的基础知识&#xff0c;接下来通过一个基于SpringBoot工程开发的web项目案例。 准备工作 …

来讲一讲面试必问的异步FIFO设计!

异步FIFO设计可以说是数字IC设计工程师面试时必问的一个问题了&#xff0c;也是我们经常使用但是又往往被忽略的一个东西&#xff0c;今天就展开详细说一说不同深度&#xff08;2^N或者非2^N&#xff09;异步FIFO的设计思想&#xff1b; 一&#xff1a;2^N深度异步FIFO设计 1…

Unity开发笔记:截取指定位置含有UI的场景截图并输出

学习记录整理&#xff0c;自用&#xff0c;也希望能帮助到有相同需求的人。 如果直接截全图&#xff1a; string screenshotName "Assets/Textures/UI/20230803/2.png";ScreenCapture.CaptureScreenshot(screenshotName);截取指定位置含有UI的场景截图&#xff1a; …

Therac-25事故:软件缺陷引发的医疗灾难与教训

目录 引言 Therac-25&#xff1a;背景与功能 软件缺陷导致的灾难 Bug原理解析与编程人员的反思 教训与反思 结论 引言 在计算机科技的进步与应用领域&#xff0c;软件的质量和安全性至关重要。然而&#xff0c;历史上曾经发生过一系列令人震惊的事件&#xff0c;突显了软…

培训报名小程序报名功能完善

目录 1 修改数据源2 修改表单3 支付成功时修改状态4 创建报名成功页5 最终的效果总结 目前我们的报名功能已经搭建了一个基础版&#xff0c;后续需要展示用户已经报名的信息&#xff0c;需要添加一个状态来显示用户是否成功付费。 1 修改数据源 打开我们的报名数据源&#xff…

google PGS 下一代id

前言&#xff1a;为了进一步增强用户的隐私及其多平台游戏体验&#xff0c;Play 游戏服务(PGS) 正在推出下一代玩家 ID&#xff0c;用户第一次玩游戏时&#xff0c;他们将始终被分配一个唯一的下一代玩家 ID&#xff0c;无论用户在什么设备或平台上玩游戏&#xff0c;该 ID 都将…

加入[无人驾驶吕同学]Apollo专属课程领礼品啦!

号外号外&#xff0c;无人驾驶吕同学的Apollo领航官专属课程已经上线了。用户完成课程50%即可领取专属福利&#xff08;百度限定鼠标垫、Apollo限量帆布包、Apollo六周年定制钥匙扣、Apollo六周年限定徽章&#xff09;&#xff0c;四种礼品任选其一。 课程链接&#xff1a;htt…

使用 Docker 和 Streamlit 构建和部署 LangChain 支持的聊天应用程序

文章目录 前言聊天应用程序组件和技术LangChain Python框架开放人工智能模型前端 Streamlit UI使用 Docker 进行部署Docker 优化以实现轻量级和快速构建Docker-compose.yaml 文件基础设施Streamlit 公共云谷歌应用引擎使用 Google Cloud Run 部署应用1.启动服务2. 创建角色并将…

水产养殖产量低?教你个万能的方法!

水产养殖业作为重要的食品生产和经济活动之一&#xff0c;为人们提供了丰富的水产品&#xff0c;但如果不加以适当监测和管理&#xff0c;也可能对水质和生态系统造成负面影响。因此&#xff0c;水产养殖用水监测显得尤为重要。 在养殖过程中&#xff0c;水质的优劣直接影响着养…

Linux小型操作系统项目,《操作系统真象还原》第三章——完善MBR

前引 上一章我们完成了MBR的雏形编写&#xff0c;但是只打印了几个字符&#xff0c;这一章我们才要真正地去完成MBR的功能。 在完成MBR的功能之前我们要先了解一些知识&#xff0c;首先介绍什么是实模式。 书上的内容实在繁杂&#xff0c;简单地说&#xff0c;实模式没有虚拟和…

【算法|数组】双指针

算法|数组——双指针 引入 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;…

77. 组合

题目链接&#xff1a;力扣 解题思路&#xff1a; AC代码 class Solution {List<Integer> tem new ArrayList<>();List<List<Integer>> result new ArrayList<>();public List<List<Integer>> combine(int n, int k) {process(n…