zoukankan      html  css  js  c++  java
  • Linux之shell 基本知识

    一、shell环境定义

    • 临时环境变量

    临时环境变量指的是用户在当前环境变量生效的变量,用户登陆系统后,直接在命令行定义的环境变量只能在当前的登陆环境中使用,当退出系统后,临时环境变量则失效

     

    •  将环境变量永久生效

    通过将环境变量定义写入到配置文件中,用户每次登陆时系统自动定义,则无需再到命令行重新定义。

    定义环境变量的常见配置文件如下:

    系统环境变量:/etc/profile 针对系统所有用户生效

    用户环境变量:$HOME_name/.bash_profile 针对特定用户生效。当用户登陆系统后,首先继承/etc/profile文件中的定义,

    再应用$HOME/.bash_profile文件中的定义。

    系统预定义的环境变量:如 $PATH、$HOME、$SHELL、$PWD等等,对所有用户有效

    二、shell脚本编程

    • 创建shell脚本

    一个shell脚本通常包含如下部分:

    首行

    第一行内容在脚本的首行左侧,表示脚本将要调用的shell解释器,内容如下:

    #!/bin/bash

    #! 符号能够被内核识别是一个脚本的开始,这一行必须位于脚本的首行,/bin/bash是bash程序的绝对路径,

    在这里表示后续的内容将通过bash程序解释执行

    创建脚本的三种方式:

    第一种:#echo "" >first.sh
    第二种: #touch first.sh
    第三种: #vi firsh.sh

    注释:

    带#开头的就是一段注释

    • shell脚本的权限

    一般情况下,默认创建的脚本是没有执行权限的,需要自行修改权限

     修改权限

    • shell脚本的执行

    1、输入脚本的绝对路径或相对路径

    绝对路径:/home/hyx/test.sh
    相对路径:./test.sh

    2、bash或sh+脚本

    bash test.sh
    sh test.sh

    注意:当脚本没有x权限时,root和文件所有者可以通过该方式正常执行。

    3、在脚本的路径前再加“.”,或source

    source test1.sh
    ./test1.sh

    区别:

    第一种和第二种会新开一个bash,不同bash中的变量无法共享

    第三种是在同一个shell里面执行的

    • shell变量

    变量的分类

    Linux Shell中的变量分为用户自定义变量、环境变量、位置参数变量和预定义变量

    可以通过set参看系统中存在的变量

    • (1)用户自定义变量                                                                                                  

    用户自定义变量由字母或下划线开头,由字母,数字或下划线序列组成,并且大小写字母的意义不同,变量名

    长度没有限制

    设置变量:习惯上用大写字母来命名变量。变量名以字母表示的字符开头,不能用数字。

    变量的调用

    在使用变量时,要在变量名前加上前缀"$",使用echo查看变量值

    echo $A

    变量赋值

    1、定义时赋值:变量=值(注意等号两边都不能有空格

    A="hello world"

    2、将一个命令的执行结果赋值给变量

    A=`ls -l`    ##    反引号,运行里面的命令,并将结果返回给变量A
    A=$(ls -l)    ##    等价于上面

    3、将一个变量赋值给另一个变量

    A="hello world"
    B=$A

    变量叠加

    AA=123
    BB="$AA"456
    CC=${AA}789

     补充:

    单引号和双引号的区别:单引号会将所有特殊字符脱意

    列出所有的变量

    set

    删除变量

    unset AA

    注意:用户自定义的变量,作用域为当前的shell环境

    • (2)环境变量                                                                                                  

    环境变量在当前shell和其所有的子shell中生效。如果将环境变量写入相应的配置文件,那么这个环境变量就会在

    所有的shell中生效

    export 变量名=变量值 申明变量
    作用域:当前shell以及所有的子shell
    •  (3)位置参数变量                                                                                        

    •  (4)预定义变量                                                                                            

    • read命令

    格式:read [选项] 值
    
    read -p(提示语句) -n(字符个数) -t(等待时间,单位为秒) -s(隐藏输入)

     

    • 运算符

    Num1=11
    Num2=22
    Sum=$Num1+$Num2
    echo Sum

     格式:expr m + n(注意运算符前后必须要有空格) 或 $((m+n))

    expr 3 + 5
    echo `expr 3 * 5`(是转移符)

     计算 (2+3)*4

    ##    第一种方式
    S=`expr 2 + 3`
    expr $S * 4
    
    ##    第二种方式
    expr `expr 2 + 3` * 4
    
    ##    第三种方式
    echo $(((2+3)*4))

    补充:$()和${}的区别

    $()的用途和反引号``一样,表示优先执行的命令

    ${}则是取变量

    $((运算内容)) 适用于数值运算

    • 条件测试

    内置test命令

    内置test命令常用操作符号[]表示,将表达式写在[]里面,如下:

    [ expression ] ,(注意:表达式首尾都要留空格)
    
    或者 test expression

    测试范围:整数、字符串、文件

    表达式的结果为真,则test的返回值为0,反之为1

    字符串测试:

    test  str1 == str2    测试字符串是否相等 =
    
    test  str1 != str2    测试字符串是否不相等
    test  str1            测试字符串是否不为空
    test  -n str1     测试字符串是否不为空  注意str1加双引号和不加的区别
    test  -z  str1    测试字符串是否为空

    整数测试:

    test   int1 -eq  int2    测试整数是否相等 equals
    test   int1 -ge  int2    测试int1是否>=int2
    test   int1 -gt  int2    测试int1是否>int2
    test   int1 -le  int2    测试int1是否<=int2
    test   int1 -lt  int2    测试int1是否<int2
    test   int1 -ne  int2    测试整数是否不相等

    文件测试:

    test  -d  file ;echo $?  指定文件是否目录
    
    test  –e  file ;echo $?    文件是否存在 exists
    test  -f  file  ;echo $?   指定文件是否常规文件
    test –L File   ;echo $?  文件存在并且是一个符号链接 
    
    
    test  -r  file    指定文件是否可读
    test  -w  file    指定文件是否可写
    
    test  -x  file    指定文件是否可执行

    多重条件测试:

    条件1 –a 条件2 逻辑与  两个都成立,则为真
    
    条件1 –o 条件2 逻辑或   只要有一个为真,则为真
    
    ! 条件                逻辑非    取反

     

     

    • 流程控制语句

    • if/else 命令

    1、单分支if条件语句

    if [ 条件判断式 ]
    
        then
    
            程序
    
    fi   
    
    或者
    
    if [ 条件判断式 ] ; then 
    
        程序
    
    fi

    单分支条件语句需要注意几个点

    if语句使用fi结尾,和一般语言使用大括号结尾不同。

    [ 条件判断式 ] 就是使用test命令判断,所以中括号和条件判断式之间必须有空格

    then后面跟符号条件之后执行的程序,可以放在[]之后,用“;”分割,也可以换行写入,就不需要";"了。

    2、多分支if条件语句

    if [ 条件判断式1 ]
    
        then
    
            当条件判断式1成立时,执行程序1
    
    elif  [ 条件判断式2 ] 
    
        then      
    
            当条件判断式2成立时,执行程序2
    
    ...省略更多条件
    
    else
    
        当所有条件都不成立时,最后执行此程序
    
    fi

     case语句

    case命令是一个多分支的if/else命令,case变量的值用来匹配value1,value2,value3等等。

    case 变量 in
    PAT1)
        执行语句
        ;;
    PAT2)
        执行语句
        ;;
    *)
        默认执行语句
        ;;
    esac

    • for 循环

    第一种:

    for N in 1 2 3
    
    do
    
    echo $N
    
    donefor N in 1 2 3; do echo $N; donefor N in {1..3}; do echo $N; done

    第二种:

    for ((i = 0; i <= 5; i++))
    
    do
    
    echo "welcome $i times"
    
    donefor ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done

    • while循环

    while [ expression ]
    
    do
    
    执行语句
    
    ...
    
    done
    
    或者
    
    while ((expression))
    
    do
    
    执行语句
    
    ...
    
    done

    • 自定义函数

    函数的格式如下:

    第一种:

    函数名()
    
    {
    
    命令1…..
    
    命令2….
    
    return 返回值变量
    
    }

    第二种:

    [ function ] funname [()]    
    
    {
    
      action;
    
      [return int;]
    
    }

    第三种

    function funname {
    
      action;
    
      return
    
    }

     函数的调用: 直接函数名就可以调用函数

    注意:

    如果函数名后没有(),在函数名和{ 之间,必须要有空格以示区分。

    • 脚本调试

    sh -x script
    这将执行该脚本并显示所有变量的值。

    在shell脚本里添加  

    set -x  对部分脚本调试
    sh -n script
    不执行脚本只是检查语法的模式,将返回所有语法错误。

    sh –v script

    执行并显示脚本内容

     

     

     

    • cut

    cut命令是用来剪下文本文件里的数据,文本文件可以是字段类型或是字符类型。下面给出应用实例:
        /> cat /etc/passwd
        root:x:0:0:root:/root:/bin/bash
        bin:x:1:1:bin:/bin:/sbin/nologin
        daemon:x:2:2:daemon:/sbin:/sbin/nologin
        adm:x:3:4:adm:/var/adm:/sbin/nologin
        ... ...
        /> cut -d : -f 1,5 /etc/passwd     #-d后面的冒号表示字段之间的分隔符,-f表示取分割后的哪些字段
        root:root                                 #这里取出的是第一个和第五个字段。
        bin:bin
        daemon:daemon
        adm:adm
        ... ...
        /> cut -d: -f 3- /etc/passwd       #从第三个字段开始显示,直到最后一个字段。
        0:0:root:/root:/bin/bash
        1:1:bin:/bin:/sbin/nologin
        2:2:daemon:/sbin:/sbin/nologin
        3:4:adm:/var/adm:/sbin/nologin
        4:7:lp:/var/spool/lpd:/sbin/nologin
        ... ...    
        这里需要进一步说明的是,使用cut命令还可以剪切以字符数量为标量的部分字符,该功能通过-c选项实现,其不能与-d选项共存。
        /> cut -c 1-4 /etc/passwd          #取每行的前1-4个字符。
        /> cut -c-4 /etc/passwd            #取每行的前4个字符。 
        root
        bin:
        daem
        adm:
        ... ...
        /> cut -c4- /etc/passwd            #取每行的第4个到最后字符。
        t:x:0:0:root:/root:/bin/bash
        :x:1:1:bin:/bin:/sbin/nologin
        mon:x:2:2:daemon:/sbin:/sbin/nologin
        :x:3:4:adm:/var/adm:/sbin/nologin
        ... ...
        /> cut -c1,4 /etc/passwd           #取每行的第一个和第四个字符。
        rt
        b:
        dm
        a:
        ... ...
        /> cut -c1-4,5 /etc/passwd        #取每行的1-4和第5个字符。
        root:
        bin:x
        daemo
        adm:x

     

     

    • awk和sed

    sed

    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法

    sed命令行格式为:
             sed [-nefri] ‘command’ 输入文本

    常用选项: 

    • -n:使用安静模式。在一般sed用法中,所有的资料一般都会被列出到屏幕上,如果加上-n参数后,只有经过sed特殊处理的那一行才会被列出来。
    • -e:值接在指令行模式上进行sed的工作编辑。
    • -f:-f filename 可以执行filename内的sed动作。
    • -r:支持扩展表达式
    • -i:直接修改读取的档案内容。

    常用命令:

    • a:新增
    • c:取代,后面可以接字符串
    • d:删除
    • i:插入
    • p:列印,通常与sed -n一起
    • s:取代,可以搭配正规表示法

    实例:

    删除某行:

    sed '1d' test.txt    # 删除第一行
    sed '$d' test.txt     #删除最后一行
    sed '1,2d' test.txt  # 删除第一行到第二行
    sed '2,$d' test.txt # 删除第二行到最后一行

    显示某行:

    sed -n '1p' test.txt    # 显示第一行
    sed -n '$p' test.txt     #显示最后一行
    sed -n '1,2p' test.txt  # 显示第一行到第二行
    sed -n '2,$p' test.txt # 显示第二行到最后一行

    使用模式进行查询

    sed -n '/test/p' test.txt    # 查询包括test所在的行
    sed -n '/$/p'    test.txt    # 查询包括$所在的行

    增加一行或多行字符串

    sed '1a hello' test.txt    # 在第一行新增一行hello
    sed '1,3a hello' test.txt    # 在第一行到第三行新增一行hello

    代替一行或多行

    sed '1c hello' test.txt    # 第一行替换为hello
    sed '1,3c hello' test.txt    # 第一行和第三行替换为hello

    代替一行中的某部分

    sed -in '/name=/p' test.txt | sed 's/name=//g'        #将name=删除
    sed -i 's/name=/name/g' `grep -rl ./`            #批量修改目录下的文件的字段

    删除匹配行

    sed -i '/匹配字符/d' 文件        #删除文件中含有匹配字符的行

    替换匹配行中的某个字符串

    sed -i '/匹配字符串/s/需要替换的字符串/替换后的字符串/g' 文件

    awk

    sed常用于一整行数据的处理,awk则更倾向于将一行数据分为多个字段进行处理

    选项说明:

     awk -F "字符串"  以某个字符串为分隔符进行分割 

    例子:

    文件:test.txt

    a=$(cat test.txt | awk -F "=" '{print$1}')        #以“=”为分隔符,取每行的第一个字段

     结果:

    常用的内置变量:

    NR        #行数
    NF        #列数
  • 相关阅读:
    程序编译的四个阶段
    c++的符号表的肤浅认识
    git高级用法之cheery-pick
    rust 使用国内镜像,快速安装方法
    protobuf 的enum与string转换
    c++ 获取GMT 时间和字符串
    proto3 不支持内建类型的非空判断即 hasXXX
    cmake 中的 compile_commands.json 文件
    整数划分问题(记忆化搜索和DP方法)
    查找系列合集-二分查找
  • 原文地址:https://www.cnblogs.com/maoxinjueluo/p/13060831.html
Copyright © 2011-2022 走看看