复习二

复习二

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,如若转载,请注明出处:/24208

评论列表(1条)

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

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

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:测试  万达娱乐开户  万达开户  万达招商  华宇招商  万达主管QQ  万达娱乐招商QQ  guoqibee.com  万达娱乐直属  万达开户