Linux | shell for 循环 2

2023-04-30  本文已影响0人  iBioinformatics

https://www.cnblogs.com/gx-303841541/archive/2012/10/24/2737814.html
https://blog.csdn.net/hedao0515/article/details/124756574
https://blog.csdn.net/weixin_42017004/article/details/124830685
https://www.jb51.net/article/186134.htm

1、读取列表中的值

#!/bin/bash
#basic for command

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

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命令用空格来划分列表中的每个值。如果在单独的数据值中有空格,就必须用双引号将这些值圈起来。

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

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

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字符解析数据没有任何限制。

6、用通配符读取目录

for file in /proc/*;
do
     echo $file is file path \! ;
done

7、类C风格for循环的语法格式

for((expr1; expr2; expr3))
do
     command
     command
     ...
done

有些部分并没有遵循bash shell标准的for命令:

输出前5个正数

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

8、循环嵌套

start=0
end=5
a=(300 400 1000 6000 7500)
for ((j=${start};j<=${end};j+=1))
do
    for ((i=${start};i<=${anumber};i+=1))
    do
        newfile="NVME"$j"_PE"${a[$i]}
    done
done
for i in {4..9}
do
    for j in {10..16}
    do
    echo $i $j
    done
done    

总结

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

有两种方式可以将命令输出赋值给变量:
(1)反引号字符(`)
(2)$()格式

补充:在列表构成上分多种情景,如数字列表、字符串列表、命令列表、脚本传参列表等!

上一篇下一篇

猜你喜欢

热点阅读