@代表所有参数
所以如果后面跟上echo $v你会发现他会一次显示user userdebug eng
  1. $poo -le ${#prodlist[@]}
    这句话是说 $poo小于等于prodlist中的所有的值
    是这个意思吗?

1、Shell for循环语法

for 变量 in 列表
do
command1
command2
...
commandN
done

**也可以写成:for var in list; do

- 13.1.1、读取列表中的值
#!/bin/bash
#basic for command

for test in Alabama BOb Tom Console
do
echo The next state is $test
done

执行结果:

The next state is Alabama
The next state is BOb
The next state is Tom
The next state is Console

在最后一次迭代后,$test变量的值会在shell脚本的剩余部分保持有效。它会一直保持最后一次迭代的值(除非你修改了它)。

- 13.1.2、读取列表中的复杂值
有两种解决办法:
*使用转义字符(反斜线)来将单引号转移;
*使用双引号来定义用到单引号的值。

#!/bin/bash
#basic for command

for test in I don\'t think if "this'll" work
do
echo The next state is $test
done

执行结果:

The next state is I
The next state is don't
The next state is think
The next state is if
The next state is this'll
The next state is work

*记住,for命令用空格来划分列表中的每个值。如果在单独的数据值中有空格,就必须用双引号将这些值圈起来。

-

13.1.3、从变量读取列表
将一系列的值都集中存储在一个变量中,然后需要遍历变量中的整个列表。

#!/bin/bash
#using a variable to hold the list

list="Alabama BOb Tom Console"
#向已有列表中添加或拼接一个值
list=$list" success"
for state in $list
do
echo "this word is $state"
done

执行结果:

this word is Alabama
this word is BOb
this word is Tom
this word is Console
this word is success
-
13.1.4、从命令读取值
有两种方式可以将命令输出赋值给变量:
(1)反引号字符(`)
(2)$()格式
例如:

test=`date`
test=$(date)

生成列表中所需值就是使用命令的输出。

#!/bin/bash
# reading values from a file

file="states"
#for state in `ps -ef | grep 'tomcat.8701' | awk '{print $2}'`
for state in $(cat $file)
do
echo "visit beautiful $state"
done
states文件内容;

Alabama BOb
Tom Console

执行结果:

visit beautiful Alabama
visit beautiful BOb
visit beautiful Tom
visit beautiful Console

- 13.1.5、更改字段分隔符
造成这个问题的原因是特殊的环境变量IFS,叫作内部字段分隔符。默认情况下,bash shell会将下列字符当作字段分隔符:
*空格
*制表符
*换行符
如果bash shell在数据中看到这些字符中的任意一个,它就会假定这表明了列表中一个新数据字段的开始。

想修改IFS的值,使其只能识别换行符,那就必须:

IFS=$'\n'
将这个语句加入到脚本中,告诉bash shell在数据值中忽略空格和制表符。

#!/bin/bash
# reading values from a file

file="states"
IFS=$'\n'
for state in $(cat $file)
do
echo "visit beautiful $state"
done

执行结果:

visit beautiful Alabama BOb
visit beautiful Tom Console

一个可参考的安全实践是在改变IFS之前保存原来的IFS值,之后再恢复它。
实现:

IFS.OLD=$IFS
IFS=$'\n'
<在代码中使用新的IFS值>
IFS=$IFS.OLD

这就保证了在脚本的后续操作中使用的是IFS的默认值。
遍历一个文件中用冒号分隔的值:

IFS=:
如果要指定多个IFS字符,只要将它们在赋值行串起来就行。

IFS=$'\n':;"
这个赋值会将换行符、冒号、分号和双引号作为字段分隔符。如何使用IFS字符解析数据没有任何限制。

13.1.6、用通配符读取目录
for file in /proc/*;
do
echo $file is file path \! ;
done

- 13.2、类C风格for循环的语法格式
for((expr1; expr2; expr3))
do
command
command
...
done

有些部分并没有遵循bash shell标准的for命令:
*变量赋值可以有空格
*条件中的变量不以美元符开头
*迭代过程的算式为用expr命令格式

ex9、输出前5个正数

#!/bin/bash
#使用类C风格for循环输出1~5
for ((integer = 1; integer <= 5; integer++))
do
echo "$integer"
done

[zhangqi@localhost shellscript]$ sh for_ex9.sh

尽管可以使用多个变量,但你只能在for循环中定义一种条件。

#!/bin/bash
for ((a=1,b=10;a<=10;a++,b--))
do
echo "$a - $b"
done

执行结果:

1 - 10
使用类C风格for循环要注意以下事项:
a.如果循环条件最初的退出状态为非0,则不会执行循环体
b.当执行更新语句时,如果循环条件的退出状态永远为0,则for循环将永远执行下去,从而产生死循环
c.Linux shell中不运行使用非整数类型的数作为循环变量
d.如果循环体中的循环条件被忽略,则默认的退出状态为0
e.在类C风格的for循环中,可以将三个语句全部忽略掉,下面是合法的for循环

for((; ; ))
do
echo "hello world"
done
---------------------

第一类:数字性循环-->seq在in后面的应用

#!/bin/bash
#也是产生等差数列-->默认是1
for i in $(seq 1 10) #产生的是一个字符串,默认IFS是以空格隔开!
do
echo $(expr $i \* 3 + 1); #主要是复习:expr乘法的特殊用法!-->空格隔开
done
补充:产生[1,10]的自然数-->{}在in后面的应用

total=0 #全局变量
for i in {1..100} #".."表示连续,默认也是IFS为空格隔开
do
((total+=i))
done
echo -e "total is:${total}"

#多行注释
<<COMMENR
for i in mysql_{0,1,4,12}sql #多个文件
do
echo $i
samtools view -c $i
done
COMMENT
第二类:字符性循环

最原始的

#!/bin/bash
#使用列表for循环显示周一到周日对应的英文-->学习日期的英文
for day in Monday Tuesday Wednesday Thursday Friday Saturday Sunday
do
echo "$day"
done
变量的类型

#!/bin/bash
list="Linux Java C++ Python"
for i in $list
do
echo -e "Language is ${i}"
done
cat在in后面的应用-->逐行读取文件的内容(默认是IFS),所以不是逐行打印!

#!/bin/bash
for i in $(cat 日志颜色.sh) #注意:pwd当前目录下的文件
do
echo $i
done
思考:如果想逐行原样输出!

#!/bin/bash
# reading content from a file
file="日志文件.sh"
#将这个语句加入到脚本中,告诉bash shell在数据值中忽略空格和制表,使其只能识别换行符!
IFS=$'\n'
for std in $(cat $file)
do
echo "$std"
done
说明:IFS的一些说明!

bash shell会将下列字符当作字段分隔符:空格、制表符、换行符

说明:如果在shell在数据中看到这些字符中的任意一个,它就会假定这表明了列表中一个新数据字段的开始!
参考的最佳安全实践:在改变IFS之前保存原来的IFS值,之后再恢复它。

保证了:在脚本的后续操作中使用的是IFS的默认值

实现:

IFS.OLD=$IFS #默认的IFS的数值-->也是环境变量!
IFS=$'\n' #自定义的IFS数值
<在代码中使用新的IFS值> #待使用自定义IFS的部分!
IFS=$IFS.OLD #恢复默认的IFS
第三类:路径查找

ls在in后面的命令是-->读取当前pwd下的文件(广义上)!

#!/bin/bash
for i in `ls`; #ls可以结合统配符应用!
do
echo $i is file name\! ; #注意:\的应用!
done
 用通配符读取目录(无命令)

for file in ~/*; #一级目录下的内容-->并不递归显示!
do
echo $file is file path \! ; #${file}代表的是文件的全路径
done
通过脚本传参

#!/bin/bash
#回忆1:统计脚本参数的个数
echo "argument number are $#"!
#回忆2:参数的内容-->此处可以换成$@来测试!
echo "the input is $*"
#循环执行
for argument in "$*";
do
echo "$argument "
done
IFS:内部字段分隔符

需求如下:

#遍历一个文件中用冒号分隔的值:-->特殊文件-->/etc/passwd文件等!
IFS=:
#如果要指定多个IFS字符,只要将它们在赋值行串起来就行。
IFS=$'\n':;"
总结:

#(1)从变量读取列表
# 将一系列的值都集中存储在一个变量中,然后需要遍历变量中的整个列表

#(2)从命令读取值
#有两种方式可以将命令输出赋值给变量:
# (1)反引号字符(`)
# (2)$()格式
补充:在列表构成上分多种情景,如数字列表、字符串列表、命令列表、脚本传参列表等!

Linux 之Shell for循环的更多相关文章

  1. Linux Shell系列教程之(十二)Shell until循环

    本文是Linux Shell系列教程的第(十二)篇,更多Linux Shell教程请看:Linux Shell系列教程 在上两篇文章Linux Shell系列教程之(十)Shell for循环和Lin ...

  2. Linux Shell系列教程之(十一)Shell while循环

    本文是Linux Shell系列教程的第(十一)篇,更多Linux Shell教程请看:Linux Shell系列教程 在上一篇Linux Shell系列教程之(十)Shell for循环中,我们已经 ...

  3. Linux Shell系列教程之(十)Shell for循环

    本文是Linux Shell系列教程的第(十)篇,更多Linux Shell教程请看:Linux Shell系列教程 基本任何语言都有自己的循环语句,Shell当然也不例外,今天就为大家介绍下Shel ...

  4. Linux shell for循环结构

    Linux Shell   for循环结构 循环结构            1:循环开始条件      2:循环操作      3:循环终止的条件 shell语言          for,while ...

  5. Linux Bash Shell 快速入门

    BASH 的基本语法 最简单的例子 —— Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1     ...

  6. linux自动启动shell和init概述(fedora use systemmd now!!!)

    linux运行级别  linux启动之后会在一个级别运行,下面列出了这些运行级别: 0 系统停止 1 单用户系统,不需要登陆 2 多用户系统但不支持NFS,命令行模式登陆 3 完整多用户模式,命令行模 ...

  7. Linux Bash Shell入门教程

    Linux 系统根据 "#!" 及该字串后面的信息确定该文件的类型,关于这一问题同学们回去以后可以通过 "man magic"命令 及 /usr/share/m ...

  8. linux之shell编程基本语法

    Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell.Shell也是一门编程语言<解释型的编程语言>,即shell脚本<就是在用linux的s ...

  9. Linux和Shell教程

    文档资料参考: 参考:http://www.runoob.com/linux/linux-tutorial.html 软件下载参考: centos 下载地址:https://www.centos.or ...

随机推荐

  1. KVM之virsh管理虚拟机硬盘配置

    新建raw格式虚拟盘 [root@ubuntu ~]# qemu-img create -f raw /data/raw/disk02.raw 5G Formatting '/data/raw/dis ...

  2. linux设置密钥登录(只允许密钥登录)

    一.root用户使用这条命令看看家目录有没有(.ssh文件夹),cd .ssh,如果存在就会进入这个文件夹,不存在就(makedir .ssh),修改.ssh这个文件夹权限(chmod 700 .ss ...

  3. 搭建一个jumpserver跳板机

    1,部署jumpserver 建立阿里云公网源yum仓库 清除缓存重新建立缓存 ip后面直接回车,下面输入y 地址端口账户密码直接回车 ,询问跳过输入y,是否继续输入y 用户名回车,输入自己要设置的密 ...

  4. 队列(queue)和堆栈(stack)的学习

    队列 1 . 先进先出  .队列尾进行插入,队列头进行删除,获取,修改.      -----first come  ,first served .   --first in  .first  out ...

  5. python_网络编程struct模块解决黏包问题

    为什么会出现黏包现象: 首先只有在TCP协议中才会出现黏包现象,是因为TCP协议是面向流的协议,在发送的数据传输的过程中还有缓存机制来避免数据丢失,因此,在连续发送小数据的时候,以及接收大小不符的时候 ...

  6. ln -s /usr/local/jdk1.8.0_201/bin/java /bin/java

    ln -s /usr/local/jdk1.8.0_201/bin/java /bin/java

  7. Junit加载Spring容器作单元测试

    阅读目录 > 基本的搭建 > 常见的用法 如果我们需要对我们的Service方法作单元测试,恰好又是用Spring作为IOC容器的,我们可以这么配置Junit加载Spring容器,方便做单 ...

  8. easyui-filebox上传文件或图片时选择相同文件无法触发change事件的问题

    其实很简单,当选择完一个文件之后,会将文件名存放在input中的value值中,当下一次onChange之后,比对玩发现,value值没有发生变化,所以不能触发. 所以,只需要下次将value值清空就 ...

  9. 【JUC系列第一篇】-Volatile关键字及内存可见性

    作者:毕来生 微信:878799579 什么是JUC? JUC全称 java.util.concurrent 是在并发编程中很常用的实用工具类 2.Volatile关键字 1.如果一个变量被volat ...

  10. P4160 [SCOI2009]生日快乐 搜索

    思路:无脑搜索 提交:1次 题解: 大力搜索,枚举每个状态\((x,y,l)\)(\(x\)指分配到的长(可能比\(y\)要短),\(y\)指分配到的宽(可能比\(x\)要长),\(l\)指剩余切的次 ...