码迷,mamicode.com
首页 > 其他好文 > 详细

bash基本特性4

时间:2016-07-18 06:01:34      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:bash基本特性

                                                 bash的基础特性
变量类型:
        数据存储格式、存储空间大小、参与运算种类;

        字符型
        数值型:
            整型
            浮点型

        强类型:定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误;
        弱类型:无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用;
            bash

        bash中的变量的种类:
            根据变量的生效范围等标准:
                本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效;
                环境变量:生效范围为当前shell进程及其子进程;
                局部变量:生效范围为当前shell进程中某代码片断(通常指函数);
                位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数;
                特殊变量:$?,命令执行状态  成功或者失败
                $0,
                $*,
                $@,
                $#
                

[root@MyServer ~]# a=3
[root@MyServer ~]# b=5
[root@MyServer ~]# echo $a+$b
3+5
[root@MyServer shell]# vim aaaa.sh
[root@MyServer shell]# chmod u+x aaaa.sh 
[root@MyServer shell]# sh aaaa.sh  xiaoming   2222222
xiaoming
2222222
[root@MyServer shell]# cat aaaa.sh 
#!/bin/bash
echo $1
echo $2
[root@MyServer shell]#

            本地变量:
                变量赋值:name=‘value‘
                    可以使用引用:
                        value:
                            (1) 可以是直接字串; name="username"
                            (2) 变量引用:name="$username"
                            (3) 命令引用:name=`COMMAND`, name=$(COMMAND)
                变量引用:${name}, $name

[root@MyServer shell]# animal=pig
[root@MyServer shell]# echo "There are some $animals ..."
There are some  ...
[root@MyServer shell]# echo "There are some ${animal}s ..."
There are some pigs ...
[root@MyServer shell]#

                    "":弱引用,其中的变量引用会被替换为变量值;
                    ‘‘:强引用,其中的变量引用不会被替换为变量值,而保持原字符串;
                显示已定义的所有变量
                    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]

                    $0: 命令本身;

                    $*: 传递给脚本的所有参数;
                    $@: 传递给脚本的所有参数;
                    $#: 传递给脚本的参数的个数;

[root@MyServer shell]# cat s.sh 
#!/bin/bash
#执行命令的shell
echo $0
#第一个参数
echo $1
#第二个参数
echo $2
echo "$*      :    $*"
echo "\$@      :    $@"
echo "\$#      :    $#"
[root@MyServer shell]# sh s.sh  a b 
s.sh
a
b
a b      :    a b
$@      :    a b
$#      :    2


示例:判断给出的文件的行数
                    #!/bin/bash
                    linecount="$(wc -l $1| cut -d‘ ‘ -f1)"
                    echo "$1 has $linecount lines."            

    bash的配置文件:

        按生效范围划分,存在两类:
            全局配置:
                /etc/profile
                    /etc/profile.d/*.sh
                /etc/bashrc
            个人配置:
                ~/.bash_profile
                ~/.bashrc

        按功能划分,存在两类:
            profile类:为交互式登录的shell提供配置
                全局:/etc/profile, /etc/profile.d/*.sh
                个人:~/.bash_profile
                功用:
                    (1) 用于定义环境变量;
                    (2) 运行命令或脚本;

            bashrc类:为非交互式登录的shell提供配置
                全局:/etc/bashrc
                个人:~/.bashrc

                功用:
                    (1) 定义命令别名;
                    (2) 定义本地变量;

        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
                

[root@MyServer ~]# cat /etc/profile.d/welcome.sh
#!/bin/bash
echo " welcome $UID, your home is $HOME. note....."
[root@MyServer ~]# su - user1
 welcome 500, your home is /home/user1. note.....
[root@MyServer ~]# export PATH="$PATH:/usr/local/aaaa"
[root@MyServer ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/aaaa
[root@MyServer ~]# declare -x PATH="/usr/local/bbb:$PATH"
[root@MyServer ~]# echo $PATH
/usr/local/bbb:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/aaaa
[root@MyServer ~]#

 
        编辑配置文件定义的新配置的生效方式:
            (1) 重新启动shell进程;
            (2) 使用source或.命令进程;

        问题:
            1、定义对所有用户都生效的别名?
            2、让用户的PATH环境变量的值多出一个路径,例如多如/usr/local/apache2/bin
                管理员?
                所有?

    bash中的算术运算
        +, -, *, /, %, **

        实现算术运算:
            (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--
                

[root@MyServer ~]# num1=10
[root@MyServer ~]# num2=10
[root@MyServer ~]# let num3=$num1+$num2
[root@MyServer ~]# echo $num3
20
[root@MyServer ~]# echo $[$num1+$num2]
20
[root@MyServer ~]# echo $(($num1+$num2))
20
[root@MyServer ~]# num12=$(expr $num1 \* $num2)
[root@MyServer ~]# echo $num12
100
[root@MyServer ~]# echo $[$num1*$num2]
100

        练习1:写一个脚本
            计算/etc/passwd文件中的第10个用户和第20用户的ID之和;

                #!/bin/bash
                userid1=$(head -n 10 /etc/passwd | tail -n 1 | cut -d: -f3)
                userid2=$(head -n 20 /etc/passwd | tail -n 1 | cut -d: -f3)
                useridsum=$[$userid1+$userid2]
                echo "uid sum: $useridsum"

        练习2:写一个脚本
            传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和;

                #!/bin/bash
                spaceline1=$(grep "^[[:space:]]*$" $1 |    wc -l)
                spaceline2=$(grep "^[[:space:]]*$" $2 |    wc -l)
                echo "The sum of space line: $[$spaceline1+$spaceline2]"

        练习3:统计/etc, /var, /usr目录共有多少个一级子目录和文件;


    条件测试:
        判断某需求是否满足,需要由测试机制来实现;

        Note: 专用的测试表达式需要由测试命令辅助完成测试过程;

        测试命令:
            test EXPRESSION
            [ EXPRESSION ]
            [[ EXPRESSION ]]

            Note: EXPRESSION前后必须有空白字符;

        bash的测试类型:
            数值测试:
                -gt: 是否大于;
                -ge: 是否大于等于;
                -eq: 是否等于;
                -ne: 是否不等于;
                -lt: 是否小于;
                -le: 是否小于等于;
            字符串测试:
                ==:是否等于;
                >: 是否大于;
                <: 是否小于;
                !=: 是否不等于;
                =~: 左侧字符串是否能够被右侧的PATTERN所匹配;
                    Note: 此表达式一般用于[[  ]]中;
                -z "STRING":测试字符串是否为空,空则为真,不空则为假;
                -n "STRING":测试字符串是否不空,不空则为真,空则为假;

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

            文件测试

[root@MyServer ~]# test 1 -gt 3
[root@MyServer ~]# echo $?
1
[root@MyServer ~]# test 1 -gt 0
[root@MyServer ~]# echo $?
0

    bash自定义退出状态码
        exit [n]:自定义退出状态码;
            注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字;

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

        练习:写一个脚本
            接受一个文件路径作为参数;
                如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;
                [ $# -lt 1 ] && echo "At least one argument." && exit 1
                如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数;

本文出自 “梁小明的博客” 博客,请务必保留此出处http://7038006.blog.51cto.com/7028006/1827211

bash基本特性4

标签:bash基本特性

原文地址:http://7038006.blog.51cto.com/7028006/1827211

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!