read与for语句循环

1、交互输入

input() 用于python

read命令同时可以定义多个变量值,而输入的内容默认以空格为分隔符,将值输入到对应的变量中,如果值过多最后所有的值都会被赋予给最多一个变量。如果值过少多余的变量为空值。

示例:

read a b c

aa bb cc

read如何输入:

echo“请输入一个目录:”

echo -n 取消换行符

echo“请输入一个目录:”read 变量

请输入一个目录:/etc

常用参数:

-p   read -p “请输入一个目录:”变量

-t   定义超时时间   read -t 2 -p  “请输入一个目录:”变量

脚本默认值

[ ! -n $filename ] &&

输入内容------------------------------------------

|                                   |

输入是否正确                    没有输入--------------------

|           |                       |                  |

正确    不正确,给提示         提示必须输入     给出默认值

练习:输入一个设备文件,输出这个设备文件的基本信息;

#!/bin/bash

read -t 5 -p "输入一个设备文件名:" devname

[ -z $devname ] && fdisk -l && exit 1

 

if [ -b /dev/$devname ];then

fdisk -l /dev/$devname

exit 0

else

echo "$devname 不是设备文件"

echo "Usage:'请输入一个设备文件,如 sda'"

fi

 

2、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是其他文件类型"

fi

 

case 语句? -- 做匹配

case语句的语法格式:

 

case 变量 in

PATTEN1)

  代码块1

  ;;

PATTEN2)

  代码块2

  ;;

*)

  代码库

esac

 

   应用场景:有一个功能需要循环执行只是执行对象不同,对象必须是同类数据

语句格式:

  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 {0..$i} ; 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循环--遍历本网络网段中所有up的电脑

#!/bin/bash

# ping遍历

 

declare -i sum=0

 

for i in $(seq 1 100);do

      	ping -c 1 -w 1 10.6.12.$i &> /dev/null

        	if [ $? -eq 0 ];then

                	let sum++

                	echo "10.6.12.$i 是通的"        

       	else

                	echo "10.6.12.$i 是不通的"

        	fi

done

 

echo "总共有 $sum 台电脑在线"

题目:1100的偶数和

#!/bin/bash

# 偶数和
declare -i sum=0
for i in $(seq 0 2 100);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"

vim 常见用法:

命令模式:

dd  剪切

5dd

p    粘贴

yy  复制

5yy

p    粘贴

 

4glob机制 -- 文件名通配符的机制

$(ls /var/log/)

/var/log/*

 

test命令总结:

1test的命令的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

注意:做字符串匹配的时候,不支持正则以及通配符

2test test ==  [[  ]]

再连接两个test的命令的时候,不能使用命令内部option  -o -a

一般使用  ||   &&  ==  !=  >=  <=

[[ yum.log == *.log ]]

5、变量引用 -- 传参
$@ $* 将参数做为for循环的列表
$0 -- 和 awk 不一样
bash中$0代表运行的脚本文件;
awk中$0整行内容 --- awk按行执行

需要多个词的时候用 "$@",需要一个词的时候用 "$*"

vim a.sh
#!/bin/bash
#
for i in $@;do
循环体
done

./a.sh a b c d e 1 &


扩展:for语句的另外一种写法:
基于c语言格式的for语句写法:
for 变量 in 列表;do
循环体
done
优点:不易进入死循环


for((初始条件; 条件判断语句; 值变化语句));do
循环体
done

while语句的格式
初始值
while 条件 ;do
循环体
let i++ //变化初始值
done

 

posted @ 2019-08-23 09:09  Youngstrayschoolgirl  阅读(466)  评论(0编辑  收藏  举报