zoukankan      html  css  js  c++  java
  • (二)shell编程

    环境变量

    环境变量:

    可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
    一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
    一般只在系统配置文件中使用,在脚本中较少使用
    

    变量声明和赋值:

    #声明并赋值
    export name=VALUE
    declare -x name=VALUE
    #或者分两步实现
    name=VALUE
    export name
    

    变量引用:

    $name
    ${name}
    

    显示所有环境变量:

    env
    printenv
    export
    declare -x
    

    查看指定进程的环境变量

    cat /proc/$PID/environ
    

    删除变量:

    unset name
    

    bash内建的环境变量

    PATH
    SHELL
    USER
    UID
    HOME
    PWD
    SHLVL #shell的嵌套层数,即深度
    LANG
    MAIL
    HOSTNAME
    HISTSIZE
    _ #下划线,表示前一命令的最后一个参数
    

    范例: 查看进程的环境变量

    [root@centos8 ~]#cat /proc/1235/environ
    USER=rootLOGNAME=rootHOME=/rootPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/us
    r/binSHELL=/bin/bashTERM=linuxSSH_AUTH_SOCK=/tmp/sshiIeuAxdLiY/
    agent.1234XDG_SESSION_ID=1XDG_RUNTIME_DIR=/run/user/0DBUS_SESSION_BUS
    _ADDRESS=unix:path=/run/user/0/busSSH_CLIENT=10.0.0.1 13258
    22SSH_CONNECTION=10.0.0.1 13258 10.0.0.8 22SSH_TTY=/dev/pts/0[root@centos8 ~]#
    [root@centos8 ~]#
    [root@centos8 ~]#cat /proc/1235/environ |tr '' '
    '
    USER=root
    LOGNAME=root
    HOME=/root
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
    SHELL=/bin/bash
    TERM=linux
    SSH_AUTH_SOCK=/tmp/ssh-iIeuAxdLiY/agent.1234
    XDG_SESSION_ID=1
    XDG_RUNTIME_DIR=/run/user/0
    DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus
    SSH_CLIENT=10.0.0.1 13258 22
    SSH_CONNECTION=10.0.0.1 13258 10.0.0.8 22
    SSH_TTY=/dev/pts/0
    

    只读变量

    只读变量:只能声明定义,但后续不能修改和删除,即常量

    声明只读变量:

    readonly name
    declare -r name
    

    查看只读变量:

    readonly [-p]
    declare -r
    

    范例:

    [root@centos8 ~]#readonly PI=3.14159
    [root@centos8 ~]#echo $PI
    3.14159
    [root@centos8 ~]#PI=3.14
    -bash: PI: readonly variable
    [root@centos8 ~]#unset PI
    -bash: unset: PI: cannot unset: readonly variable
    [root@centos8 ~]#echo $PI
    3.14159
    [root@centos8 ~]#exit
    logout
    

    位置变量
    位置变量:在bash shell中内置的变量, 在脚本代码中调用通过命令行传递给脚本的参数

    $1, $2, ... 对应第1个、第2个等参数,shift [n]换位置
    $0 命令本身,包括路径
    $* 传递给脚本的所有参数,全部参数合为一个字符串
    $@ 传递给脚本的所有参数,每个参数为独立字符串
    $# 传递给脚本的参数的个数
    注意:$@ $* 只在被双引号包起来的时候才会有差异
    

    清空所有位置变量

    set --
    

    范例:

    [root@centos8 ~]#cat /data/scripts/arg.sh
    #!/bin/bash
    echo "1st arg is $1"
    echo "2st arg is $2"
    echo "3st arg is $3"
    echo "10st arg is ${10}"
    echo "11st arg is ${11}"
    echo "The number of arg is $#"
    echo "All args are $*"
    echo "All args are $@"
    echo "The scriptname is `basename $0`"
    [root@centos8 ~]#bash /data/scripts/arg.sh {a..z}
    1st arg is a
    2st arg is b
    3st arg is c
    10st arg is j
    11st arg is k
    The number of arg is 26
    All args are a b c d e f g h i j k l m n o p q r s t u v w x y z
    All args are a b c d e f g h i j k l m n o p q r s t u v w x y z
    The scriptname is arg.sh
    

    范例:$*和$@的区别

    [root@centos8 scripts]#cat f1.sh
    #!/bin/bash
    echo "f1.sh:all args are $@"
    echo "f1.sh:all args are $*"
    ./file.sh "$*"
    [root@centos8 scripts]#cat f2.sh
    #!/bin/bash
    echo "f2.sh:all args are $@"
    echo "f2.sh:all args are $*"
    ./file.sh "$@"
    [root@centos8 scripts]#cat file.sh
    #!/bin/bash
    echo "file.sh:1st arg is $1"
    [root@centos8 scripts]#./f1.sh a b c
    f1.sh:all args are a b c
    f1.sh:all args are a b c
    file.sh:1st arg is a b c
    [root@centos8 scripts]#./f2.sh a b c
    f2.sh:all args are a b c
    f2.sh:all args are a b c
    file.sh:1st arg is a
    

    范例: 利用软链接实现同一个脚本不同功能

    [root@centos8 ~]#cat test.sh
    #!/bin/bash
    #********************************************************************
    echo $0
    [root@centos8 ~]#ln -s test.sh a.sh
    [root@centos8 ~]#ln -s test.sh b.sh
    [root@centos8 ~]#./a.sh
    ./a.sh
    [root@centos8 ~]#./b.sh
    ./b.sh
    

    退出状态码变量

    当我们浏览网页时,有时会看到下图所显示的数字,表示网页的错误信息,我们称为状态码,在shell脚
    本中也有相似的技术表示程序执行的相应状态。

    进程执行后,将使用变量 $? 保存状态码的相关数字,不同的值反应成功或失败,$?取值范例 0-255

    $?的值为0 #代表成功
    $?的值是1到255 #代表失败
    

    范例:

    ping -c1 -W1 hostdown &> /dev/null
    echo $?
    

    范例:

    [root@centos8 ~]#curl -fs http://www.wangxiaochun.com >/dev/null
    [root@centos8 ~]#echo $?
    0
    

    用户可以在脚本中使用以下命令自定义退出状态码

    exit [n]
    

    注意:

    脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
    如果exit后面无数字,终止退出状态取决于exit命令前面命令执行结果
    如果没有exit命令, 即未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后
    一条命令的状态码
    

    展开命令行

    展开命令执行顺序

    把命令行分成单个命令词
    展开别名
    展开大括号的声明{}
    展开波浪符声明 ~
    命令替换$() 和 ``
    再次把命令行分成命令词
    展开文件通配*、?、[abc]等等
    准备I/0重导向 <、>
    运行命令
    

    防止扩展

    反斜线()会使随后的字符按原意解释
    

    范例:

    [root@centos8 ~]#echo Your cost: $5.00
    Your cost: $5.00
    

    加引号来防止扩展

    单引号(’’)防止所有扩展
    双引号(”“)也可防止扩展,但是以下情况例外:$(美元符号)
    

    变量扩展

    `` : 反引号,命令替换
    :反斜线,禁止单个字符扩展
    !:叹号,历史命令替换
    

    脚本安全和 set

    set 命令:可以用来定制 shell 环境

    $- 变量
    h:hashall,打开选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过set +h将h选
    项关闭
    i:interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell,
    在脚本中,i选项是关闭的
    m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等
    B:braceexpand,大括号扩展
    H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的
    一个历史命令,“!n”返回第 n 个历史命令
    

    范例:

    [root@centos8 ~]#echo $-
    himBHs
    [root@centos8 ~]#set +h
    [root@centos8 ~]#echo $-
    imBHs
    [root@centos8 ~]#hash
    -bash: hash: hashing disabled
    [root@centos8 ~]#echo {1..10}
    1 2 3 4 5 6 7 8 9 10
    [root@centos8 ~]#echo $-
    imBHs
    [root@centos8 ~]#set +B
    [root@centos8 ~]#echo $-
    imHs
    [root@centos8 ~]#echo {1..10}
    {1..10}
    

    set 命令实现脚本安全

    -u 在扩展一个没有设置的变量时,显示错误信息, 等同set -o nounset
    -e 如果一个命令返回一个非0退出状态值(失败)就退出, 等同set -o errexit
    -o option 显示,打开或者关闭选项
    显示选项:set -o
    
    打开选项:set -o 选项
    关闭选项:set +o 选项
    -x 当执行命令时,打印命令及其参数,类似 bash -x
    

    范例:

    [root@centos8 ~]#set -o
    allexport off
    braceexpand on
    emacs on
    errexit off
    errtrace off
    functrace off
    hashall on
    histexpand on
    history on
    ignoreeof off
    interactive-comments on
    keyword off
    monitor on
    noclobber off
    noexec off
    noglob off
    nolog off
    notify off
    nounset off
    onecmd off
    physical off
    pipefail off
    posix off
    privileged off
    verbose off
    vi off
    xtrace off
    

    格式化输出 printf

    格式

    printf "指定的格式" "文本1" ”文本2“……
    

    常用格式替换符

    替换符 功能
    %s 字符串
    %d,%i 十进制整数
    %f 浮点格式
    %c ASCII字符,即显示对应参数的第一个字符
    %b 相对应的参数中包含转义字符时,可以使用此替换符进行替换,对应的转义字符会被转义
    %o 八进制值
    %u 不带正负号的十进制值
    %x 十六进制值(a-f)
    %X 十六进制值(A-F)
    %% 表示%本身

    说明:

    %#s 中的数字代表此替换符中的输出字符宽度,不足补空格,默认是右对齐,%-10s表示10个字符宽,- 表示
    左对齐
    %03d 表示3位宽度,不足前面用0补全,超出位数原样输出
    %.2f 中的2表示小数点后显示的小数位数
    

    常用转义字符

    转义符 功能
    a 警告字符,通常为ASCII的BEL字符
     后退
    f 换页
    换行
    回车
    水平制表符
    v 垂直制表符
    表示本身

    范例:

    [root@centos8 ~]#printf "%s" 1 2 3 4
    1234[root@centos8 ~]#
    [root@centos8 ~]#printf "%s
    " 1 2 3 4
    1
    2
    3
    4
    [root@centos8 ~]#printf "%f
    " 1 2 3 4
    1.000000
    2.000000
    3.000000
    4.000000
    #.2f 表示保留两位小数
    [root@centos8 ~]#printf "%.2f
    " 1 2 3 4
    1.00
    2.00
    3.00
    4.00
    [root@centos8 ~]#printf "(%s)" 1 2 3 4;echo
    (1)(2)(3)(4)
    [root@centos8 ~]#printf " (%s) " 1 2 3 4;echo ""
    (1) (2) (3) (4)
    [root@centos8 ~]#printf "(%s)
    " 1 2 3 4
    (1)
    (2)
    (3)
    (4)
    [root@centos8 ~]#printf "%s %s
    " 1 2 3 4
    1 2
    3 4
    [root@centos8 ~]#printf "%s %s %s
    " 1 2 3 4
    1 2 3
    4
    #%-10s 表示宽度10个字符,左对齐
    [root@centos8 ~]#printf "%-10s %-10s %-4s %s 
    " 姓名 性别 年龄 体重 小明 男 20 70
    小红 女 18 50
    姓名 性别 年龄 体重
    小明 男 20 70
    小红 女 18 50
    #将十进制的17转换成16进制数
    [root@centos8 ~]#printf "%X" 17
    11[root@centos8 ~]#
    #将十六进制C转换成十进制
    [root@centos8 ~]#printf "%d
    " 0xC
    12
    [root@centos8 ~]#VAR="welcome to Magedu";printf "33[1;32m%s33[0m
    " $VAR
    welcome
    to
    Magedu
    [root@centos8 ~]#VAR="welcome to Magedu";printf "33[1;32m%s33[0m
    " "$VAR"
    welcome to Magedu
    
  • 相关阅读:
    EasyNVR流媒体服务器网页兼容调试:ie浏览器下的接口调用成功但页面无法显示实时的数据
    EasyNVR流媒体服务器网页兼容调试:ie浏览器下的接口调用成功但页面无法显示实时的数据
    实现RTSP网站微信直播方案EasyNVR(linux版)部署问题之:ERR_CONTENT_LENGTH_MISMATCH
    实现RTSP网站微信直播方案EasyNVR(linux版)部署问题之:ERR_CONTENT_LENGTH_MISMATCH
    RTSP转RTMP-HLS网页无插件视频直播-EasyNVR功能介绍-音频开启
    rtsp转rtmp、hls网页直播服务器EasyNVR前端兼容性调试:ie下的 pointer-events- none
    RTSP转RTMP-HLS网页无插件视频直播-EasyNVR功能介绍-音频开启
    rtsp转rtmp、hls网页直播服务器EasyNVR前端兼容性调试:ie下的 pointer-events- none
    EasyNVR无插件流媒体服务器前端技术防止重复提交的方法
    EasyNVR无插件流媒体服务器前端技术防止重复提交的方法
  • 原文地址:https://www.cnblogs.com/xuanlv-0413/p/14881418.html
Copyright © 2011-2022 走看看