Shell是什么?

什么是shell?

    定义:shell是一个命令解释器

    shell位于操作系统和应用程序之间,是他们二者的接口,负责:把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序。

    一句话:shell就是在操作系统和应用程序之间的一个命令翻译工具。

shell的分类

    1.图形界面shell,桌面就是一个图形界面shell

    2.命令行shell,如:linux系统下的bash

查看系统shell信息

    echo $SHELL:查看当前系统shell版本

    cat /etc/shells:查看系统兼容支持的其他版本

shell脚本

    定义:可执行的Linux命令或语句不在命令行状态下执行,而是通过一个文件执行时,我们将这个文件为shell脚本(可执行命令的组合)。

    示例:

    创建脚本文件,并写入内容:vim 001.sh (sh结尾,给程序员看的)

1 #!/bin/bash
 
2 
 
3 echo 'shell hello'

执行:bash 001.sh

    注释:

        单行注释:#空格...

        多行注释:<<临时字符 注释内容 临时字符(临时字符尽量不要使用汉字)

shell的优劣势

    优势:存在时间长,拥有较多累积(诞生早),编写简单,对环境依赖小

    劣势:无法实现复杂功能,不支持现代编程语言的高级特性:面向对象等

执行shell脚本

    1、bash 脚本文件名(先启动子进程名字叫bash,在子进程中执行脚本内容,解释器:bash)

    2、.空格/脚本文件名 (先启动子进程名字叫脚本名,在子进程中执行脚本内容,解释器:#!指定的解释器,即系统缺省shell)

    3、source 脚本名(直接在当前shell执行脚本内容,解释器:当前shell)

    注意:创建了子进程,不能使用当前终端定义的变量,使用source不会开子进程,能使用当前终端定义的变量

变量

    普通变量    

        定义方式:变量名="变量值",习惯:数字不加引号,其它加双引号(可以变量套变量,如:b=777

a="123$b") 执行结果:a=123777

    命令变量(命令的输出作为变量值赋给变量名)

        变量名=`命令`(注意:`是反引号)

        变量名=$(命令)

        注意:命令变量的值在定义时确定

    变量访问

        1 $变量名 

        2 "$变量名" (保证变量值是字符串)

        3 ${变量名} (限定变量名范围)

        4 "${变量名}" (推荐使用)

        删除变量:unset 变量名,修改字符编码:unset LANG

变量分类

    1.本地变量:哪里定义哪里访问

    2.全局变量:在当前系统的所有环境下都能生效的变量(每个终端就是一个shell环境,开启子进程的shell为子shell环境)

        查看全局变量:env

        定义全局变量:export 变量名=值(最常用)

        自定义全局变量生效范围:只对当前shell环境及子shell环境有效,shell退出后全局变量消失

        定义系统级全局变量:修改~/.bashrc后,直接打开新的终端

    3.内置变量

        

符号意义
$0 获取当前执行的shell脚本文件名
$$ 获取执行shell脚本的进程号
$n 获取当前执行的shell脚本命令之后的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来${10},如:ls -l 当前命令的参数为-l
$# 获取当前shell命令行中参数的总个数
$? 获取执行上一个指令的返回值(0为成功,非0为失败)

字符串截取

        格式:${变量名:起始位置:截取长度}

        ${变量名:0:5} 从第1个字符开始,截取5个字符

        ${变量名:0-6:3} 从倒数第6个字符开始,截取之后的3个字符

    默认值

        ${变量名:-默认值}:若变量存在则输出变量值。否则输出默认值

        ${变量名:+提示信息}:若变量存在则输出提示信息,否则,啥都不输出

表达式

    1 测试语句:条件成立,状态返回值是0,条件不成立,状态返回值是1

        test 条件

        [ 条件 ] (方括号内左右各有一个空格)

            1 数值比较:

                n1 -eq n2 相等、-gt大于、-ge大于等于、-lt小于、-le小于等于、-ne不等于

            2 字符串比较

                == != 、比较操作符左右各有一个空格

    2 逻辑表达式

        命令1 && 命令2 (1成功则执行2)

        命令1 || 命令2 (1失败则执行2,1执行成功,那么不执行命令2)

    3 文件表达式

        -f  判断是否是文件

                输入:[ -f weizhi.sh ] && echo "是一个文件"

                输出:是一个文件

        -d 判断是否是目录

        -x 判断是否可执行 (一般,目录也是可执行的)

    4 计算表达式(支持整数运算)

        $((计算过程))

        let 等式

        注意:$(())中只能用+-*/和()运算符,表达式必须是一个整体,中间不能出现空格等特殊字符

常见符号

    >:将左侧的内容以覆盖的方式输入到右侧

    >>:追加

    1 分别重定向:bash 5-chongdingxiang.sh > res.log 2>err.log

    2 合并重定向:bash 5-chongdingxiang.sh > res.log 2>&1

    3 丢弃:bash 5-chongdingxiang.sh > /dev/null 2>&1

        注意:标准输出(standard output):程序正确运行时的输出,标准错误(standard err):程序异常时的输出

    管道符|

        使用格式: 命令1 | 命令2 

        管道符左侧命令1执行后的结果作为输入传递给右侧的命令2使用

原文地址:https://www.cnblogs.com/GLory-LTF/p/14312087.html