博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bash编程(三)
阅读量:6219 次
发布时间:2019-06-21

本文共 3799 字,大约阅读时间需要 12 分钟。

    

一、bash交互式编程 
    脚本参数:
    用户交互://linux的重要思想,尽量避免和用户交互
        1.脚本传递参数, a.sh  tom jery
        2.通过键盘获取数据 
            read //
                -p 'promtpt' //提示符
                    // read a b 输入tom和jerry会分别识别为a和b  
                -t timeout 超时时间
            read a b //输入 ja tom wolf  //a==ja ,b='tom wolf'    
            read -t 5 -p "enter a name: " name 
            
            脚本:添加用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root
@mt 
test]
# cat adduser.sh 
#!/bin/bash
#
read -p 
"Enter a username : " 
name
[ -z 
$name 
] && echo 
"username is needed ..." 
&& exit 2
read -p 
"Enter a password for $name " 
passwd
[ -z 
$passwd 
] && password=
"password"
if 
id 
$name 
&> /dev/null ;then
   
echo 
"$name is exists."
else
   
useradd 
$name
   
echo 
"$password" 
| passwd --stdin 
$name 
&> /dev/null
   
echo 
"useradd succeed.."
fi

        3.bash -n a.sh //语法错误,不能报告逻辑错误

            bash -x a.sh //调试执行
    
二、bash选择执行(if)
    过程式编程语言的执行流程:
        选择执行
        顺序执行
        循环执行
    选择执行:
        && ,||
        if语句
        case 语句
        
        if语句:三种格式
            单分支的if语句
                if CONDITION;then
                    if-true 分支;
                fi
            双分支的if语句
                if CONDITION ;then
                    if-true分支
                else
                    if-false 分支
                fi
            多分支的if语句
                if CONDITION1;then
                    条件1 为真分支
                elif CONDITION2;then
                    条件2;为真分支
                elif CONDITION3;then
                    条件3;为真分支
                ...
                else
                    所有条件都不满足时的分支
                注意:分支只会执行一个,首先测试为真;
                        多个条件同时都能满足,只执行第一个匹配到的
    脚本1-3位if语句
    
三、循环执行
        //将一段代码重复执行0,1多次
    进入条件:满足条件才进入循环
    退出条件:每个循环都有退出条件,
    
    bash脚本:
        for循环
        while循环
        until循环
    for循环
        两种格式:
            (1)遍历列表
            (2)控制变量
        遍历列表:
            for VARIABLE in LIST; do
                循环体
            done
            进入条件:只要列表有元素,即可进入循环
            退出条件:列表中的元素遍历完成
    LIST的生成方式
        (1)直接给出
        (2)整数列表
            {start..end} / echo {20..30}
            seq 10 //1-10
            seq 5 10 //从5到10
            seq 1 2 10 //步数为2,只输出奇数列表    
        (3)cat/ls /var   :返回列表的命令
            cat /etc/issue
        (4) ls -d /etc/p* 
            for i in /etc/p* 就可以
        (5) 变量引用
            $@,$# 等
        
脚本1:脚本传递一个文件名,判断文件类型是什么

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    
#!/bin/bash
    
#
    
if 
[ $
# -lt 1 ] ;then
        
echo 
"At lease one path.."
        
exit 1
    
fi
    
if 
! [ -e 
$1 
] ;then        //假如不存在
        
echo 
"No suck file.."
        
exit 2
    
fi
     
    
if 
-f 
$1 
] ;then
        
echo 
"Common file.."
    
elif [ -d 
$1 
] ; then
        
echo 
"Directory.."
    
elif [ -L 
$1 
] ; then
        
echo 
"Symbolic file..."
    
elif [ -b 
$1 
] ;then
        
echo 
"block file..."
    
elif [ -c 
$1 
] ; then
        
echo 
"Character file..."
    
elif [ -S 
$1 
]; then
        
echo 
"Socket file..."
    
else
        
echo 
"Unknown ... "
    
fi

    

脚本2:传递一个参数给脚本,此参数为用户名
    根据其id号判断其用于类型
        0:root
        1-999:系统用户
        1000+:登录用户

1
2
3
4
5
6
7
8
9
10
11
12
    
#!/bin/bash
    
#
    
[ $
# -lt 1 ] && echo "At least one user name." && exit 1
    
! id -u 
$1 
&> /dev/null && echo 
"no suck user" 
&& exit 2
    
userid=$(id -u 
$1
)
    
if 
$userid 
-eq 
0 ] ;then
        
echo 
"root"
    
elif [ 
$userid 
-ge 
1000 ] ;then
        
echo 
"logging user."
    
else 
        
echo 
"System user."
    
fi

脚本3:列出如下菜单为用户

    disk)show disks info
    mem)show memory info;
    cpu)show cpu info
        cat /proc/meminfo或者lscpu
    *) quit
    提示用户给出自己的选择,而后显示对应其选择的相应系统信息

1
2
3
4
5
6
7
8
    
#!/bin/bash
    
#
    
cat 《《  EOF
    
disk) show disks info
    
mem)  show memory info;
    
cpu)  show cpu info
    
*)    quit
    
EOF
1
2
3
4
5
6
7
8
9
10
11
    
read -p 
"Your choice: " 
opt
    
if 
"$opt" 
== 
'disk' 
] ;then  
        
fdisk -l /dev/sd[a-z]
    
elif [ 
"$opt" 
== 
'mem' 
] ;then
        
free -h
    
elif [ 
"$opt" 
== 
'cpu' 
] ;then
        
lscpu
    
else
        
echo 
"Unknown option.."
        
exit 3
    
fi

    

脚本4:添加用户
    #!/bin/bash
    #
    for i in user20 user21 user22 ;do
        if id $i &> /dev/null ; then
            echo "$i exists.."
        else
            useradd  $i && echo "Add user $i succeed"
        fi
    done
    
脚本5:从1-100的和

1
2
3
4
5
6
7
8
    
#!/bin/bash
    
#
    
declare -i sum=0
    
for 
in 
{1..100};
do
        
sum=$[
$sum 
$i
        
echo 
"\$sum is $sum" 
// 可以对$进行转义
    
done
    
echo 
$sum

    

脚本6:判断/var/log下所有文件的类型
    方法1:file /var/log/*
    方法2:脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
#!/bin/bash
    
#
    
for 
filename 
in 
/
var
/
log
/
* 
; do
        
echo 
-
"$filename    "
    
if 
-
f $filename ] ;then
        
echo 
"Common file.."
    
elif 
-
d $filename ] ; then
        
echo 
"Directory.."
    
elif 
-
L $filename ] ; then
        
echo 
"Symbolic file..."
    
elif 
-
b $filename ] ;then
        
echo 
"block file..."
    
elif 
-
c $filename ] ; then
        
echo 
"Character file..."
    
elif 
-
S $filename ]; then
        
echo 
"Socket file..."
    
else
        
echo 
"Unknown ... "
    
fi
    
done

脚本7:练习

1.分别求100以内所有偶数之和,以及奇数之和
2.计算当前系统上的所有用户的id之和
3.通过脚本参数传递一个目录给脚本,而后计算此目录下所有文件文件的行数,并说明此类文件的总数

本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1950192,如需转载请自行联系原作者

你可能感兴趣的文章
JavaScript常用字符串函数
查看>>
数据交换格式XML和JSON对比
查看>>
强烈推荐Oracle的入门心得
查看>>
POJ 1195 Mobile phones (二维树状数组或线段树)
查看>>
LINUX下使用crontab进行RMAN备份实验
查看>>
Hive文件格式
查看>>
[LeetCode] Delete Node in a Linked List
查看>>
农历js脚本
查看>>
获取对象的 RTTI 属性与事件的函数
查看>>
java获得CPU使用率,系统内存,虚拟机内存等情况
查看>>
.NET操作Excel表格的整理
查看>>
vcl.Forms等与VCL界面有关的单元不支持跨平台
查看>>
Windows Vista for Developers——第一部分:Aero向导
查看>>
条件随机场CRF HMM,MEMM的区别
查看>>
CentOS7使用firewalld打开关闭防火墙与端口
查看>>
搜狐首页出现一个硕大的错别字
查看>>
《ASP.NET Web API 2框架揭秘》
查看>>
[导入]竟然支持OpenGL ES!
查看>>
java学习笔记-2
查看>>
csharp 復制DataTable修改某列的值
查看>>