008.分隔符、循环、比较

1、字段分隔符与迭代器

内部字段分隔符(Internal Field Separator,IFS)是shell脚本编程中的一个重要概念。在处理文本数据时,它的作用可不小。

作为分隔符,IFS有其特殊用途。它是一个环境变量,其中保存了用于分隔的字符。它是当前shell环境使用的默认定界字符串。

考虑一种情形:我们需要迭代一个字符串或逗号分隔型数值(Comma Separated Value,CSV)中的单词。如果是前者,可以使用IFS=" ";如果是后者,则使用IFS=","。

#!/bin/bashdata="name,gender,rollno,location"oldIFS=$IFS
IFS=,
for item in $data;
doecho Item: $item
done
IFS=$oldIFS

  • IFS的默认值为空白字符(换行符、制表符或者空格)。
  • 当IFS被设置为逗号时,shell将逗号视为一个定界符,因此变量$item在每次迭代中读取由逗号分隔的子串作为变量值。
  • 如果没有把IFS设置成逗号,那么上面的脚本会将全部数据作为单个字符串打印出来。

案例:

以/etc/passwd为例,看看IFS的另一种用法。在文件/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/shell
2、循环
a. for循环
# 面向列表的for循环
for var in list;
docommands; # 使用变量$var
done
  • list可以是一个字符串,也可以是一个值序列。

我们可以使用echo命令生成各种值序列:

echo {1..50};   			 # 生成一个从1~50的数字序列
echo {a..z} {A..Z};    # 生成大小写字母序列# 量i在每次迭代的过程里都会保存一个范围在a到z之间的字符:
for i in {a..z}; do actions; done;

迭代指定范围的数字:

for((i=0;i<10;i++))
{command; # 使用变量$i
}
b. while循环

当条件为真时,while循环继续执行;当条件不为真时,until循环继续执行。

while condition
docommands;
done
c. until循环

在Bash中还可以使用一个特殊的循环until。它会一直循环,直到给定的条件为真。

x=0;
until [ $x -eq 9 ];		# 条件是[$x -eq 9]
dolet x++; echo $x;
done
3、比较与测试

程序中的流程控制是由比较语句和测试语句处理的。Bash能够执行各种测试。我们可以用if、ifelse以及逻辑运算符来测试,用比较运算符来比较数据项。除此之外,还有一个test命令也可以用于测试。

if条件:

if condition;
thencommands;
fi

else if 和 else

if condition;
thencommands;
else if condition; 
thencommands;
elsecommands;
fi
a. 文件测试

可以使用不同的条件标志测试各种文件系统相关的属性:

[ -f $var ]

如果给定的变量包含正常的文件路径或文件名,则返回真。

[ -x $var ]

如果给定的变量包含的文件可执行,则返回真。

[ -d $var ]

如果给定的变量包含的是目录,则返回真。

[ -e $var ]

如果给定的变量包含的文件存在,则返回真。

[ -c $var ]

如果给定的变量包含的是一个字符设备文件的路径,则返回真。

[ -b $var ]

如果给定的变量包含的是一个块设备文件的路径,则返回真。

[ -w $var ]

如果给定的变量包含的文件可写,则返回真。

[ -r $var ]

如果给定的变量包含的文件可读,则返回真。

[ -L $var ]

如果给定的变量包含的是一个符号链接,则返回真

#!/bin/bash
fpath="/etc/passwd"
if [ -e $fpath ]; 
thenecho File exists;
elseecho Does not exist;
fi
b. 字符串测试

进行字符串比较时,最好用双中括号,因为有时候采用单个中括号会产生错误。

注意:双中括号是Bash的一个扩展特性。如果出于性能考虑,使用ash或dash来运行脚本,那么将无法使用该特性。

注意:在=前后各有一个空格。如果忘记加空格,那就不是比较关系了,而是变成了赋值语句。

测试两个字符串是否相同:

# 当str1等于str2时,返回真。也就是说,str1和str2包含的文本是一模一样的。
[[ $str1 = $str2 ]]# 这是检查字符串是否相同的另一种写法。
[[ $str1 == $str2 ]]

检测两个字符串是否不相等:

# 如果str1和str2不相同,则返回真
[[ $str1 != $str2 ]]

找出在字母表中靠后的字符串:字符串是依据字符的ASCII值进行比较的。例如,A的值是0x41,a的值是0x61。因此,A小于a,AAa小于Aaa。

# 如果str1的字母序比str2大,则返回真。
[[ $str1 > $str2 ]]# 如果str1的字母序比str2小,则返回真。
[[ $str1 < $str2 ]]

测试空串:

# 如果str1为空串,则返回真。
[[ -z $str1 ]]# 如果str1不为空串,则返回真。
[[ -n $str1 ]]
c. test命令测试

test命令可以用来测试条件。用test可以避免使用过多的括号,增强代码的可读性。之前讲过的[]中的测试条件同样可以用于test命令。

if  [ $var -eq 0 ]; then echo "True"; fi
☟
if  test $var -eq 0 ; then echo "True"; fi

注意,test是一个外部程序,需要衍生出对应的进程,而 [ 是Bash的一个内部函数,因此后者的执行效率更高。test兼容于Bourne shell、ash、dash等。

------------------------------------

4、运算符
a. 逻辑运算符

&&是逻辑与运算符,||是逻辑或运算符。编写Bash脚本时,这是一个很有用的技巧。

[ condition ] && action; # 如果condition为真,则执行action
[ condition ] || action; # 如果condition为假,则执行action

-a是逻辑与操作符,-o是逻辑或操作符。可以按照下面的方法结合多个条件进行测试:

[ $var1 -ne 0 -a $var2 -gt 2 ]    #使用逻辑与-a
[ $var1 -ne 0 -o $var2 -gt 2 ]    #逻辑或-o

使用逻辑运算符 && 和 || 能够很容易地将多个条件组合起来:

if [[ -n $str1 ]] && [[ -z $str2 ]];
thencommands;
fi
#!/bin/bashstr1="Not empty"
str2=""
if [[ -n $str1 ]] && [[ -z $str2 ]];
thenecho str1 is nonempty and str2 is empty string.
fi
b. 算术运算符

比较条件通常被放置在封闭的中括号内。一定要注意在[或]与操作数之间有一个空格。如果忘记了这个空格,脚本就会报错:[$var -eq 0 ] or [ $var -eq 0]

对变量或值进行算术条件测试:

[ $var -eq 0 ]    #当$var等于0时,返回真
[ $var -ne 0 ]    #当$var不为0时,返回真
  • -gt:大于。
  • -lt:小于。
  • -ge:大于或等于。
  • -le:小于或等于

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/176856.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【学习笔记】Understanding LSTM Networks

Understanding LSTM Networks 前言Recurrent Neural NetworksThe Problem of Long-Term DependenciesLSTM Networks The Core Idea Behind LSTMsStep-by-Step LSTM Walk ThroughForget Gate LayerInput Gate LayerOutput Gate Layer Variants on Long Short Term MemoryConclus…

2.3.5 交换机的VRRP技术

实验2.3.5 交换机的VRRP技术 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.交换机的基本配置 六、任务验收七、任务小结 一、任务描述 某公司的网络核心层原来采用一台三层交换机&#xff0c;随着网络应用的日益增多&#xff0c;对网络的可靠性也提出了越来…

SpringBoot写接口小记 以及 几个层的功能总结(自用 勿喷)

目录 Entity层&#xff1a;实体层 数据库在项目中的类 Mapper层&#xff1a; 持久层 主要与数据库进行交互 Service层&#xff1a;业务层 控制业务 Controller层&#xff1a;控制层 控制业务逻辑 Entity层&#xff1a;实体层 数据库在项目中的类 Entity层是实体层&#xff…

软路由R4S+iStoreOS实现公网远程桌面局域网内电脑

软路由R4SiStoreOS实现公网远程桌面局域网内电脑 文章目录 软路由R4SiStoreOS实现公网远程桌面局域网内电脑简介 一、配置远程桌面公网地址配置隧道 二、家中使用永久固定地址 访问公司电脑具体操作方法是&#xff1a;2.1 登录页面2.2 再次配置隧道2.3 查看访问效果 简介 上篇…

线性代数本质系列(一)向量,线性组合,线性相关,矩阵

本系列文章将从下面不同角度解析线性代数的本质&#xff0c;本文是本系列第一篇 向量究竟是什么&#xff1f; 向量的线性组合&#xff0c;基与线性相关 矩阵与线性相关 矩阵乘法与线性变换 三维空间中的线性变换 行列式 逆矩阵&#xff0c;列空间&#xff0c;秩与零空间 克莱姆…

Sectigo SSL

Sectigo&#xff08;前身为ComodoCA&#xff09;是全球在线安全解决方案提供商和全球最大的证书颁发机构。为了强调其在SSL产品之外的扩张&#xff0c;Comodo在2018年更名为Sectigo。新名称减少了市场混乱&#xff0c;标志着公司向创新的全方位网络安全解决方案提供商过渡。 S…

软件工程——名词解释

适用多种类型的软件工程教材&#xff0c;有关名词释义的总结较为齐全~ 目录 1. 软件 2. 软件危机 3. 软件工程 4. 软件生存周期 5. 软件复用 6. 质量 7. 质量策划 8. 质量改进 9. 质量控制 10. 质量保证 11. 软件质量 12. 正式技术复审 13. ISO 14. ISO9000 15.…

Python开源项目DifFace——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

无论是自己、家人或是朋友、客户的照片&#xff0c;免不了有些是黑白的、被污损的、模糊的&#xff0c;总想着修复一下。作为一个程序员 或者 程序员的家属&#xff0c;当然都有责任满足他们的需求、实现他们的想法。除了这个&#xff0c;学习了本文的成果&#xff0c;或许你还…

高德地图系列(四):vue项目利用高德地图实现车辆的路线规划

目录 第一章 效果图 第二章 源代码 第一章 效果图 小编该案例主要实现的两个点的思路&#xff1a;1、有两个正常的经纬度就可以在地图中绘制出汽车从起点到终点的路线规划&#xff1b;2、当用户经纬度发生变化时&#xff0c;用户可以通过某个操作&#xff0c;或者程序员通过…

ubuntu操作系统的docker更换存储目录

前言 要将Docker的存储目录更改为/home/docker&#xff0c;你需要进行以下步骤&#xff1a; 目录 前言1、停止Docker服务2、创建新的存储目录3、编辑Docker配置文件4、启动Docker服务5、验证更改 1、停止Docker服务 首先停止Docker守护进程&#xff0c;可以使用以下命令&…

C#中.NET Framework 4.8控制台应用通过EF访问已建数据库

目录 一、创建.NET Framework 4.8控制台应用 二、建立数据库 1. 在SSMS中建立数据库Blogging 2.在VS上新建数据库连接 三、安装EF程序包 四、自动生成EF模型和上下文 1.Blog.cs类的模型 2.Post.cs类的模型 3.BloggingContext.cs数据库上下文 五、编写应用程序吧 我们…

CCNA课程实验-13-PPPoE

目录 实验条件网络拓朴需求 配置实现基础配置模拟运营商ISP配置ISP的DNS配置出口路由器OR基础配置PC1基础配置 出口路由器OR配置PPPOE拨号创建NAT(PAT端口复用) PC1测试结果 实验条件 网络拓朴 需求 OR使用PPPoE的方式向ISP发送拨号的用户名和密码&#xff0c;用户名&#xf…