bash变量及条件测试

bash中的变量的种类:

         根据变量的生效范围等标准:

            本地变量:生效范围为当前shell进程,对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效。

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

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

                   位置变量:$1,$2,…来表示,用于让脚本在本代码中通过命令行传递他的参数。

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

         本地变量:

                   变量赋值:name=”value”

                            可以使用引用:

                                     value:

                                     (1).可以是直接字串name=”username”

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

                                     (3).命令引用:name=”COMMAND”,name=$(COMMAND)

                   变量引用:${name},$name,尽量使用${name}

                            ‘‘:弱引用,其中的变量引用会被替换为变量值

                            “”:强引用:其中的白能量引用不会被替换为变量值,而保持原字符串。

                            显示已定义的所有变量:

                                     set

                            销毁变量:

                                     unsetname

                   环境变量:

                    变量申明、赋值:

                         export  name  =value

                         declare  -x name=value

                变量引用:$name,${name}

                显示所有环境变量:

                     export

                     env

                     printenv

                销毁:

                     unset name

                bash有许多内置的环境变量:

                   变量命名法则:

                        1. 不能使用程序中的保留字,例如if,for

                        2. 只能使用数字、字母、下划线,且不能以数字开头。

                        3. 见名知意

                            total_weight,尽量不要使用全大写

                   只读变量:

                            readonlyname

                            declare  -r name

                   位置变量:

                            在脚本代码中条用命令行传递给脚本的参数:

                                     $1,$2,…对应调用第1,2等参数

                                     $0:命令本身

                                     $*:传递给脚本的所有参数

                                     $@:传递给脚本的所有参数

                                     $#:传递给脚本的参数的个数

                            示例:判断给出的文件的行数:

                                     #!/bin/bash

                                     linecount=”$(wc  -l |  cut  -d  ‘ ’–f1)”

                                     echo“$1 has $linecount lines”

         bash的配置文件:

                   按生效的范围划分,存在两类:

                          全局配置:

                                     /etc/profile

                                     /etc/bashrc

                          个人配置:

                                     ~/.bash_profile

                                     ~/.bashrc

                            按功能划分:存在两类:

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

                                            功能:

                                                      (1).用于定义环境变量

                                                      (2).运行命令或脚本

                                     bashrc类:为非交互式登录的shell提供配置

                          shell登录:

                                     交互式登录:

                                        直接通过终端输入账号密码登录

                                        使用su – username 或者su  -l username 切换的用户

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

                                          最后的赋值会覆盖之前的赋值

                                非交互式登录:

                                       su username或者图形界面下打开的终端(伪终端)

                                       执行脚本

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

                          编辑配置文件定义的新配置的生效方式:

                                          (1).重新启动shell进程

                                          (2).使用source或.命令进程(尽量不要使用source)

                          问题:1.定义对所有用户都生效的别名

                                        2.让用户的PATH环境变量至多出一个路径,例如多/usr/bin

登入系统读取步骤:

当登入系统时候获得一个shell进程时,其读取环境设定档有三步 :

    1.首先读入的是全局环境变量设定档/etc/profile,然后根据其内容读取额外的设定的文档,如 /etc/profile.d和/etc/inputrc

    2.然后根据不同使用者帐号,去其家目录读取~/.bash_profile,如果这读取不了就读取~/.bash_login,这个也读取不了才会    读取~/.profile,这三个文档设定基本上是一样的,读取有优先关系

3.然后在根据用户帐号读取~/.bashrc

/etc/*和~/.*区别:

/etc/profile,/etc/bashrc 是系统全局环境变量设定

~/.profile,~/.bashrc是用户家目录下的私有环境变量设定

~/.profile与~/.bashrc的区别:

都具有个性化定制功能

~/.profile可以设定本用户专有的路径,环境变量等,它只在登入的时候执行一次

~/.bashrc也是某用户专有设定文档,可以设定路径,命令别名,每次shell script的执行都会使用它一次

实现算数运算:

         +,-,*,/,%,**

        (1)let var =算术表达式

        (2)var=${算术表达式}

        (3)var=$((算术表达式))

        (4)var=$(expr arg1,erg2…)

          乘法符号有些场景中需要转义

          bash有內建的随机数生成器,$RANDOM

增强型赋值:

         +=,-+,*=,%=,/=

let varOPERvalue

         例如:let count+=1

                   let var++

                   let var--

bash的测试类型:

         数值测试:

                   -gt:是否大于

                   -ge:是否大于等于

                  eq:是否等于

                   -ne:是否不等于

                   -lt:是否小于         

                            -le:是否小于等于

                   字符串测试:

                            ==:是否等于

                            >:大于

                            <:小于

                            !=:是否不等于

                            ^=:左侧的字符串是否能够被右侧的pattern所匹配

                            Note:次表达式一般用于[[]]中

                            -z  “string”:测试字符串是否为空,空则为真,不空为假

                            -n“string”:测试字符串是否不空,不空则为真,空则为假

                            Note:用于字符串比较时用到的操作都应该使用引号

         bash自定义退出码:

                   exit[n]:自定义退出状态码

                   注意:脚本中一旦遇到exit命令,脚本会立即停止,种植退出状态取决于eixt命令后面的数字。

         注意:如果未给脚本指定退出状态码,整个脚本的退出码取决于脚本中执行的最后一条命令的状态码。

练习:写一个脚本,接受一个文件的路径作为参数

         如果参数个数小于1,则提示用户至少给个参数,并立即退出

         如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数。

bash条件测试:

         测试方式:

                   test  expression

[expression]

                   [[expression]]

         测试表达式的类别:

                   数值比较

                   字符串测试

                   文件测试

                            -a file

                            -e file:文件存在性测试,存在为真,否则为假

                   存在性类别测试:

                             -b file:存在且为块设备文件

                                使用$?查看上一条命令的结果,成功值为0,不成功为非0

                             -c file:是否存在切为字符设备文件

                             -d file:是否存在且为目录文件

                              -f file:是否存在且为普通文件

                              -h file 或-L file:是否存在且为符号链接文件

                              -p file:首存在且为命名管道文件

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

                            expression–o expression

                            !expression

                            必须使用测试命令进行



猜你喜欢

转载自blog.csdn.net/matengbing/article/details/80239351