shell 脚本——第五节课 交互输入read与for语句
交互输入与for语句
一、交互输入read
read input()
read 命令同可以定义多个变量值;而输入的内容默认以空格为分隔符,将值输入到对应的变量中;
如果默认值过多,最后所有的值都会被赋予给最后一个变量;
如果默认值过少,多余的变量则为空值;
示例:
read a b c
aa bb cc
read如何输入:
echo "请输入一个目录:"
我们需要echo -n 取消换行符号
echo "请输入一个目录:";read变量
请输入一个目录:\etc
常用参数:
-p
read -p "请输入一个目录:"变量
-t 定义超时时间
read -t 5 -p "请输入一个目录:"变量
练习题:输入一个设备文件,输出这个设备文件的基本信息;
#!/bin/bash
#
read -t 5 -p "输入一个设备文件名:" devname
[-z $devnaem] && devname= `fdisk -l`
if [-b $devname];then
fdisk -l $devname
exit ()
else
echo"$devname 不是设备文件"
echo"Usage:"
fi
二、for语句循环
回顾:文件判断脚本;
#!/bin/bash
#
read -p "输入一个文件名:"name
if[-z $name];then
echo "Usage:'输入一个文件名:/etc/fstab'"
exit 1
fi
if[! -e $name];then
echo"提示:输入的文件不存在!!fool"
exit 2
elif[-f $name];then
echo"$name is a file"
elif[-d $name];then
echo"$name is a dir"
elif[-b $name];then
echo"$name is a block file"
elif[-L $name];then
echo"$name is a Link file"
else
echo"$name是其他文件类型"
case语句
case语句的语法格式:
case变量in
PATTEN1)
代码块1
;;
PATTEN2)
代码块2
;;
*)
代码库
esac
--------------------------------------------------
for语句的应用场景:
有一个功能,这个功能需要循环执行,知识执行对象不同;【对象必须是同类数据】
for 语句格式:
a=['a','b','c'] --在python程序中,我们很多情况下,需要调用相应的方法去生成列表;
for变量in列表:do
循环体
done
99乘法表:
{1..9}
#!/bin/bash
#
for i in `seq 9`;do
for j in `seq 9`;do
[$j -le $i] && echo -n -e "$i*$j=`echo $(($i*$j))`\t"
done
echo " "
done
#!/bin/bash
#99乘法表
for i in {1..9};do
for j in $1;do
echo -n -e "$j*$i=$[$i*$j]\t"
done
echo
done
echo -e
-e:使echo命令,能够识别 特殊字符;
\r:回车不换行
\n:换行符
\t:制表符 tab = 4个空格
unix2dos \r\n-->\n
dos2unix
列表生成方式:
1、直接给出字符串列表
for i in a b c d e ;do
循环体
done
2、整数列表
a{start...end} //{1..1}是不行的 {1..9} == python range{1,100}
b seq 命令引用 $(seq [start[step]] end)
步长 python range{1,100,2}
seq 20 30
题目:写一个for循环--遍历
#!/bin/bash
#ping遍历
declare -i sum=0
for i in $(seq 1 254);do
ping -c l -w 1 10.6.12.$i &> /dev/null
if [$? -eq];then
let sum++
echo "10.6.12.$i 是通的"
fi
done
echo "总共有$sum 台电脑在线"
题目:1到100的偶数和
#!/bin/bash
#偶数和
declare -i sum=0
for i in $(seq 0 100 2);do
let sum+=$i
done
echo "总数为:$sum"
3、返回列表的命令
$(COMMAND)
应用场景:ls /var/log/
题目:判断/var/log的所有文件,以.log结尾的文件统计处理,并显示:
#!/bin/bash
#
declare -i sum=0
for i in $(ls /var/log/);do
if["*.log" = $i];then
echo$i
let sum++
fi
done
echo "统计.log结尾的文件有: $sum"
题目:netstar -tan 查看网络状态,统计LISTEN 出现的状态次数、ESTABLISHED出现的状态次数、出现的状态次数
#!/bin/bash
#统计
declare -i L=0
declare -i E=0
declare -i O=0
for i in $(netstat -tna | grep "^tcp" | awk '{print $6}');do
if [$i = LISTEN ];then
let L++
elif [$i = ESTABLISHED ];then
let E++
else
let O++
fi
done
echo "监听的链接有:$L"
echo "其他链接:$E"
echo "建立的链接有:$O"
vim 常见用法:
命令模式:
dd 剪切
5dd
p 粘贴
yy 粘贴
5yy
4、glob机制 -- 文件名通配符的机制
$(ls /var/log/)
/var/log/*.log
test命令总结:
1、test的命令的option的 -a -o 只在命令中使用;
例如 [ `du -h $filename | cut -d: -f1`-lt 100k -a -x $filename]
test `du -h $filename | cut -d: -f1`-lt 100k -a -x $filename
注意:做字符串匹配的时候,不支持正则以及通配符
2、test test ==[[ ]]
再连接两个test的命令的时候,不能使用命令内部option -o -a
一般使用 || && == != >= <=
[[yum.log == *.log]]
5、变量引用
$@ $* 将参数做为for循环的列表
$0 -- 和 awk 不一样
bash中$0代表运行的脚本文件;
awk中$0 --- awk 按行执行
需要多个词的时候用"$@",需要一个词的时候用"$*"