Bash变成(二)

一、Bash脚本编程风格
二、Bash条件测试:
三、脚本的状态返回值       
四、练习脚本:
五、if 语句

一、Bash脚本编程风格
    脚本格式:
    #!/bin/bash
    #description: say hello
    #version 0.0.1        //注释信息    
    #author:xiaoming        //代码注释
    #date:2017-01-01
    
    缩进:适度添加空白行;
    
    语法:编程语法格式、库调用(类库)、算法、数据结构
    
    编程思想:
        问题空间-->解空间
    变量:
        局部变量:当前shell
        本地变量:local,函数内部
        环境变量:当前shell及其子进程
        位置参数变量:$1,$2,$3
        特殊变量:$#,[email protected]
    变量的数据类型://弱类型,默认都为字符型
        字符型
        数值型
        
    算数运算:+,-,*,/,%,**
        expr,let
        let VAR=expression
        $((expression))
        $[expression]
        var=$(expr argu1 + argu2)  //一个小括号,命令引用
        
    注意:有些时候,乘法符号需要转义    
    animal=dog;echo "${animal}s" //用花括号分开即可
    PATH=“$PATH:/usr/locale/apache/bin" //引用原有的值,然后重新赋值
    
    增强型赋值:变量做某种算术运算后回至此变量中
        declare -i a=1 //
        i=$[$i+1]
        let i+=2 //这样也可以的:增强型复制机制
        let +=,-=,*=,/=,%=  //一般使用let进行
        let ++,--  //自己加上/减去 1
            let var=$[$var+1]
            let var+=1
            let var++
脚本1:添加user1
    #!/bin/bash
    # first_scrpit
    id user1 &> /dev/null || useradd user1
    id user2 &> /dev/null || useradd user2

user_id1=$(id -u user1)
    user_id2=$(id -u user2)
    id_sum=$[$user_id1+$user_id2]
    echo "sum is :$id_sum"
    
练习:
    1.写一个脚本,计算/etc/passwd文件中第10个用户和第20个用户的id号之和
    2.计算/etc/rc.d/init.d/functions和/etc/inittba文件的空白行数之和
    1.
        id1=$(head -10 /etc/passwd | tail -1 | cut -d: -f3}
        id2=$(head -20 /etc/passwd | tail -1 | cut -d: -f3}
    2.
        b1=$(grep "^$" /etc/rc.d/init.d/functions  | wc -l)
        b1=$(grep "^[[:space:]]*$" /etc/rc.d/init.d/functions  | wc -l)
        
二、Bash条件测试:
    判断某需求是否满足,需要测试机制来实现
    ||,&&,! //或,非,与
    测试方法:
        1.执行命令,并利用命令状态返回值来判断
            0:成功
            1-255:失败
            echo $?
        2.测试表达式
            test -[d,e,f,h,p,r,s,S,w,N] a.txt
                d目录,f普通文件,e存在,h|-L符号文件,
                r可读,w可写,-s非空,-S套接字,-N上次读取之后修改过
            [ expression ]
            [[ expression ]]
            
            注意:expression两端必须有空格,否则为语法错误
    
    bash测试类型:
        数值测试
        字符串测试
        文件测试
        
    1.数值测试:数值比较
        -eq,-gt,-lt
        -ge,-le,-ne
            test 3 -gt 4 && echo True || echo false    
    2.字符串测试:根据ascii表,尽可能定义在[[ ]]中
        == 是否相当
        >         
        《    
        !=    是否不等于
        =-  :左侧的字符串是否能够被右侧的pattern匹配
            name=tom; [[ "$name" =~ t ]] ;echo $? //tom是否包含 t字母
        
        //单目
        -z “STRING” 判断子串是否为空,空则为真,否则为假
        -n “STRING” 是否不空
            [ -n "$name" ];echo $?
        注意:[[ “a” > “b” ]] ;echo $?
            //一定要使用两个中括号,否则会出错
            (1)字符串要加引用
            (2)要使用[[ ]]
    3.文件测试
        d目录,-S套接字,-p 管道文件
        f普通文件,
        a|e存在,
        h|-L符号文件,
        -b 块设备文件
        -s非空,
        -N上次读取之后修改过 //上次读取后,是否被修改过
        
    4.文件权限测试:
        r可读,是否存在且对当前用户可读
        w可写,
        x可执行    
        -g 是否存在,并且拥有sgid权限
        -u 是否存在,并且拥有suid权限
        -k sticky权限
            [ -u /bin/passwd ] ; echo $?
    5.从属关系测试
        -O FILE 当前用户是否为文件的属主
        -G FILE 当前用户是否为屋内安的属组
        
    6.双目运算
        FILE1 -ef FILE2 //file1与file2是否指向同一个fs的相同inode
        file1 -nt filr2 //file1是否新于file2
        file1 -ot file2 //file1是否旧于file2
        
    7.组合测试:
        逻辑运算:
            第一种方式:
                a && b
                a || b
                ! a //取反
        [ -O file ] && [ -r file ] //当前用户为属主并且可读
        [ -O file -a -x file ]
        
        expression -a expression2 //
        expression -o expression2
        ! expression

test "a" != "$HOME" -a 3 -ge 4 ; echo $?
        [ ! \( "a" = "$HOME" -o 3 -lt 4 \) ]; echo $?
        [ ! \( "a" = "$HOME" -o ‘(‘ 3 -lt 4 ‘)‘ ")" ]; echo $?
    
三、脚本的状态返回值
    默认是脚本中执行的最后一条命令的状态返回值
    自定义状态返回值
    exit [n] //自定义状态返回值,状态码
    
    注意:shell进程遇到exit会终止,因此整个脚本将会结束
        一般判断条件是否满足,再执行exit
    
注意:XShell的锁定和接触锁定
    vim
    ctrl + s 锁定后,
    ctrl + q 取消锁定

四、练习脚本:

脚本1:
    将当前主机名称保存至hostName变量中:
    主机名为空,或者为localhost.localdomain,则将其设置为www.mt.com
#!/bin/bash
hostName=$(hostname)
[ -z "$hostName" -o "$hostName"=="localhost.localdomain" -o hostName=="localhost" ]  && hostname www.xt.com

注意:
    //必须是 [] ,而不能是 [[ ]] ,或者
    //== 前后不需要空格
    // [ ] 前后都需要空格,
    //$hostname 得需要“ ”    
    //[ ** -o|-a| ** ] 判断内部 // && ||  ! 判断[]外部
    
    
脚本2.向脚本传递参数
    位置参数变量;
    引用:
        $1,$2,...$(12)
    shift 轮替
        shift n :位置参数变量
    
    特殊变量:
        $0:脚本文件名
        $#: 获取参数个数总和
        $*: 所有参数
        [email protected]: 所有参数

引用变量计算数值
bash sum.sh 23 78
#!/bin/bash
#
echo $[$1 + $2]

//判断文件空白行行数
#!/bin/bash
[ $# -lt 2 ] && echo "At least two files" && exit 1

b1=$(grep "^$" $1 | wc -l)
b2=$(grep "^$" $2 | wc -l)
echo "sum of blank is : $[b1+b2]"

五、if 语句

过程式编程语言的代码执行顺序
    顺序执行:逐条执行
    选择执行:
        代码有一个分支:条件满足则执行
            两个以上的分支:只会执行其中一个满足条件的执行
    循环执行:
        代码片段(循环体)要执行0,1或多个来回
        
    选择执行:
        if 测试条件 ; then  //需要分号
            代码分支
        fi
            
        if 测试条件        //then单独分行,不需要分号
        then
            代码分支
        fi
        
        双分支if语句
        if 测试条件; then
            条件为真时运行
        else
            条件为假时执行
        fi
        
脚本3:通过参数传递一个用户名给脚本,此用户不存在时添加该用户
#!/bin/bash
if [ $# -lt 1 ]; then
    echo "At least one user_name"
    exit 1
fi
if ! [ grep "$1\>" /etc/passwd ] &> /dev/null; then
    useradd $1
    echo $1 | passwd --stdin $1
    echo "USER $1 added succeed!"
    exit 0
else
    echo "Failure ..."
    exit1
fi

脚本4:通过键盘给定两个数字,输出其中较大的值
#!/bin/bash
#
if [ $# -lt 2 ] ; then
    echo "Two intergers."
    exit 2
fi
if [ $1 -ge $2 ] ;then
    echo "max number is: $1"
else
    echo "max number is: $2"
fi

脚本5:通过命令参数传递给定两个文件名,如果某文件不存在,则结束脚本
    返回每个文件的行数,并说明其中行数最多的文件
[[email protected] test]# cat 2.sh
#!/bin/bash
#AUthor xt
#date 2017-07-22
declare -i f1 f2
if [ $# -lt 2 ] ; then echo "At least two files " exit 1 ; fi
#if  [ ! -f $1 ] ||  [ ! -f $2 ] ; then
if  ! [ -f $1 -a  -f $2 ] ; then
    echo "At least one is not a primary file" exit 2 ;
else
    f1=$(wc -l $1 | cut -d‘ ‘ -f1)
    f2=$(wc -l $2 | cut -d‘ ‘ -f1)
    if [ $f1 -gt $f2 ] ;then
        max=$f1
    else
        max=$f2
    fi
    echo "First file‘s line is $f1"    
    echo "Second file‘s line is $f2"    
    echo "Max  is line is $max"    
fi

时间: 2024-10-12 13:45:57

Bash变成(二)的相关文章

bash功能特性二 命令别名和历史命令

一.历史命令 bash提供存储历史命令的功能,下面来详细介绍一下. 1.history命令 命令格式:history [options] options: 不带参数选项:显示所有使用过的命令: #(数字):显示最近使用过的#条命令: -c:清除目前shell中所有的历史命令: -d #:清除条#条命令: -r:将历史命令配置文件(默认~/.bash_history)中的内容读到目前的shell中: -a [FILE]:将新增的历史命令导入到FILE中,不指定则保存到~/.bash_history

bash的特性(一)

一.Shell 说到bash,首先就必须先提一下shell.Shell是什么呢?Shell是一个C语言编写的给用户提供交互的接口程序.用户的大部分操作都是通过shell完成的. 广义上Shell主要分为两类: 1.GUI图形用户界面:主要有KDE.GNOME.XFCE等 2.CLI命令行界面:bash.zsh.fish.sh.csh.tcsh等.各个发行版主要使用bash. 二.bash的特性 (一)命令别名 在linux的使用和管理过程中,将会用到大量的命令,我们可以通过命令别名来避免一些常用

Linux学习(二十一)Shell基础(一)认识shell、命令历史、命令补全、别名、通配符、管道符与前后台控制

前言 这个系列我们学习shell的基础知识. 一.认识shell 我们经常使用的终端,其实就是一个shell.Bourne开发的shell原本叫shell,后来再版Bourne Again Shell叫做Bash.我们通常使用的shell就是Bash. 二.命令历史 history命令能够记录我们使用过的命令: [[email protected] ~]# history|tail -n3 803 history|tail -n3 804 history 805 history|tail -n3

Linux学习汇总——Linux编程语言及Bash特性

本章Blog相关Linux知识点 编程语言,是用来定义计算机程序的形式语言.它是一种被标准化的交流技巧,用来向计算机发出指令. ??? 强类型语言(静态类型语言)是指需要进行变量/对象类型声明的语言,一般情况下需要编译执行.例如C/C++/Java/C# ??? 弱类型语言(动态类型语言)是指不需要进行变量/对象类型声明的语言,一般情况下不需要编译(但也有编译型的).例如PHP/Python/Perl/SQL/Shell等. 程序执行逻辑,bash脚本,面向对象的过程中, ??? 顺序执行:默认

Linux命令(二十六) 用户管理命令

一.添加用户 useradd useradd 命令用于创建新用户,格式为useradd [选项] 用户名. 可以使用 useradd 命令创建用户帐户,使用该命令创建账户时,默认的用户目录在 /home 目录下,默认的shell为 /bin/bash ,而且会默认创建一个与该用户同名的基本用户组. useradd命令支持丰富的参数,常用参数如下所示: -d 指定用户家目录 -e 账户到期时间,格式为 YYYY-MM-DD. -u 指定用户的UID -g 指定一个初始的基本用户组 -G 指定一个或

gawk用法

awk概述 AWK的名字来自于其创始人Aho, Weinberger, Kernihan三人的名字首字母的组合. awk是一个功能非常强大的文本处理工具,它能把文本当做数据库,然后把数据库中的每一行切分为多个字段,可以实现分别对多个字段或行进行处理,并使之按照一定的格式输出,所以awk是文本报告生成器,它能格式化文本.而要选择性地处理字段或行,则可以使用模式(PATTERN)来匹配. 此外,awk已经是一门独立完整的编程语言,它支持一般编程语言所具备的特性,如支持变量.数组等数据结构.支持条件判

shell总结(0基础入门)

一.简介 shell是用户和操作系统交互的命令行解释器. shell有很多种: bash.csh.sh.ksh... 我们等了linux时看到的命令行就是一个bash. 二.第一个脚本: [[email protected] script]# vim first.sh #!/bin/bash#auther:xiaofan#time:2016.10.4#井号是注释echo "hello word" 执行脚本: 方法1: [[email protected] script]# bash f

CentOS6.5使用本地光盘做yum源 (参考:http://www.osyunwei.com/archives/5511.html)

一.使用光盘做yum源安装软件 mkdir /media/cdrom  #新建光盘挂载目录 mount /dev/cdrom  /media/cdrom   #挂载光盘 安装证书 rpm --import   /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #安装证书 yum clean all #清理yum 开机自动挂载光盘 vi /etc/fstab  >> /dev/sr0     /media/cdrom            auto    ro,auto

docker容器从入门到实战0826

##docker容器安装和配置### #docker的git-hub网站(账号rshare,密rshare520):https://github.com/login #docker官网hub仓库(账号flyer520,密码rhsare520):https://hub.docker.com #docker官网文档和镜像:https://docs.docker.com/samples/centos/ #docker官网的容器网络配置:https://docs.docker.com/engine/us

重置root密码(debian centos)

一.debian7.8 1.在Grub的引导装载程序菜单上,选择你要进入的条目,键入"e"来进入编辑模式 2.在quiet后面增加init=/bin/bash按ctrl-c或f10启动机器 3.输入mount后看到根分区是ro(只读状态) 4.直接修改root密码会报错 5.以读写模式挂载根分区 再次修改密码就行了 6.参数说明init=/bin/bash使用root获得/bin/bash程序 二.centos6.61.在Grub的引导装载程序菜单上,选择你要进入的条目,键入"