• shell(一)


    shell解析器

    执行命令

    [root@192 /]# sudo cat /etc/shells 
    /bin/sh
    /bin/bash
    /usr/bin/sh
    /usr/bin/bash

    可以看到shell有4种解析器,默认解析器 /bin/bash

    shell入门

    脚本格式

    脚本以 #!/bin/bash 开头,指定解析器

    #!/bin/bash
    echo "hello world"

    执行 shell 脚本

    • bash xxx.sh 或者 sh xxx.sh ,调用bash 解析器执行,脚本本身不需要执行权限

    • ./xxx.sh 脚本自己执行,注意有没有执行权限

    shell中的变量

    系统变量

    常用系统变量

    $HOME, $PWD, $SHELL, $USER,获取所有系统变量 set

    自定义变量

    1. 基本语法

    • 定义变量: 变量=值,不能有空格

    • 删除变量: unset 变量,不能删除只读变量

    • 只读变量: readonly 变量,只能读取,不能修改、删除

    2. 定义变量规则

    • 变量名称可以由字母、数字、下划线组成,但是不能以数字开头,环境变量建议大写

    • 等号两侧不能有空格

    • 在 bash 中,变量默认类型都是 字符串类型,无法直接进行数值运算

    • 变量的值如果有空格,需要使用 双引号单引号 括起来

    • 将 局部变量 升为 全局环境变量,可供其他shell程序使用:export 变量名

    3.使用变量

    $param 或 ${param}, 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

    特殊变量

    $n :n为数字,$0代表该脚本名称,$1- $9 代表第一至第九个参数,十以上的参数需要用大括号包含,如 ${10}

    $# :获取所有输入参数的个数,常用于循环

    $* :表示命令行中的所有参数, $* 把所有参数看成一个整体

    $@ :表示命令行中的所有参数,不过 $@ 把每个参数区分对待

    $? :最后一次执行命令的返回状态,正确执行为0,执行错误则为非0(具体是哪个数,由命令自己决定), 函数返回值在调用该函数后通过 $? 来获得

    $* 与 $@ 区别:

    • 相同点:都是引用所有参数

    • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数 )

    字符串

    • 获取字符串长度, ${#string}

    • 获取子字符串, ${string:n1:n2}

    数组

    定义

    array=(v1 v2 v3 ...),注意每个值中间用空格隔开

    根据索引 修改/赋值

    array[i]=v_i

    使用数组变量

    • ${array[i]},获取某个索引值

    • ${array[@]},${array[*]} ,获取数组中的所有值

    • ${#array[@]},${#array[*]} ,获取数组长度,与字符串相同

    运算符

    基本语法

    有两种写法:

    • "$((运算式))""$[运算式]",运算式就是原始的易读运算式

    • expr + , - , * , / , % ,加,减,乘(注意有个反斜杠 ) ,除,取余;expr 运算符之间要有空格

    计算 (3+2)*4 : 先计算3+2,再做*4,用Esc下面的键 ` 隔开

    expr `expr 3 + 2` * 4
    echo $[(3+2)*4]

    条件判断

    1. 基本语法

    [ condition ] 注意 condition 前后要有空格

    条件非空即为true,[] 则为false

    多条件判断:与 && , 或 ||

    2. 常用判断条件

    (1)字符串比较

    • =,相等;[ $a = $b ],等号两边有空格

    • !=,不等;[ $a != $b ],等号两边有空格

    • -z ,字符串长度是否为0,为0返回true, [ -z $a ]

    • -n,字符串长度是否不为0,不为0返回true,[ -n $a ]

    • $, 字符串是否为空,不为空返回 true ,[ $a ]

    (2)两个整数之间比较

    • -eq 等于 (equal)

    • -ne 不等于 (not equal)

    • -lt 小于 (less than)

    • -le 小于等于 (less equal)

    • -gt 大于 (greater than)

    • -ge 大于等于 (greater equal)

    (3)按照问价权限进行判断

    • -r 读权限, [ -r $file ]

    • -w 写权限, [ -w $file ]

    • -x 执行权限, [ -x $file ]

    (4)按照文件类型进行判断

    • -f 文件存在且为常规文件,[ -f $file ]

    • -d 文件存在且为目录,[ -d $file ]

    • -e 文件存在 (existence), [ -e $file ]

  • 相关阅读:
    子串周期查询问题的相关算法及其应用(原文为2019年国家集训队论文集)
    微软最有价值专家 Azure DevOps MVP(第六年)
    当一个程序员一天被打扰 10 次, 后果很惊人
    什么是CAP定理?
    Java中的锁原理、锁优化、CAS、AQS详解
    如何停止一个正在运行的线程?
    lammps总结(7.27-7.30)
    packmol建模
    Linux 命令 (1)
    ElementUI中的el-select中多选回显数据后没法重新选择和更改
  • 原文地址:https://www.cnblogs.com/yjh1995/p/13160538.html
Copyright © 2020-2023  润新知