zoukankan      html  css  js  c++  java
  • LInuxDay8——shell脚本编程基础

    变量

    变量即命名的内存空间

    在shell中所有变量默认都当成字符型变量,bash不支持浮点型变量

    变量的命名规则:

      不能使程序中的保留字:例如if, for

      只能使用数字、字母及下划线,且不能以数字开头

      见名知义

      统一命名规则:驼峰命名法

    按变量的生效范围可分为:

     局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效

     环境(全局)变量:生效范围为当前shell进程及其子进程

     本地变量:生效范围为当前shell进程中某代码片断,通常指函数

     位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数

     特殊变量:$?, $0, $*, $@, $#,$$

    局部变量:

    变量赋值:VAR=‘value’

      字符串:Name=“root”

      变量引用:Name=“$USER”

      命令引用:Name=·whoami·

    变量引用:${VAR}

      "":弱引用,其中的变量引用会被替换为变量值

      '':强引用,其中的变量引用不会被替换为变量值,而保持原字符串

    set 显示已定义的所有变量

    unset VAR删除已定义的变量

    局部变量只在当前bash生效

    环境变量:

    变量声明:

      export name=VALUE

      declare -x name=VALUE

    显示环境变量的命令:

      env

      printenv

      export

      declare -x

    bash内置的环境变量

      PATH

      SHELL

      USER

      UID

      HOME

      PWD

      SHLVL 是记录多个 Bash 进程实例嵌套深度的累加器

      LANG

      MAIL

      HOSTNAME

      HISTSIZE

      - 上一个命令执行后的最后一个参数

    只读变量(常量)

    声明:

      readonly VAR

      declare -r VAR

    readonly -p 查看只读变量

    位置变量

      $1,$2...:对应脚本参数位置

       shift:踢出前一个位置变量

      $#:脚本参数的个数

      $0:表示脚本的绝对路径,如果是符号链接则表示符号链接的绝对路径

      $*:传递给脚本的所有参数,全部参数合为一个字符串

      $@:传递给脚本的所有参数,每个参数为独立字符串

      $@ $* 只在被双引号包起来的时候才会有差异

      set -- 清空所有位置变量

    退出状态

    $?:脚本或命令的退出状态,0为成功,非0(1-255)为失败

    exit [#]:自定义退出状态码,并退出当前bash进程

    如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

    算术运算

    运算符:

      +

      -

      *

      /

      %:取模

      **:乘方

      ^:异或

      • 复制代码
        [root@centos6 ~]# a=3
        [root@centos6 ~]# b=5
        [root@centos6 ~]# echo $a $b
        3 5
        [root@centos6 ~]# a=$[a^b];b=$[a^b];a=$[a^b] #a和b的值互换
        [root@centos6 ~]# echo $a $b
        5 3
        复制代码

    算术运算表示法:

      let VAR=算术表达式

      VAR=$[算术表达式]

      VAR=$((算术表达式))

      VAR=$(expr 算术表达式,但是运算符中间需要有空格)

      echo '算术表达式' |bc

    $RANDOM:bash内置随机数生成器(0-32767)

    条件测试

    逻辑运算

    0,true

    1,false

    与:

    1 与 1 = 1
    1 与 0 = 0
    0 与 1 = 0
    0 与 0 = 0

    或:

    1 或 1 = 1
    1 或 0 = 1
    0 或 1 = 1
    0 或 0 = 0

    非:

    ! 1 = 0
    ! 0 = 1

    条件测试(test)

      test EXPRESSION

      [ EXPRESSION ]

      [[ EXPRESSION ]]

      EXPRESSION前后必须有空白字符

    条件测试,为真则返回0,为假则返回1

    命令间的逻辑关系

    CMD1  &&  CMD2:逻辑与,如果CMD1返回为真,则CMD2执行;否则CMD2不执行

    CMD1  ||  CMD2:逻辑或,如果CMD1返回为假,则CMD2执行,否则CMD2不执行

      CMD1  ||  { CMD2;CMD3; }:如果CMD1返回为假,则执行CMD2和CMD3

    测试符:

    变量测试:

      -v:变量是否设置

    数值测试

      -eq:等于

      -ne:不等于

      -lt:小于

      -le:小于等于

      -gt:大于

      -ge:大于等于

    字符串测试

      ==:相等

      >:大于,比较ASCII码

      <:小于,比较ASCII码

      !=:不等

      =~:左侧字符串是否能够被右侧的PATTERN所匹配,用[[ STRING =~ PATTERN ]],PATTERN必须为扩展的正则表达式

    hostping.sh

      -z:是否为空

      -n:是否为不空

    文件测试

      -a == -e:是否存在

      -b:是否为块设备

      -c:是否为字符设备

      -d:是否为目录

      -f:是否为普通文件

      -h == -L:是否为符号链接

      -p:是否为管道文件

      -S:是否为套接字文件

      -r:是否可读

      -w:是否可写

      -x:是否可执行

      -u:是否有SUID权限

      -g:是否有SGID权限

      -k:是否有sticky权限

      -s:是否是非空文件

      -t fd:文件描述符是否在打开状态

      -N:文件自从上一次被读取之后是否被修改过

      -O:当前有效用户是否为文件属主

      -G:当前有效用户是否为文件属组

    文件属性双目测试

      FILE1 -ef FILE2:FILE1是否是FILE2的硬链接

      FILE1 -nt FILE2:FILE1是否新于FILE2(mtime)

      FILE1 -ot FILE2:FILE1是否旧于FILE2

    组合条件测试

    组合测试条件

      -a:与关系(并且)

      -o:或关系(或者)

      ! :非关系

    摩根定律:

      !(A -o B) = !A -a !B

      !(A -a B) = !A -o !B

    read命令

    使用read来把输入值分配给一个或多个shell变量,

    read 从标准输入中读取值,给每个单词分配一个变量

    所有剩余单词都被分配给最后一个变量

    选项:

      -p:输入提示信息

      -s:静默输入,用于输入密码时

      -n #:限定输入字符串的长度

      -d 'EOF':当匹配到结束符时自动结束

      -t #:超时时间

    复制代码
    #!/bin/bash
    #
    
    read -t 5 -p "please input head number: " HEADNU
    read -t 5 -p "please input feet number: " FEETNU
    
    echo -e "chook number is $((($FEETNU-2*$HEADNU/2)))\n$(($HEADNU-$((($FEETNU-2*$HEADNU/2)))))"
    复制代码
  • 相关阅读:
    kill新号专题
    LSB 简介
    linux之eval用法(高级bash程序员的必修之技)
    squid日志配置与轮询
    004_ssh连接慢的问题的解决?
    python操作redis-set
    python操作 redis-list
    python操作redis-hash
    python操作redis--string
    python连接redis002
  • 原文地址:https://www.cnblogs.com/Gmiaomiao/p/8782755.html
Copyright © 2011-2022 走看看