shell 基础

Posted cook

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 基础相关的知识,希望对你有一定的参考价值。

脚本格式

shell脚本:文本文件
        #!/bin/bash
        #!/usr/bin/python
        shebang:
        magic number:魔数
        运行脚本:
            1.给予执行权限,通过具体的文件路径指定文件执行 ./test.sh
            2.直接运行解释器,将脚本作为解释器程序的参数运行 sh test.sh

shell 变量

变量类型:
        数据存储格式,存储空间大小,参与运算种类
        字符型:
        数值型:
            整型
            浮点型
        强类型:定义变量时必须指定类型,参与运算必须符合类型要求,调用未声明变量会产生错误
        弱类型:无须指定类型,默认均为字符型,参与运算会自动进行隐式类型转换,变量无须事先定义可以直接调用
    定义环境变量:declare -x
    bash中的变量的种类:
        根据变量的生效范围等标准:
            本地变量:生效范围为当前shell进程,对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效
            环境变量:生效范围为当前shell进程,及其子进程.
            局部变量:生效范围为当前shell进程中某代码片段(通常指函数)
            位置变量:$1,$2....用于让脚本在脚本代码中调用通过命令行传递给它的参数
            特殊变量:$?,$0,$*,[email protected],$#
        本地变量:
            变量赋值:name=value
                可以使用引用:
                    value:
                        可以是直接字符串:name="username"
                        变量引用:name="$username"
                        命令引用:name=`COMMAND`,name=$(COMMAND)
            变量引用:${name},$name
                "":弱引用,其中的变量引用会被替换为变量值
                ‘‘:强引用,其中的变量引用不会被替换为变量值,而保持原字符串
            显示已定义的所有变量:
                set
            销毁变量:
                unset name
        环境变量:
            变量声明,赋值
                export name=VALUE
                declare -x name=VALUE
            变量引用:$name,${name}
            显示所有环境变量:
                export
                env
                printenv
            销毁:
                unset name
            bash有许多内建的环境变量:PATH,SHELL,UID,HISTSIZE,HOME,PWD,OLD,HISTFILE,PS1
        变量命名法则:
            1.不能使程序中的保留字,如if,for
            2.只能使用数字,字母及下划线,且不能以数字开头
            3.见名知义
        只读变量:
            readonly name
            declare -r name
        位置变量:
            在脚本代码中调用通过命令行传递给脚本的参数
                $1,$2...:对应调用第1,第2...等参数
                    shift [n]:换岗操作,会剔除shift n
                $0:命令本身
                $*:传递给脚本的所有参数,把所有参数当做1个字符串
                [email protected]:传递给脚本的所有参数,把每个参数当做1个字符串
                $#:传递给脚本的参数个数             

 环境配置文件

按生效范围划分,两类:
            全局配置:
                /etc/profile
                    /etc/profile.d/*.sh
                /ect/bashrc
            个人配置
                ~/.bash_profile
                ~/.bashrc
        按功能划分,两类:
            profile类:为交互式登录的shell提供配置
                全局:/etc/profile   /etc/profile.d/*.sh
                个人:~/.bash_profile
                功用:
                    定义环境变量
                    运行命令或脚本
            bashrc类:为非交互式登录的shell提供配置
                全局:/ect/bashrc  
                个人:~/.bashrc
                功用:
                    定义命令别名
                    定义本地变量
        shell登录:
            交互式:
                直接通过终端输入账号密码登录
                使用su - username 或su -l username切换的用户
                /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
            非交互式:
                su username
                图形界面下打开的终端
                执行脚本
                ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
        编辑配置文件定义的新配置的生效方式:
            1.重新启动shell进程
            2.使用source或.命令
        问题:
            1.定义对所有用户都生效的别名
            2.让用户的PATH环境变量的值多出一个路径,例如/usr/bin/local/apache2/bin
                管理员:~/.bash_profile
                用户:

算数运算

 +,-,*,/,%,
        实现算数运算:
            1. let var=算数表达式
            2. var=$[算数表达式]
            3. var=$((算数表达式))
            4. var = $(expr arg1 arg2 arg3 ...)
            乘法符合有些场景中需要转义
            bash有内建随机数生成器:$RANDOM
        增强型赋值:
            +=,-=,*=...
            let varOPERvalue
                例如:let count+=1
        自增,自减:
            let var+=1
                let var++
            let var -=1
                let var--

条件测试

条件测试:判断某需求是否满足,需要有测试机制来实现, 注意:专用的测试表达式需要由测试命令辅助完成测试过程
        测试命令:
            test EXPRESSION
            [ EXPRESSION ]
            [[ EXPRESSION ]]
            注意:EXPRESSION前后必须有空格存在,否则语法错误
        测试类型:
            数值测试:
                -gt:是否大于
                -ge:大于等于
                -eq:等于
                -ne:不等于
                -lt:小于
                -le:小于等于
            字符串测试:
                ==:等于
                >:大于
                <:小于
                !=:不等于
                =~:左侧字符串是否能被右侧PATTERN所匹配
                    注意:此种表达式一般用于[[]]
                -z "STRING":测试字符串是否为空,空则为真,不空为假
                -n "string":是否不为空
                注意:用于字符串比较时用到的操作数都应该使用引号
            文件测试:
              存在性测试
                  -a FILE
                  -e FILE:文件存在性测试,存在为真,不存在为假
              存在性及类别
                  -b FILE:是否存在且为块设备文件
                  -c FILE:是否存在且为字符设备文件
                  -d FILE:是否存在且为目录文件
                  -f FILE:是否存在且为普通文件
                  -h FILE 或 -l FILE:存在且为符号链接文件
                  -p FILE:是否存在且为命名管道文件
                  -S FILE:是否存在且为套接字文件
              文件权限测试:
                  -r FILE:是否存在且拥有读权限
                  -w FILE:是否存在且拥有可写权限
                  -x FILE:是否存在且可执行
              文件特殊权限测试:
                  -g FILE:是否存在且拥有sgid权限
                  -u FILE:是否存在且拥有suid权限
                  -k FILE:是否存在且拥有sticky权限
              文件大小测试:
                  -s FILE:是否存在且非空
              文件是否打开:
                  -t fd:fd表示文件描述符,是否以及打开且与某终端相关
                  -N FILE:文件自从上一次被读取后是否被修改过
                  -O FILE:当前有效用户是否为文件属主
                  -G FILE:当前有效用户是否为文件数组
              双目测试:
                  FILE1 -ef FILE2:FILE1和FILE2是否执行同一个设备上的相同iNode
                  FILE1 -nt FILE2:FILE1是否新于FILE2
                  FILE1 -ot FILE2:FILE1是否旧于FILE2

 组合测试条件

逻辑运算:
            第一种方式:
                COMMAND1 && COMMAND2
                COMMAND1 || COMMAND2
                ! COMMAND
                [ -e FILE ] && [ -r FILE ]
            第二种方式:
                [ EXPRESSION1 -a EXPRESSION2 ]
                [ EXPRESSION1 -o EXPRESSION2 ]
                [ ! EXPRESSION ]
                必须使用测试命令进行:
                    [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

自定义退出状态码

exit [n]:自定义退出状态码
       注意:脚本中遇到exit命令,脚本会立即终止,终止退出状态取决于exit命令后面的数字
       注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

 

 


                   


以上是关于shell 基础的主要内容,如果未能解决你的问题,请参考以下文章

Linux bash基础特性二

逆向及Bof基础实践

20155307刘浩《网络对抗》逆向及Bof基础

代码片段:Shell脚本实现重复执行和多进程

20155311高梓云《网络对抗》逆向及Bof基础

20145301赵嘉鑫《网络对抗》逆向及Bof基础