1.交互输入
read【交互式界面】
:read a b c
aa bb cc
read命令同时可以定义多个变量;而输入的内容默认以空格为分隔符,将值输入到对应的变量中;如果默认值过多,最后所有的值都会被赋予给最后一个变量;如果默认值过少,多余的变量则为空值
read如何输入:
echo”请输入一个目录:” //我们需要 echo -n取消换行符号
例:echo”请输入一个目录:”;read变量
请输入一个目录:/etc
常用参数:
-p read -p ”请输入一个目录:”变量
-t 定义超时时间 read -t 5 -p ”请输入一个目录:”变量
脚本默认值
输入内容-------------------------------
| |
输入是否正确----- 没有输入------------
| | | |
正确 不正确,给提示 提示必须输入 给出默认值
[ ! -n $filename ]
练习:输入一个设备文件,输出这个设备文件的基本信息
1 #!/bin/bash 2 3 # 4 5 read -t 5 -p “输入一个设备文件名:”devname 6 7 [ -z $devname ]&& devname=`fdisk -l`&& exit 1 8 9 10 11 if [ -b /dev/$devname ];then #-b 是否为块文件 12 13 fdisk -l /dev/$devname 14 15 exit 0 16 17 else 18 19 echo “$devname不是设备文件” 20 21 echo “Usage:‘请输入一个设备文件,如:sda’” 22 23 exit 2 24 25 fi
2.for语句循环
case语句
case语句的语法格式:
case 变量 in
patten1)
代码块1
;;
patten2)
代码块2
;;
*)
esac
for语句的应用场景:
有一个功能,这个功能需要循环执行,只是执行对象不同;【对象必须是同类数据】
for语句格式:
a=[‘a’,’b’,’c’] –在python程序中,我们很多情况下,需要调用相应的方法去生成列表;
for 变量 in 列表;do
循环体
done
练习:99乘法表
1 #!/bin/bash 2 3 for I in`seq 9`;do 4 5 for j in `seq 9`;do 6 7 [$j -le $i] && echo -n -e “$i*$j=`echo $(($i*$j))`\t” 8 9 done 10 11 echo “ ” 12 13 done
1 #!/bin/bash 2 3 #九九乘法表 4 5 for i in {1..9};do 6 7 for j in $i;do 8 9 echo -n -e“$j*$i=$[$i*$j]\t” 10 11 done 12 13 echo 14 15 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
b seq命令引用 $(seq[start[step]]end)
步长 python range{1,100,2}
seq 20 30
题目:用for循环实现遍历本网络段中左右up的主机
1 declare -I sum=0 2 3 for i in $(seq 1 254);do 4 5 ping -c 1 -w 1 10.6.12.$i &> /dev/null 6 7 if [ $? -eq 0 ];then 8 9 let sum++ 10 11 echo ”10.6.12.$i是通的” 12 13 else 14 15 echo ”10.6.12.$i是不通的” 16 17 fi 18 19 done 20 21 echo “总共有$sum台电脑在线”
3. 返回列表的命令
$(COMMAND)
应用场景:ls /var/log/
题目:判断/var/log/的所有文件。以.log结尾的文件统计处理,并显示:
1 #!/bin/bash 2 3 # 4 5 declare -i sum=0 6 7 for i in $(ls /var/log/);do 8 9 if[“*.log”=$i];then 10 11 echo $i 12 13 let sum ++ 14 15 fi 16 17 done 18 19 echo “.log结尾的文件有:$sum”
4. glob机制—文件名通配符的机制
$(ls /var/log/)
/var/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按行执行】awk中$0整行内容
需要用多个词的时候用“$@”,需要一个词的时候用“$*”