一、输入输出

echo

  1. 回声,用于打印输出工作

    1. -n: 可以不换行
    2. -e:对字符进行转义,\t ===》 enable

printf

  1. printf “%d,%s\n” 10 “你好”
  2. 注意10 和 “你好” 两个参数之间,没有逗号

3

管道|

  1. 使用| 可以将多个命令拼接在一起

     cat /etc/passwd  | grep itcast | cut -d: -f4
    1000
    
  2. 原理:将前一个命令的标准输出作为后一个命令的标准输入

  3. 标准错误输出是不会被管道传递的

    cp | grep information.  # 这个是不生效的
    cp  --help | grep existing --color  #这个是正确用法
    

  1. 并不是所有的命令都可以接受|的数据,比如说ls

      find ../../01-shell-basic/ | ls
    
  2. 需求:实现一个接收管道输出的命令:读取标准输入,将标准输入的数据转成大写,然后输出:

    #include<stdio.h>
    #include<ctype.h>int main()
    {int ch=getchar();while(ch != EOF){putchar(toupper(ch));ch = getchar();}return 0;
    }
    
  3. 经常与more和less使用

    1. more,只可以单向查阅
    2. less可以双向查阅
    3. ctrl + f(前),ctrl+B(后)

tee

作用之一:

  1. 将标准输出重新输出到指定的文件

  2. 公司服务器打印log,希望能够在屏幕上打印,同时保存到文件:

    ping www.baidu.com | tee ping.log
    
  3. 如果想动态查看ping.log文件内容

    1. vim ping.log, 然后输入:e,可以随时刷新
    2. tail -f ping.log,动态刷新
    3. alias tailf=tail -f

作用之二:

当修改了一个文件很多内容,但是没有修改权限的时候,可以直接使用tee命令来激活sudo 权限,从而完成修改

重定向

  1. cmd > 1.txt , 将输出写入到1.txt,每一次都是重新覆盖,等同于: cmd 1> 1.txt(常用)

  2. cmd > > 1.txt,将输出追加到1.txt

  3. >, >> 两者只能将标准输出重定向到文件,而标准错误输出无法直接写入

  4. 案例:

    $  cp > cp.txt
    cp: missing file operand
    Try 'cp --help' for more information.cat cp.txt 返回空
    
  5. 文件描述符:

    1. 标准输入文件描述符:0
    2. 标准输出文件描述符:1
    3. 标准错误输出文件描述符:2
  6. 如果想将错误的信息重定向到文件,需要使用文件描述符2

    cp 2> cperr.txt  #2> 表示对错误信息重定向
    
  7. 如何将正确输出和错误输出都写入到一个文件中?(最常用)

    cp > /tmp/cperr1.txt 2>&1
    
  8. 写一段c代码,里面同时输出:stdout, stderr

    #include<stdio.h>int main()
    {//写一段c代码,里面同时输出:stdout, stderrfprintf(stdout, "this is stdout\n"); //fd 1fprintf(stderr, "this is stderr\n"); //fd 2return 0;
    }
    

    结果:

  1. 使用重定向进行输入

    cmd < file

    cat < /etc/passwd
    
  2. 其他:

    1. cmd < &fd
    2. cmd > &fd
    3. cmd < &-

二、函数

函数

  1. 没有参数列,没有返回值,return返回的是状态码,使用$?查看

  2. 定义函数:

    function test1()
    {#这个return的值,表示这个函数之后之后返回的状态码,而不出返回值,#不能通过a=test()来获取100值#可以通过echo $?来获取return 100
    }#function去掉
    test()
    {}
    #去掉括号
    function test
    {}#function和()至少保留一个,否则无法识别成函数ss
    
  3. 案例:

    #!/bin/bashfunction test1()
    {a=200#a=100#这个return的值,表示这个函数之后之后返回的状态码,而不出返回值,#不能通过a=test()来获取100值#可以通过echo $?来获取if [ $a -eq 100 ]; thenreturn 0elseecho "hello test1"return 100fi
    }
    #function去掉
    test2()
    {echo "hello test2"
    }
    #去掉括号
    function test3
    {echo "hello test3"#如果函数没有return值,那么最后一条执行命令的状态码,就是这个函数的状态码
    }#function和()至少保留一个,否则无法识别成函数ssv1=`test1`if [ $? -eq 0 ];thenecho "test1执行成功! a=100"
    elseecho "test1执行之后,a!=100"
    fi#echo "test1 的返回状态码:" $?
    #echo "v1 : " "$v1"test2
    test3
    

  1. 小结:

    1. 执行状态$?看return的返回值,如果没有返回值,则以最后一条命令的返回值为准

      test2()
      {echo "hello test2"cp  #echo $? 1
      }
      
    2. return修饰的状态码只能是数字

      function test3
      {echo "hello test3"#./functest.sh: line 26: return: beijing: numeric argument requiredreturn "beijing" #这是错误的用法,必须是数字
      }
      
  2. 函数参数:

    1. 调用方法与命令一样,也是$1, $2 …

      test4()
      {echo "test4 函数参数为: $1, $2"
      }test4 "hello" "world"
  3. 案例:递归遍历指定目录的文件!

#!/bin/bash#案例:递归遍历指定目录的文件!
#目录由用户通过命令行传入:#./recursive.sh ..recursive()
{#接收用户输入的目录#currDir="$1"local currDir="$1"echo "====> 当前目录为:" "$currDir"#遍历当前目录for i in `ls $currDir`do#这样才是有效的路径,后续才能正确判断性质#item="$currDir+"/"+$i"  <<=== 这是错误的,  /usr/+/+test.txtitem="$currDir/$i"#echo "item: " $item#如果i是文件,则打印if [ -f "$item" ]; thenecho "文件找到: $item"elif [ -d "$item" ];then#如果i是文件夹,则递归遍历echo "文件夹找到:" "$item"recursive $itemelseecho "未知文件:" "$item"fidone
}#判读输入参数的个数
if [ $# -ne 1 ];thenecho "Usage: recursive <文件目录>"exit
firecursive $1

调试

shell调试参数:

  • -n 帮助我们快速检查脚本的语法,而不是逐条执行

    • 脚本如果很大,中间执行过程很长,如果不能实现发现脚本错误,会浪费时间

    •  bash -n ./recursive.sh
      
      
      
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z8qiFsCW-1618819377024)(assets/1585713051107.png)]

  • -x,执行脚本的同时将代码执行过程打印到屏幕,便于追踪

    • bash -x recursive.sh ==》 作用于整个脚本

    • 可以在代码中,对指定的代码段进行调试

      • set -x ==> 启动调试

      • xxxx

      • set +x ==> 停止调试

  • -v,一边执行脚本,一边打印错误输出(很少用)

shift 8 ==> *, 快速定位当前光标所值单词(向下寻找,n)

shift 3 ==> #, 快速定位当前光标所值单词(向上寻找,n)

三、正则表达式

  1. 以S开头的字符串

    1. ^: 可以限定一个字符开头

    2. 目标:ShelloShello world
      表达式:^Shello
      
  2. 以数字结尾的字符串

    1. $:可以限定结尾

    2. 表示数字方式:

      1. [0123456789]
      2. [0-9]
    3. 目标:helloworld9
      表达式:helloworld[0-9]$
      
  3. 匹配空字符串(没有任何字符)

    1. ^$
  4. 字符串只包含三个数字

    1. 三个数字:[0-9][0-9][0-9]
  5. 字符串只有3到5个字母

    1. 字母表示:

      1. [a-zA-Z], 中间不要加空格
      2. 三个到五个字母:[a-zA-Z]{3,5}
    2. 重复次数{m, n}:
      1. 匹配前面修饰字符的次数,最少m次,最多n次
  6. 匹配不是a-z的任意字符

  7. ^ 在[]内部的时候,表示取反(注意,不是限定开头)

  8. [0-9] : 以非数字开头的字符

  9. 内反,外头

  10. [^a-z] <<<===

  11. 字符串有0到1个数字或者字母或者下划线

    1. 表示0-1的方法

      1. {0,1}
      2. ? : 表示0,1个
    2. [a-zA-Z0-9_]?

    3. 内容
      hello
      hello1
      hello*正则:
      hello[a-zA-Z0-9_]?匹配结果:
      hello
      hello1
      hello
      
  12. 字符串有1个或多个空白符号(\t\n\r等)

    1. \s ==》 代表空格

    2. +:一个或多个

    3. 内容:hello      world正则:hello\s+world结果:hello      world
      
  13. 字符串有0个或者若干个任意字符(除了\n)

    1. .: 点,代表任意字符,除了\n

    2. *:星号,重复前一个字符0-n次

    3. 匹配任意字符,任意次数:通常做法,是: .* ==> 相当于通配符里面的 *

    4. 内容:hello     asdfaasdfasdfadfasdfasdf asdfasdfasdf   world
      正则:hello.*world
      结果:hello     asdfaasdfasdfadfasdfasdf asdfasdfasdf   world
      
    5. .{,} ==> 与 .*效果相同

  14. 小结:

    1. ? ===> 重复前面一个字符0-1
    2. + ===> 重复前面一个字符1-n
    3. * ===> 重复前面一个字符0-n
    4. . ===> 表示任意字符
    5. ^ ===> 限定以某个字符开头
    6. [^a-z] ===> 在方括号内,表示取反(非a-z的任意字符)
    7. $ ===> 限定以某个字符结尾
    8. 数字 ====》 [0123456789] 或[0-9]
    9. 字母 ===> [abcd] [a-zA-Z]
  15. 匹配0或任意多组ABC,比如ABC,ABCABCABC

    1. 使用()进行分组,组成新的匹配单元
    2. (ABC)*
  16. 字符串要么是ABC,要么是123

    1. (ABC|123)

    2. 内容:
      ABC
      ABCABCABCD
      123456
      hellowlrd正则:(ABC|123)
      
  17. 字符串只有一个点号

    1. ^\.$
  18. 匹配十进制3位整数 :

    1. 0~999 , 5, 10 , 200, 999
    2. 分段匹配:
      1. 一位数:

        1. [0-9]
      2. 二位数:
        1. [1-9][0-9]
      3. 三位数:
        1. [1-9][0-9]{2}
      4. 整合:
        1. ^ ([0-9]|[1-9][0-9]{1,2})$
  19. 匹配0-255的整数, ip地址

    1. 分段

      1. 一位:[0-9]
      2. 二位:[1-9][0-9]
      3. 三位:
        • 100- 199

          • 1[0-9]{2}
        • 200-249
          • 2[0-4][0-9]
        • 250-255
          • 25[0-5]
      4. 整合:
        • ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$
        • 192.168.1.1
  20. 匹配端口号

    1. 0~65536
  21. email

    [\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?
    

三种正则表达式:

  1. 基础正则:(不使用) ==》 +?* 都当成普通字符来处理

  2. 扩展正则:(我们默认使用这个)==》 +?* 当成特殊字符

  3. Perl正则:

    1. +?*是特殊字符

    2. \d ==》 数字 [0-9]

    3. \w ==> 字符[a-zA-Z]

    4. 用法\d{3}\w 可以匹配:212c

四、其他命令

sort(排序)

-f 忽略字符大小写
-n 按照数值比较
-t 分割字符
-k 指定分割之后比较的字段
-u 只显示一次
-r 反向排序

使用:分割之后,截取第三段,以数字的值进行比较,反向打印

 sort passwd -t: -k3 -n -r

uniq(删除重复)

uniq.txt

xiaoliu 99 man 25
xiaowen 98 man 24
xiaoliu 99 man 25

去重方式,需要重复的两行挨着才能去重,一般和sort配合使用

cat uniq.txt | sort | uniq

wc

-l: 统计文件的行数 <==最常用

-c:统计字符

-w:统计单词数量

 duke ~$  wc /etc/passwd -l
32 /etc/passwdduke ~$  wc /etc/passwd -c
1694 /etc/passwdduke ~$  wc /etc/passwd -w
49 /etc/passwd

grep

grep [options]
主要参数:  grep --help可查看-c:只输出匹配行的计数。-i:不区分大小写。-h:查询多文件时不显示文件名。-l:查询多文件时只输出包含匹配字符的文件名。-n:显示匹配行及 行号。-s:不显示不存在或无匹配文本的错误信息。-v:显示不包含匹配文本的所有行。--color=auto :可以将找到的关键词部分加上颜色的显示。-r: 表示递归查询

-i 忽略大小写,NOLOGIN一行也打印了

grep -i nologin  passwd  --color

使用拓展正则[0-9].*

grep -i "[0-9].*bin"  passwd  --color

如果想使用Perl正则,需要指定-P开关

 grep -i -P  "\d.*bin"  passwd  --color

使用-r进行递归查询

grep -i -P  "\d.*bin"  *  --color  -r
cat /etc/passwd | grep root

find

语法:

find pathname -options [-print -exec -ok ...]
  1. 通过名字查找
find ./shell  -name "*.txt"

  1. 通过权限查找
 find ./shell/ -perm 755
  1. 通过类型查找
find ./shell -type f "*.txt"   #文件类型
find ./shell/ -type d -name "*.txt"  #文件夹类型-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
  1. 指定查找深度
 find / -maxdepth 2 -type d

  1. 不区分文件名字大小写,使用-iname
 find ./shell -type f -iname "*.txt"

  1. 对find查找到的文件,进行处理,使用

    1. -exec: 直接执行

      find ./shell -type f -iname "*.txt" -exec rm {} \;
      {} 替换为传入的数据
      \; 表示命令结束
      
    2. -ok:逐个确认

      find ./shell -type f -iname "*.txt" -ok rm {} \;
      
  2. 按照日期查询

    -atime : 访问时间
    -mtime: 修改时间, 内容修改
    -ctime: 不是创建时间,而是状态修改时间,权限,所有者
    
     find ./shell/ -mtime +1   -1: -n表示在n天之内修改的+1: +n表示在n天以前修改的
    

参数列表:

-name 按照文件名查找文件。
-perm 按照文件权限来查找文件。-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被
find命令忽略。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在
n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。
-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
-fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配
置文件中包含了本系统中有关文件系统的信息。
-mount 在查找文件时不跨越文件系统mount点。
-follow 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录,递归查找。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} \;,注意{}内部无空格,和\;之间含有一个空格分隔符。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。只有用户明确输入y才会执行后边的语句

head、tail、scp、xargs、sed、awk

go语言微服务项目,基础篇--02-shell相关推荐

  1. go语言微服务项目,高级篇--03go-mirco框架-gin框架-mvc-REST-Session

    go-Micro 框架 创建 micro 服务 命令:micro new --type srv test66 框架默认自带服务发现:mdns. 使用consul服务发现: 1. 初始consul服务发 ...

  2. 微服务架构·基础篇,傻瓜看了都会

    转自:cyfonly 看到最近"微服务架构"这个概念这么火,作为一个积极上进的程序猿,成小胖忍不住想要学习学习.而架构师老王(不是隔壁老王)最近刚好在做公司基础服务的微服务化研究和 ...

  3. 成小胖学习微服务架构·基础篇

    看到最近"微服务架构"这个概念这么火,作为一个积极上进的程序猿,成小胖忍不住想要学习学习.而架构师老王(不是隔壁老王)最近刚好在做公司基础服务的微服务化研究和落地,对此深有研究. ...

  4. 谷粒商城微服务分布式基础篇二—— Spring Cloud Alibaba、Nacos注册与发现

    文章目录 Spring Cloud Alibaba--微服务开发 Spring Cloud Alibaba是什么?  主要功能  组件 为什么不使用Spring Cloud 使用 Nacos Disc ...

  5. go语言微服务项目,基础篇--go2-高级语法

    一.基础语法补充 1. switch package mainimport ("fmt""os" )//从命令输入参数,在switch中进行处理func mai ...

  6. go语言微服务项目,基础篇--go4-聊天室

    一.概述 实现一个网络聊天室(群), 功能分析: 上线下线 聊天,其他人.自己都可以看到聊天消息 查询当前聊天室用户名字 who 可以修改自己名字rename|Duke 超时踢出 效果展示: 技术点分 ...

  7. java微服务开发(基础环境篇)

    java微服务开发(基础环境篇) 我们的目标是~~_浩瀚的宇宙 _~~全栈开发 俗话说的好 _工欲善其事 必先利其器 _对于一个开发者来说 一个好的开发环境可以带来的收益是巨大的 本篇的重点主要是li ...

  8. Docker学习篇——使用Docker部署账单微服务项目

    Docker概念 Docker 是一个开源的应用容器引擎 诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc) Docker 可以让开发者打包他们 ...

  9. .Net Core 商城微服务项目系列(一):使用IdentityServer4构建基础登录验证

    这里第一次搭建,所以IdentityServer端比较简单,后期再进行完善. 1.新建API项目MI.Service.Identity,NuGet引用IdentityServer4,添加类InMemo ...

最新文章

  1. Rose VS PowerDesigner
  2. CentOS6.5下Redis安装与配置
  3. excel字段自动java类,Java 接口自动化系列--工具类之Excel测试数据解析封装
  4. 使用doctest单元测试方式培训讲解:Python函数基础
  5. mysql外键约束查询语句_MySQL数据库 : 查询语句,连接查询及外键约束
  6. php商品状态精品 热销,ecshop商品列表,商品详细页,热销,精品,搜索列表页调用商品销售量(已销售数量)...
  7. 【Linux】shell命令学习之find
  8. 想做开源软件开发谁能带一下呀
  9. 一个教务系统多少钱_ERP系统多少钱
  10. WCF开发实战系列二:使用IIS发布WCF服务(转)
  11. 套料软件XSuperNEST(SigmaNEST套料引擎)巧妙利用余料
  12. 解决微信小程序银行卡号输入转换格式
  13. 用SPSS对参数进行正态性检验
  14. Ubuntu下U盘只读文件系统,图标上锁,文件无法写入
  15. 白鹭引擎 4.0 发布 让重度H5游戏研发更简单
  16. 实现不同的导航条,看直播app开发怎么做
  17. 企业微信可以转移好友吗?
  18. 无尽对决一直显示正在连接服务器,无尽对决服务器连接不上 | 手游网游页游攻略大全...
  19. 3 链表(LinkedList)
  20. win7+VS2010安装libpng

热门文章

  1. ROS1中使用Python发布和订阅主题
  2. 乐观锁、悲观锁和公平、非公平
  3. 关于社会强势人群和弱势人群的“交流”的讨论
  4. 乐观锁以及乐观锁的实现
  5. 加速LaTeX编译速度:使用VScode远程工具Remote-SSH在Linux系统上编译LaTeX
  6. Win10系统的备份与还原(手动)
  7. 记录每天学习的新知识:MQTT客户端
  8. 【智慧空开】ASCB系列63A智能微型断路器应用说明
  9. u盘文件损坏怎么恢复数据?有效方法分享
  10. 日常电脑操作应该注意的十几个小动作以及维护 (引用)