1.16字段分隔符和迭代器
内部字段分隔符(Internal Field Separator,IFS)是shell脚本编程的一个重要概念。下面将讨论把单个数据流划分成不同数据元素的定界符(delimiter),内部字段分隔符是用于特定用途的定界符。IFS是存储定界符的环境变量。它是当前shell环境默认使用的默认定界字符串。
1、考虑一种情形,我们需要迭代一个字符串或逗号分隔型数值(Comma Separated Value,CSV)中的单词。如果是前一种,则使用IFS=".";如果是后一种,则使用IFS=","。如下
考虑CSV数据的情形:
data="name,sex,rollno,location"
我们可以使用IFS读取变量中的每一个条目。
oldIFS=$IFS
IFS=, #now IFS为,
for item in $data;
do
echo Item: $item
done
IFS=$oldIFS
IFS的默认值为空白符(换行符、制表符或者空格)
2、在文件/etc/passwd中,每一行包含了由冒号分隔的多个条目。文件中的每行都对应一位用户的相关属性。
考虑这样的输入:root:x:0:0:root:/root:/bin/bash。每行的最后一项指定了用户的默认shell。利用IFS打印出用户以及他们对应的默认shell:
#!/bin/bash
#演示IFS的用法
line="root:x:0:0:root:/root:/bin/bash"
oldIFS=$IFS;
IFS=":";
count=0
for item in $line
do
[ $count -eq 0 ] && user=$item;
[ $count -eq 6] && shell=$item;
let count++;
done;
IFS=$oldIFS
echo $user\'s shell is $shell;
输出为
root's shell is /bin/bash
对一些列值进行迭代时,循环非常有用;
for 循环
for var in list;
do
commands;#使用变量$var
done
list 可以是一个字符串,也可以是一个序列。
echo {1..50}能够生成一个从1~50的数字列表。同理echo {a..z}或{A..Z}或{a..h}可以生成子母表。
变量i在每次迭代的过程中都会保存一个字符,范围从a~z;
for i in {a..z};do actions;done;
for循环也可以采用C语言的for格式:
for(i=0;i<10;i++)
commands;#使用变量$i
while循环
while condition
do
commands;
done
用true作为循环条件能够产生无限循环。
until循环
在bash中还可以使用一个特殊的循环until。它会一直执行循环,直到给定的条件为真。
如
x=0;
until [ $x -eq 9 ];#条件是[ $x -eq 9 ]
do
let x++;
echo $x;
done
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】