一、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
i
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
-
n
"$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,如需转载请自行联系原作者