zoukankan      html  css  js  c++  java
  • sh脚本学习笔记

    ------------恢复内容开始------------

    1、理解:shell 本身是一个用 c 语言编写的程序,又是一种解释型的语言。 是用户使用 Liunx 的桥梁

    2、常用方式:

      a、交互式 interactive : 解释执行用户的命令 , 用户输入一条命令, shell 就解释执行一条

      b、批处理 batch : 用户事先写一个 shell 脚本, 其中很多条命令,让 shell 一次把这些命令执行完

    3、学习内容记录

       1)简单的sh文件

    #!/bin/bash
    echo "hello world"

    “#!” 是一个约定的标记,告诉系统这个脚本需要什么解释器来执行,echo 命令用与想窗口输出文本,类似于java 的 system.out。

      2)执行sh文件

     chmod +X ./text.sh
     ./text.sh

     chmod +X ./text.sh #使脚本具有执行权;./text.sh 就会直接在当前目录找(注意要加".",表示在当前目录下执行text.sh)

      3)变量的定义和使用

    #!/bin/bash
    echo "what is your name?"
    NAME=tommy
    echo "my name is ${NAME}"

      注:变量赋值时等号两边不可有空格;$后面的花括号可以不加

      4)实例解决

    #实例一
    if
    [ -z $APP_DIR ] then export APP_DIR=pwd fi export FWD_DIR=dirname $APP_DIR/forward

      -z判断变量值是否为空,如果为空则为该变量赋值,所赋值为pwd命令执行的结果(获取当前绝对路径),就是程序运行时所在目录;

      fi为if语句的结束,相当于end if ;

      最后一句用来为另一个变量FWD_DIR赋值,其值为取出APP_DIR变量的值,取其所在目录的路径,然后在路径后追加字符forward作为FWD_DIR的值。

    #实例二
    #获取当前时间 export time_today
    ='date + %y%m%d' #x用数字代替,如果需要几天前的直接写正数,如果要几天后的日期直接写负数即可; date -d "x days ago" +%Y%m%d #x用数字代替,如果需要几周前的直接写正数,如果要几周后的日期直接写负数即可; date -d "x weeks ago" +%Y%m%d #x用数字代替,如果需要几年前的直接写正数,如果要几年后的日期直接写负数即可; date -d "x years ago" +%Y%m%d
    特殊变量列表
    变量    含义
    $0    当前脚本的文件名

    $n 传递给脚本的函数的参数,n是一个数字,表示第几个参数

    比如你新建了一个shell脚本 Test.sh, 内容如下:

    #!/bin/sh
    echo "shell脚本本身的名字: $0"
    echo "传给shell的第一个参数: $1"
    echo "传给shell的第二个参数: $2"

    保存退出后,你在Test.sh所在的目录下输入 bash Test.sh 1 2

    结果为:

    shell脚本本身的名字: Test.sh
    传给shell的第一个参数: 1
    传给shell的第二个参数:  2
    
    $#    传递给脚本或函数参数的个数
    $*    传递给脚本或者函数的所有参数
    $@    传递给脚本或者函数的所有参数,与 $*是否被双引号包含的区别
    $?    上个命令的退出状态,或者函数的返回值
    $$    当前 shell进程id,对于shell脚本,就是这些脚本所在的进程id.

     shell中的tee命令:

    ls | tee ls.txt 将会在终端上显示ls命令的执行结果,并把执行结果输出到ls.txt文件中,将会覆盖原文件的内容,若无ls.txt文件,将会自动创建该文件
    ls | tee -a ls.txt 保留ls.txt文件中原来的内容,并把ls命令的执行结果追加到ls.txt文件的最后,不覆盖原来的内容

    ls | tee file1.txt file2.txt将执行结果同时保存到file1和file2中。

    shell中的逻辑判断:

    一、两种逻辑判断表示方式
    1、(($a > 60))
    read -p "Please input your score: " a
    if (($a<60)); then
        echo "You didn't pass the exam."
    fi
    
    执行结果:
    [root@localhost sbin]# sh if1.sh
    Please input your score: 90
    [root@localhost sbin]# sh if1.sh
    Please input your score: 33
    You didn't pass the exam.
    
    2、[$a -gt 60]
    -lt (小于),-gt (大于),-le (小于等于),-ge (大于等于),-eq (等于),-ne (不等于),
    -z (空串),-n(非空串),=(两个字符相等),!=(两个字符不相等) a
    =10 if [ $a -lt 5 ] then echo ok fi 二、 && 和 ||的使用 [root@localhost sbin]# a=10; if [ $a -lt 1 ] && [ $a -gt 5 ]; then echo ok; fi ok [root@localhost sbin]# a=10; if [ $a -gt 1 ] || [ $a -lt 10 ]; then echo ok; fi ok
    -a与 -o或
    if [$? -ne 0 -o $ip -le 0]
    三、判断关于档案属性
    -e :判断文件或目录是否存在 -d :判断是不是目录,并是否存在 -f :判断是否是普通文件,并存在 -r :判断文档是否有读权限 -w :判断是否有写权限 -x :判断是否可执行 [root@localhost sbin]# if [ -f /root/test.txt ]; then echo ok; fi ok [root@localhost sbin]# if [ -r /root/test.txt ]; then echo ok; fi ok [root@localhost sbin]# if [ -w /root/test.txt ]; then echo ok; fi ok [root@localhost sbin]# if [ -x /root/test.txt ]; then echo ok; fi [root@localhost sbin]# if [ -e /root/test1.txt ]; then echo ok; fi 四、case逻辑判断 case 变量 in value1) command ;; value2) command ;; value3) command ;; *) command ;; esac

    关于${0##*/}

    表示拿掉路径从左往右最后一个“/”和其左边的部分。

    举个栗子:

    FILENAME=import_userinfo 

    FILENAME=${0##*/}  //将当前运行脚本的名称赋给filename

    FILENAME=${FILENAME%%.SH}  //将filename中的".SH"及其右边的部分去掉

    FILENAME=${FILENAME%%.sh}  //将filename中的".sh"及其右边的部分去掉

    假設我們定義了一個變量為:
    file=/dir1/dir2/dir3/my.file.txt
    我們可以用 ${ } 分別替換獲得不同的值:
    ${file#*/}:拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
    ${file##*/}:拿掉最後一條 / 及其左邊的字串:my.file.txt
    ${file#*.}:拿掉第一個 .  及其左邊的字串:file.txt
    ${file##*.}:拿掉最後一個 .  及其左邊的字串:txt
    ${file%/*}:拿掉最後條 / 及其右邊的字串:/dir1/dir2/dir3
    ${file%%/*}:拿掉第一條 / 及其右邊的字串:(空值)
    ${file%.*}:拿掉最後一個 .  及其右邊的字串:/dir1/dir2/dir3/my.file
    ${file%%.*}:拿掉第一個 .  及其右邊的字串:/dir1/dir2/dir3/my
    記憶的方法為:
    # 是去掉左邊(在鑑盤上 # 在 $ 之左邊)
    % 是去掉右邊(在鑑盤上 % 在 $ 之右邊)
    單一符號是最小匹配﹔兩個符號是最大匹配。

    length='expr length $Date'

    计算date的长度并赋值给length变量

    expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。
    实例
    1、计算字串长度
    > expr length “this is a test”
     14
    
    2、抓取字串(索引从1开始)从第三个开始,截取五个
    > expr substr “this is a test” 3 5
    is is
    
    3、抓取第一个字符数字串出现的位置
    > expr index "sarasara"  a
     2
    
    4、整数运算
     > expr 14 % 9
     5
     > expr 10 + 10
     20
     > expr 1000 + 900
     1900
     > expr 30 / 3 / 2
     5
     > expr 30 * 3 (使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义)
     90
     > expr 30 * 3
     expr: Syntax error

    $ip "+" 10 ?> /dev/null

        /dev/null是一个特殊的设备文件,这个文件接收到的任何数据都会被丢弃。因此,null这个设备文件通常被称为黑洞。
        前面的问号指的是文件描述符:
        0——stdin(标准输入)
        1——stdout(标准输出)
        2——stderr(标准错误)
        如果是问号,意思应该是不管哪种信息,都不希望在日志输出。
    eq:2&>/dev/null 将不需要的错误信息丢弃

     grep

    Linux常用命令——grep
    
    grep  文本过滤工具
    语法格式:grep 【options】【pattern】【file】 grep [参数] [匹配模式] [查找的文件]
    注意:
    1.grep 是 Linux 系统中最重要的命令之一,其功能是从文本文件或管道数据流中筛选匹配的行及数据。
    2.grep 命令里的匹配模式或模式匹配,都是你要好找的东西,可以是普通的文字符号也可以是正则表达式。
    参数选项:
    
    参数    说明
    -c    计算找到‘搜索字符串’的行数
    -o    指数出匹配的内容
    -i    不区分大小写
    -n    显示匹配内容的行号
    -r    当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作
    -v    反向选择,即没有‘搜索字符串’内容的行
    -l    列出文件内容符合指定的范本样式的文件名称
    -E    扩展 grep,即 egrep,可以使用扩展正则表达式
    --color=auto    搜索关键词显示颜色
    -V    显示软件版本信息
    案例文件:
    Linux常用命令——grep
    
    案例一:
    参数举例
    
    参数
    -c、-o、-i 举例
    
    Linux常用命令——grep
    参数 -n 举例
    
    Linux常用命令——grep
    注意:自己测试一些含有正则表达式的检索,发现 egrep 可以实现的,grep 也可以实现。但例如:egrep -v "^$|#" file1.txt ,grep 就实现不了,是因为 egrep 增加了额外的正则表达式元字符集的效果,而对于标准grep,这时在扩展元字符前面加  ,grep 便会自动启用扩展选项-E
    
    
    
    
    
    案例二:
    grep正则表达式元字符集
    
    字符集    说明    案例
    ^    锚定行的开始    如:'^grep' 匹配所有以 grep 开头的行
    $    锚定行的结束    如:'grep$' 匹配所有以 grep 结尾的行
    .    匹配一个非换行符的字符    如:'gr.p' 匹配 gr 后接一个任意字符,然后是 p
    *    匹配零个或多个先前字符    如:' *grep' 匹配所有一个或多个空格后紧跟 grep 的行。 .* 一起用代表任意字符
    [ ]    匹配一个指定范围内的字符    如:'[Gg]rep' 匹配 Grep 和 grep
    [^ ]    匹配一个不在指定范围内的字符    如:'[^A-FH-Z]rep' 匹配不包含 A-F 和 H-Z 的一个字母开头,紧跟 rep 的行
    (..)    标记匹配字符    如:'(love)',love 被标记为1
    <    锚定单词的开始    如:'<grep' 匹配包含以grep开头的单词的行
    >    锚定单词的结束    如:'grep>' 匹配包含以grep结尾的单词的行
    x{m}    连续重复字符 x,m 次    如:'o{5}' 匹配包含连续5个o的行
    x{m,}    连续重复字符 x,至少 m 次    如:'o{5,}' 匹配至少连续有5个 o 的行
    x{m,n}    连续重复字符 x,至少 m 次,不多于 n 次    如:'o{5,10}' 匹配连续 5-10 个 o 的行
    w    匹配一个文字和数字字符也就是 [A-Za-z0-9]    如:'Gw*p' 匹配以 G 后跟零个或多个文字或数字字符,然后是p
    W    w 的反置形式,匹配一个非单词字符    如:点号句号等。W* 则可匹配多个
        单词锁定符    如: 'grep' 只匹配 grep,即只能是 grep 这个单词,两边均为空格
    案例三:
    常见用法
    字符集 ^、<、  举例
    
    
    
    
    Linux常用命令——grep
    命令 grep 在文件中查找字符
    
    
    
    
    Linux常用命令——grep
    参数 -l 的使用
    
    
    
    
    Linux常用命令——grep
    命令 egrep 与参数 -v 的及字符集的使用举例
    
    
    
    
    Linux常用命令——grep
    注意:去掉空行与注释行
    案例四:
    递归搜索文件,参数 -r、-e、-o、-n 的使用举例
    
    

     

    
    Linux常用命令——grep
    Linux常用命令——grep
    案例五:
    grep搜索结果中包括或者排除指定文件
    1.--exclude 在搜索结果中排除等号后所有文件
    
    
    

    Linux常用命令——grep
    2.--exclude-from 在搜索结果中排除filelist文件列表里的文件
    
    
    

    Linux常用命令——grep
    3.--include 只在所指定的目录文件中递归搜索字符 " and "
    
    
    


    Linux常用命令——grep 案例六: 使用 0 值字节后缀的 grep 与 xargs
    
    
    

    Linux常用命令——grep 注意:
    -Z 参数个人理解为取消换行符"以一行的形式显示内容",xargs -0 是来解决不能"以一行的形式执行显示内容“传参这个问题的,-Z通常和-l结合使用。(-Z选项来指定以0值字节作为终结符文件名(),xargs -0 读取输入并用0值字节终结符分隔文件名) 案例七: 打印出匹配文本之前或者之后的行 参数 -A、-B、-C 的使用举例
    
    

     

    注意:如果匹配结果有多个,会用 " -- " 作为各匹配结果之间的分隔符,如果多个结果显示的行数相连或重叠则不会显示 " -- " 分隔符

  • 相关阅读:
    MybatisPlus常用操作和配置
    C# Socket编程 同步以及异步通信
    PostgreSQL学习手册(PL/pgSQL过程语言)
    PostgreSQL学习手册(客户端命令<一>)
    PostgreSQL学习手册(服务器配置)
    PostgreSQL学习手册(系统视图)
    PostgreSQL学习手册(客户端命令<二>)
    PostgreSQL学习手册(角色和权限)
    PostgreSQL学习手册(数据库管理)
    PostgreSQL学习手册(系统表)
  • 原文地址:https://www.cnblogs.com/JimShi/p/13555528.html
Copyright © 2011-2022 走看看