• 必知shell


    PWD/OLDPWD/PATH/SHELL/HISTSIZE


    shell 位置参数
    运行 Shell 脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用$n的形式来接收,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。
    除了 $n,Shell 中还有 $#、$*、$@、$?、$$ 几个特殊参数

    $0 当前脚本的文件名。
    $n(n≥1) 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。
    $# 传递给脚本或函数的参数个数。
    $* 传递给脚本或函数的所有参数。
    $@ 传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同,我们将在《Shell $*和$@的区别》一节中详细讲解。
    $? 上个命令的退出状态,成功为0失败为1-255
    $$ 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。
    $! 上一条运行后台进程的 PID
    变量引用
    = 变量赋值
    +=两变量相加
    文件条件测试语句:
    -b file :检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
    -c file :检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
    -d file :检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
    -f file :检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
    -g file :检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
    -k file :检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
    -p file :检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
    -u file :检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
    -r file :检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
    -w file :检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
    -x file :检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
    -s file :检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
    -e file :检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
    ————————————————

    逻辑测试语句:
    && 逻辑'与',[ -d /etc/passwd ]&& echo 'yes' ,当前面语句执行正确了再执行后面的语句,当前面的语句执行错误后,不执行后面的语句。
    || 逻辑'或',[ -d /etc/passwd ]|| echo 'yes' ,当前面语句执行不正确了再执行后面的语句,当前面的语句执行正确后,不执行后面的语句。
    !逻辑'非', [ $USER != root ] || echo "administrator" ,判断结果取相反值。
    整数比较语句:
    -eq 比较两个数值是否等于。
    -ne 比较两个数值是否不等于。
    -gt 比较两个数值是否左大于右。
    -lt 比较两个数值是否左小于右。
    -ge 比较两个数值是否左大于等于右。
    -le 比较两个数值是否左小于等于右。
    字符串比较语句;
    -z 判断字符串是否为空。
    = 比较字符串内容是否相同。
    != 比较字符串内容是否不同。
    算数运算;
    运算符 说明 举例
    + 加法 `expr $a + $b` 结果为 30。
    - 减法 `expr $a - $b` 结果为 -10。
    * 乘法 `expr $a * $b` 结果为 200。
    / 除法 `expr $b / $a` 结果为 2。
    % 取余 `expr $b % $a` 结果为 0。
    = 赋值 a=$b 将把变量 b 的值赋给 a。
    == 相等用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
    != 不相等用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。
    val++ 后增
    val-- 后减
    ++val 先增
    --val 先减
    ! 逻辑求反
    ~ 位求反
    ** 幂运算
    << 左位移
    >> 右位移
    & 位布尔和
    | 位布尔或
    && 逻辑和
    || 逻辑或
    ——————————————————————
    Shell 算术运算符一览表
    算术运算符 说明/含义
    +、- 加法(或正号)、减法(或负号)
    *、/、% 乘法、除法、取余(取模)
    ** 幂运算
    ++、-- 自增和自减,可以放在变量的前面也可以放在变量的后面
    !、&&、|| 逻辑非(取反)、逻辑与(and)、逻辑或(or)
    <、<=、>、>= 比较符号(小于、小于等于、大于、大于等于)
    ==、!=、= 比较符号(相等、不相等;对于字符串,= 也可以表示相当于)
    <<、>> 向左移位、向右移位
    ~、|、 &、^ 按位取反、按位或、按位与、按位异或
    =、+=、-=、*=、/=、%= 赋值运算符,例如 a+=1 相当于 a=a+1,a-=1 相当于 a=a-1
    ——————————————————————
    linux退出状态码
    查看方式 echo #?
    0 命令成功结束
    1 一般性未知错误
    2 不适合的shell命令
    126 命令不可执行
    127 没找到命令
    128 无效的退出参数
    128+x 与Linux信号x相关的严重错误
    130 通过Ctrl+C终止的命令
    255 正常范围之外的退出状态码
    ——————————————————————
    数组
    bash只支持一维数组,不支持多维数组
    定义数组:array_name=(li wang xiang zhang) (小括号做边界、使用空格分离)
    单独定义数组的元素: array_para[0]=“w”; array_para[3]=“s” (定义时下标不连续也可以)
    赋值数组元素:array_name[0]=“zhao”;
    获取数组元素:
    array_name[0]=“li”
    array_name[3]=“zhang”
    echo ${array_name[0]} # 输出"li"
    echo ${array_name[1]} # 输出" "
    echo ${array_name[3]} # 输出"zhang"
    echo ${array_name[@]} # 输出"li zhang" 输出数组所有元素,没有元素的下标省略
    取得元素个数:${#array_name[@]} 或者 ${#array_name[*]}
    取得单个元素长度:${#array_name[1]}

    ——————————————————————
    test 是 Shell 内置命令,用来检测某个条件是否成立。test 通常和 if 语句一起使用,并且大部分 if 语句都依赖 test。
    test 命令有很多选项,可以进行数值、字符串和文件三个方面的检测。
    Shell test 命令的用法为:
    test expression
    当 test 判断 expression 成立时,退出状态为 0,否则为非 0 值。
    test 命令也可以简写为[],它的用法为:
    [ expression ]
    注意[]和expression之间的空格,这两个空格是必须的,否则会导致语法错误。[]的写法更加简洁,比 test 使用频率高。
    test 和 [] 是等价
    ——————————————————————
    if:语句
    if condition
    then
    command1
    command2
    ...
    commandN
    fi
    if-else:语句
    if condition
    then
    command1
    command2
    ...
    commandN
    else
    command
    fi
    ifelse-ifelse
    if condition1
    then
    command1
    elif condition2
    then
    command2
    else
    commandN
    fi

    ——————————————————————
    while 循环是 Shell 脚本中最简单的一种循环,当条件满足时,while 重复地执行一组语句,当条件不满足时,就退出 while 循环。

    Shell while 循环的用法如下:
    while condition
    do
    statements
    done

    condition表示判断条件,statements表示要执行的语句(可以只有一条,也可以有多条),do和done都是 Shell 中的关键字。
    while 循环的执行流程为:
    先对 condition 进行判断,如果该条件成立,就进入循环,执行 while 循环体中的语句,也就是 do 和 done 之间的语句。这样就完成了一次循环。
    每一次执行到 done 的时候都会重新判断 condition 是否成立,如果成立,就进入下一次循环,继续执行 do 和 done 之间的语句,如果不成立,就结束整个 while 循环,执行 done 后面的其它 Shell 代码。
    如果一开始 condition 就不成立,那么程序就不会进入循环体,do 和 done 之间的语句就没有执行的机会。

    注意,在 while 循环体中必须有相应的语句使得 condition 越来越趋近于“不成立”,只有这样才能最终退出循环,否则 while 就成了死循环,会一直执行下去,永无休止。
    ——————————————————————
    until 循环和 while 循环恰好相反,当判断条件不成立时才进行循环,一旦判断条件成立,就终止循环。
    until 的使用场景很少,一般使用 while 即可;
    Shell until 循环的用法如下:
    until condition
    do
    statements
    done

    condition表示判断条件,statements表示要执行的语句(可以只有一条,也可以有多条),do和done都是 Shell 中的关键字。
    until 循环的执行流程为:
    先对 condition 进行判断,如果该条件不成立,就进入循环,执行 until 循环体中的语句(do 和 done 之间的语句),这样就完成了一次循环。
    每一次执行到 done 的时候都会重新判断 condition 是否成立,如果不成立,就进入下一次循环,继续执行循环体中的语句,如果成立,就结束整个 until 循环,执行 done 后面的其它 Shell 代码。
    如果一开始 condition 就成立,那么程序就不会进入循环体,do 和 done 之间的语句就没有执行的机会。

    注意,在 until 循环体中必须有相应的语句使得 condition 越来越趋近于“成立”,只有这样才能最终退出循环,否则 until 就成了死循环,会一直执行下去,永无休止。
    ——————————————————————
    case
    Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
    case需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break,其中“;;”不是跳出循环,是不在去匹配下面的模式
    case语句格式如下:
    case 变量 in
    模式1)
    commands
    ;;
    模式2)
    commands
    ;;
    esac

    ————————————————————
    跳出循环
    break :跳出总循环
    continue:跳出当前循环,继续下一次循环
    ————————————————————
    长句换行
    在shell中为避免一个语句过长,可以使用“”进行换行
    使用“”换行,在脚本执行过程中还是当做一行一个语句执行,不同于enter直接换行
    ————————————————————
    shell脚本调试
    检查是否有语法错误-n:
    bash -n script_name.sh
    使用下面的命令来执行并调试 Shell 脚本-x:
    bash -x script_name.sh
    带有 + 表示的是 Shell 调试器的输出,不带 + 表示程序的输出。
    ————————————————————
    输出
    echo
    仅用于字符串的输出,没有使用printf作为输出的移植性好,建议使用printf
    printf
    printf 不会像 echo 自动添加换行符,我们可以手动添加
    无大括号,直接以空格分隔

    格式:printf format-string [arguments...] 其中(format-string: 格式控制字符串、arguments: 参数列表)
    案例:printf "%-10s %-8s %-4.2f " 郭靖 男 66.1234
    %s %c %d %f 都是格式替代符
    d:Decimal 十进制整数 对应位置参数必须是十进制整数,否则报错!
    s:String 字符串 对应位置参数必须是字符串或者字符型 否则报错
    c:Char 字符 对应位置参数必须是字符串或者字符型 否则报错
    f:Float 浮点 对应位置参数必须是数字型 否则报错
    %-10s : 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
    %-4.2f :指格式化为小数,宽度为4个字符,其中.2指保留2位小数。
    转义符:
    a :警告字符,通常为ASCII的BEL字符
     :后退
    c :抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
    f :换页(formfeed)
    :换行
    :回车(Carriage return)
    :水平制表符
    v :垂直制表符
    :一个字面上的反斜杠字符
    ddd :表示1到3位数八进制值的字符。仅在格式字符串中有效
    ddd :表示1到3位的八进制值字符
    ————————————————

  • 相关阅读:
    【repost】Javascript操作DOM常用API总结
    【repost】JavaScript运动框架之速度时间版本
    【repost】对JAVASCRIPT匿名函数的理解(透彻版)
    【repost】 原生JS执行环境与作用域深入理解
    【repost】如何学好编程 (精挑细选编程教程,帮助现在在校学生学好编程,让你门找到编程的方向)四个方法总有一个学好编程的方法适合你
    【repost】Chrome 控制台console的用法
    【repost】一探前端开发中的JS调试技巧
    【repost】JS中的异常处理方法分享
    BI_DBA_安装(4):安装DAC及配置客户端
    BI_DBA_安装(3):安装informatic
  • 原文地址:https://www.cnblogs.com/yangxiuhong/p/13256055.html
Copyright © 2020-2023  润新知