复习二

复习二

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

相关推荐

  • Bash Shell详解

    引言:什么是Shell? Linux的命令行接口归结起来就是各种Shell,那么到底什么是Shell?Shell,译为外壳,是用户直接连入计算机所使用的计算机程序,负责解析用户提供的命令,如词法分析、语法分析、句法分析。 1.Shell的分类 Linux 的命令 shell 是与操作系统相分离的一层。不同的 shell 环境影响您具备不同的功能,比如可编辑的…

    2017-09-07
  • sed文本处理器

    文本处理三剑客之一

    Linux干货 2017-12-10
  • 1021作业

    关于用户和组相关配置文件的总结 /etc/passwd:用户及相关属性信息 在Linux /etc/passwd文件中每个用户都有一个对应的记录行,它记录了这个用户的一些基本属性。系统管理员经常会接触到这个文件的修改以完成对用户的管理工作。这个文件对所有用户都是可读的。但是Linux /etc/passwd文件中都有些什么内容呢? #cat/etc/pass…

    Linux干货 2016-10-24
  • 第三周作业

    1、列出当前系统上所有已登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 ~]# who | cut -d ' ' -f 1 | sort -u 2、取出最后登录到当前系统的用户的相关信息。 ~]# la…

    Linux干货 2016-12-19
  • Linux keepalived高可用集群

                       Linux keepalived高可用集群 keepalived简介:    keepalived是为了高可用ipvs集群而设计的,主要用作realserver的健康状态检测,如果有一台web…

    系统运维 2016-11-18
  • DNS配置

     DNS配置 基本的配置准备 1.安装bind 2.开启named服务 一、正向解析库 1、修改/etc/named.conf配置文件 vim /etc/named.conf 修改如下行 listen-on port 53 { 10.1.44.2; } allow-query     { any; } recursion no;…

    Linux干货 2016-10-09

评论列表(1条)

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

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