复习二

复习二

bash的配置文件:

按生效范围划分:
    全部配置:
        /etc/profile
        /etc/profile.d/*.sh
        /etc/bashrc
    个人配置:
        ~/.bash_profile
        ~/.bashrc
按功能划分:
    环境变量,运行命令和脚本:
        全局:/etc/profile
            /etc/profile.d/*.sh
        个人:~/.bashrc_profile
    定义本地变量,命令别名:
        全局:/etc/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或.命令进程

bash中的算术运算:

+ - * / %(取余数)
实现算术运算:
    1,let var=算数运算表达式
    [root@localhost ~]# name1=3
    [root@localhost ~]# name2=4
    [root@localhost ~]# let name3=$name1+$name2
    [root@localhost ~]# echo $name3
    7

    2,(2)var=$[算术表达式]
    [root@localhost ~]# name4=$[$name1+$name2]
    [root@localhost ~]# echo $name4
    7

    3,(3)var=$(())
    [root@localhost ~]# name5=$(($name1+$name2))
    [root@localhost ~]# echo $name5
    7

    4,var=$(expr args1 arg2 arg3...)
    [root@localhost ~]# name6=$(expr $name1 + $name2)
    [root@localhost ~]# echo $name6
    7

    bash有内建的随机数生成器;$RANDOM
        [root@localhost ~]# echo $[RANDOM%60]
                    17
        [root@localhost ~]# echo $[RANDOM%60+1]取1到60之间

    增强型赋值:
    [root@localhost ~]# name=10
    [root@localhost ~]# 
    [root@localhost ~]# let name+=1
    [root@localhost ~]# echo $name
    11
    [root@localhost ~]# echo $name
    11
    [root@localhost ~]# let name+=1
    [root@localhost ~]# echo $name
    12

    如果后面数字不是1。
    [root@localhost ~]# let name+=2
    [root@localhost ~]# echo $name
    17

练习:

练习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"

[root@localhost ~]# cat suansu.sh 
#!/bin/bash
#
user1=`head -n 10 /etc/passwd | tail -n 1 | cut -d':' -f3`
user2=`head -n 20 /etc/passwd | tail -n 1 | cut -d':' -f3`
#
userzongsu=$[$user1 + $user2]
#
echo "zong shu :$userzongsu"


[root@localhost ~]# chmod +x suansu.sh 
[root@localhost ~]# ./suansu.sh 
zong shu :509


练习2:写一个脚本
传递2个文件路径参数给脚本,计算这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目录共有多少个一级子目录和文件;


变量取值的时候:
    var=$()和var=``没有区别

条件测试:

判断某需求是否满足,需要由测试机制来实现;
专用的测试表达式需要由测试命令辅助完成测试过程;

测试命令:
    test EXPRESSION
    [ EXPRESSION ] :命令
    [[ EXPRESSION ]]:关键字

    note:前后必须要有空格

bash的测试类型:
    数值测试
    -gt:是否大于
    -ge:是否大于等于
    -eq:是否等于
    -ne:是否不等于
    -lt:是否小于
    -le:是否小于等于

[root@localhost ~]# name1=3
[root@localhost ~]# name2=4
[root@localhost ~]# name3=3
[root@localhost ~]# test $name1 -gt $name2
[root@localhost ~]# echo $?
1
[root@localhost ~]# test $name1 -lt $name2
[root@localhost ~]# echo $?
0


字符串测试
    ==/=:字符串等值测试
    >:是否大于:
    <:是否小于:
    !=:是否不等于:
    =~:左侧字符串是否能够被右侧的PATTERN所匹配到:
    Note:次表达式一般用于[[  ]]中
    -z “STRING”:测试字符串是否为空,空则为真,不空则为假
    -n “STRING”:测试字符串是否为空,空则为假,不空则为真

[root@localhost ~]# [[ "$name1" = "$name2" ]]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [[ "$name1" =~ ^o.* ]]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [[ "$name1" =~ ^a.* ]]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ -z "$name1" ]]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [[ -n "$name1" ]]
[root@localhost ~]# echo $?
0


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


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

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

特殊变量:

$#    表示变量的个数,常用于循环
$@    当前命令行所有参数。置于双引号中,表示个别参数
$*    当前命令行所有参数。置于双引号中,表示将命令行所有参数当初一个单独参数
$-(连字号)    在引用数给予Shell的选项
$?    表示上一个命令退出的状态
$$    表示当前进程编号
$0    表示当前程序名称
$!    表示最近一个后台命令的进程编号
$HOME    表示当前用户根目录
$IFS    表示内部的字段分隔符
$LANG    当前locale默认名称
$PATH    环境变量
$PPID    父进程编号
$PWD    当前工作目录



测试表达式的类别:
    数值比较
    字符串测试
    文件测试:
        存在性测试
            -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

必须使用测试命令进行;

# [ -z "$hostName" -o "$hostName"=="localhost.localdomain" ] && hostname www.magedu.com
# [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

原创文章,作者:wostop,如若转载,请注明出处:http://www.178linux.com/24208

(0)
wostopwostop
上一篇 2016-07-16
下一篇 2016-07-16

相关推荐

  • Linux文件系统

    1、Linux文件系统层级标准 为什么Linux的不同发行版中的目录结构基本上都一样? Linux有一个组织叫LSB定义的Linux发行版基础目录名称命名法则及功用规定,这种标准叫做 FHS(Filesystem Hierarchy Standard),文件系统层级标准。 /boot:系统引导启动时要加载的静态文件:kernel, initramfs(ini…

    Linux干货 2016-10-29
  • Linux文件管理命令

    Linux系统上文件管理命令 一、文件查看类命令      1、cat 由第一行开始显示文件内容 语法格式: cat [选项列表] [文件列表]… 参数说明: -A, –show-all 等价于 -vET 。 -b, –number-nonblank 给非空输出行编号。 -e 等价于 -vE 。 -E…

    Linux干货 2017-07-24
  • 硬链接与软链接的区别

    硬链接(Hard Link):   硬连接指通过索引节点来进行链接(即一个指针指向文件索引节点)。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种链接就是硬链接。硬链接的作用是允许一个文件拥有多个有效路径…

    Linux干货 2016-10-20
  • Shell脚本编程中的if、case、for、while、until命令

    为何要学编程中的if、case、for、while、until命令?        作为一个运维工程师,总会听到自动化,实际自动化离不开编写shell脚本,而shell脚本中却又离不开编程中的if、case、for、while、until, 这些关键字。 了解编程中的if、case、for、while、until命令,…

    Linux干货 2016-08-19
  • JoSQL内存数据库远程代码执行漏洞(含EXP)

    JoSQL全称SQL for Java Objects,提供了应用SQL语句的Java对象的集合的能力开发,JoSQL提供了搜索,排序,group等对Java对象的集合进行类似SQL的查询应该应用的功能。 例如,查找所有在2004年内修改过的html文件: SELECT * FROM   java.io.File WH…

    Linux干货 2015-03-06
  • 马哥教育第三周4.15

    vimvim +10 直接跳到第10行i 输入信息I跳到行首A跳到行尾o当前下面重新开启一行O当前上面重新开启一行w f2 另存为w!强行覆盖r 后面跟路径 可以读取别的文件加进来:!命令 可以直接出执行结果:r!+路径 文件 直接写入文档中:s 搜索 :%s/xyz/&er/g  扩展模式::q 退出:q! 强制退出,丢弃做出的修改:wq 保存退…

    Linux笔记 2018-04-15

评论列表(1条)

  • 马哥教育
    马哥教育 2016-07-17 20:24

    写的很好,排版也很漂亮,加油