Shell 基础知识

1.简介

在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它接收用户命令,然后调用相应的应用程序。(百度百科)


kernel主要的四种功能

内存管理

软件程序管理

硬件管理

文件系统

Shell 基础知识_第1张图片


知识点小节:

#!/bin/bash       脚本文件的第一行是个特例

# 注释行,不执行


执行:sh

        显示脚本debug:    sh -x    vim/set -x 重复debug模式

        不执行只检测语法: sh -n

      bash

      ./


~~~~~~~~~~~~~~~

注释信息

#!/bin/bash

# Description:

# Date: 2016-9-26 16:50:10

# Email: [email protected]

# Author: Mag

# Version: 0.01

~~~~~~~~~~~~~~~


脚本加密工具shc

shc -r -f filename


2.Shell环境变量

变量类型:

字符型

数值型:


bash中的变量的种类:【根据变量的生效范围等标准】

本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效;【也包括当前shell的父shell】

环境变量:生效范围为当前shell进程及其子进程;

局部变量:生效范围为当前shell进程中某代码片断(通常指函数);

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

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

###

本地变量:

变量赋值:name='value'

(1) 可以是直接字串; name="username"

(2) 变量引用:name="$username"

(3) 命令引用: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


只读变量:

readonly name

declare -r name


位置变量:

在脚本代码中调用通过命令行传递给脚本的参数;

$1, $2, ...:对应调用第1、第2等参数;

shift [n]


特殊变量:

                $0:   脚本名称自身

                $?:   上一条命令的执行状态

                      状态用数字来表示:0-255;

                        0:     成功

                        1-255: 失败

                $!:   执行上一个后台命令的PID

                $#:   这个程序的参数个数(传给脚本的参数个数)

                $*:   这个程序的所有参数(传递给脚本的所有参数,视为一个整体,是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个)

                $$:   这个程序的PID(脚本运行的当前进程ID号)

                $@:   传给脚本的所有参数的列表,每一个参数当作独立的一个字符串


变量的命名要求:

1、不能使程序中的保留字[关键字]:例如if, for

          2、只能使用数字、字母和下划线组成,且不能以数字开头

          3、见名知义




3.bash的配置文件


     profile类:为交互式登录的用户提供配置

                /etc/profile:              全局

                /etc/profile.d/*.sh:       全局

                ~/.bash_profile:           个人配置,仅对当前用户有效


           功能:

                设定环境变量

                运行命令或脚本


     bashrc类:非交互式登录用户提供配置

              /etc/bashrc:  全局

              ~/.bashrc:    个人配置

            

           功能:

                设定本地变量

                定义命令别名


    通知shell重读配置文件的命令:

         source(.)

         . FILE

    重新登录


交互式登录用户:

          /etc/profile --> /etc/profile.d/*.sh  -->~/.bash_profile -->~/.bashrc --> /etc/bashrc

非交互式登录用户:

          ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh



4.语法

bash中条件判断使用if

      单分支:

             if    条件; then

                     分支1;

             fi

###示例

            if [ -f /tmp/aaa ]

                then 

                    echo "yes"

            else

                    echo "no"

            fi


      双分支:

             if    条件;then

                     分支1;

             else 

                     分支2;

             fi


       多分支:

             if    条件1; then

                     分支1;

             elif  条件2;then

                     分支2

             elif  条件3;then

                     分支3

             ...

             else

                    分支n;

             fi

###示例

            if [ $NUM1 -gt $NUM2 ]

                then 

                    echo "$NUM1 > $NUM2"

            elif [ $NUM1 -lt $NUM2 ]

                then   

                    echo "$NUM1 < $NUM2"

               

            else 

                    echo "$NUM1 = $NUM2"

              

            fi


运算语法:

            #let var=$s+$i

            #var=$(expr $s + $i)

            #var=`expr $s + $i`

            #var=$[$s+$i]

            #var=$(($s+$i))



条件测试方法:

         bash: 每个命令,执行状态返回值:

                                                             成功: 0

                                                             失败: 非0


          [[ 测试表达式 ]]       脚本关键字   bash关键字

          [ 测试表达式 ]         内生命令     bash命令

          test 测试表达式

###示例

            test 1 -gt 2; echo $?  #是否大于2

            test 1 -lt 2; echo $?  #是否小于2

            test 1 -ge 2; echo $?  #是否大于等于2

            test 1 -le 2; echo $?  #是否小于等于2

            test 1 -eq 2; echo $?  #是否等2

            test 1 -ne 2; echo $?  #是否不等于2


组合条件测试: 对条件做逻辑运算

          与: 条件1 && 条件2

               条件1为假,则最终结果一定为假,因此,条件2将不执行

               条件1为真,则最终结果决于后面的条件,因此,条件2必须执行 

          或: 条件1   ||   条件2   

               条件1为真,则最终结果一定为真,因此,条件2将不再执行

               条件1为假,则最终结果决于后面的条件,因此,条件2必须执行 

          非: !条件


整数测试:

         -eq , -ne , -le  , -ge, -gt , -lt


字符测试:

         双目:

                 >:    大于

                 <:    小于

                ==:    等于,等值比较, 一个”=“ 是做赋值的 【= 其实一个等于号也可以,只要放在测试命令中】

                =~:    左则是字符串,右则是一个模式,判定左侧的字符串能否被右侧的模式所匹配,通常只在[[ ]]使用,模式中可以使用行首、行尾锚定符:但模式不要加引号

             !=,<>:    不等于


文件测试:

存在性测试

-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;


shell脚本学习方法

Shell 基础知识_第2张图片