Linux系统shell脚本(二)
一、Shell 中的 if 条件判断语句
基本语法结构
Shell 中的 if 语句用于根据条件执行不同的代码块,基本结构如下:
单分支
if [ 条件判断式 ];then命令
fi 或者if [ 条件判断式 ]then命令
fi
双分支
if [ 条件判断式 ]then命令
else命令
fi
多分支
if [ 条件判断式1 ]then命令
elif [ 条件判断式2 ]then 命令
...
...
else命令
fi
二、Shell 字符串详解
字符串的表示方式
字符串(String)就是一系列字符的组合。字符串是Shell编程中最常用的数据类型之一
字符串可以由单引号''
包围,也可以由""
包围,也可以不用引号,三种方式的区别
单引号字符串:
- 任何字符都会原样输出
- 变量引用无效
- 不能包含单引号(即使转义也不行)
双引号字符串:
- 变量会被解析为对应的值
- 可以包含转义的双引号
- 保留字符串中的空格
无引号字符串:
- 变量会被解析
- 不能包含空格
- 空格会被视为分隔符
#!/bin/bash
n=74
str1=c.biancheng.net$n
str2="shell \"Script\" $n"
str3='C语言中文网 $n'
echo $str1
echo $str2
echo $str3# 运行结果
c.biancheng.net74
shell "Script" 74
C语言中文网 $n
字符串长度获取
使用${#string}
格式获取字符串长度:
name="Shell"
echo ${#name} # 输出 5
字符串拼接
在 Shell 中无需运算符,直接拼接即可:
name="Shell"
version="5.1"
fullname="${name}${version}" # 结果为"Shell5.1"
description="${name} version: ${version}" # 结果为"Shell version: 5.1"#!/bin/bash
name="shell"
url="http://c.biancheng.net/shell/"
str1=$name$url #中间不能有空格
str1=$name":"$url
str2="$name $url" #如果被双引号包围,那么中间可以有空格,也可以出现别的字符串
str3="$name:$url"
str4="${name}Script:${url}Index.html" #在变量后加上字符串,需要给变量名加上大括号
字符串截取
按位置截取
${string:start:length}
:从左边第 start 位开始截取 length 个字符${string:start}
:从左边第 start 位开始截取到末尾${string:0-start:length}
:从右边第 start 位开始截取 length 个字符${string:0-start}
:从右边第 start 位开始截取到末尾
按字符截取
${string#*chars}
:从第一次出现 chars 的位置截取右边字符${string##*chars}
:从最后一次出现 chars 的位置截取右边字符${string%chars*}
:从第一次出现 chars 的位置截取左边字符${string%%chars*}
:从最后一次出现 chars 的位置截取左边字符
格式化输出 printf
printf 命令用于格式化输出,语法:printf "格式" "参数1" "参数2"...
常用格式符:
%s
:字符串%d
/%i
:十进制整数%f
:浮点数(可指定保留小数位数,如%.2f
)%%
:表示 % 本身- 说明:%s中的数字代表此替换符中的输出字符宽度,不足补空格,默认是右对齐,%-10s表示10个字符宽,-表示左对齐
常用转义符:
\n
:换行\t
:水平制表符\r
:回车
三、Shell脚本语言的运算
条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成测试过程,实现评估布尔声明,以便在条件性环境下进行执行。
若真,则状态码变量$?返回0
若假,则状态码变量$?返回1
语法格式 | 说明 | 适用场景 | 注意事项 | ||
---|---|---|---|---|---|
test <测试表达式> | 基础测试命令,兼容性强 | 简单条件判断,需兼容老式 Shell | 表达式与test 间必须有空格 | ||
[ <测试表达式> ] | test 命令的简化写法,POSIX 标准 | 多数脚本场景,兼顾兼容性 | 括号与表达式间必须有空格,不支持正则 | ||
[[ <测试表达式> ]] | Bash 增强语法,功能更丰富 | 复杂条件判断(如正则、模式匹配) | 仅支持 Bash,不兼容其他 Shell,支持&& /` | ` | |
((<测试表达式>)) | 整数专用测试语法 | 纯整数比较场景 | 仅支持整数,无需空格分隔,支持 C 风格运算符 |
文件测试:判断文件属性,如存在性、类型、权限等
-f file
:判断是否为普通文件-d dir
:判断是否为目录-e/-a path
:判断路径是否存在 文件是否存在-r file
:判断文件是否可读-w file
:判断文件是否可写-x file
:判断文件是否可执行
数值比较:用于整数之间的比较
-eq
:等于(equal)-ne
:不等于(not equal)-gt
:大于(greater than)-lt
:小于(less than)-ge
:大于等于(greater or equal)-le
:小于等于(less or equal)
字符串比较
==
或=
:字符串相等!=
:字符串不等-z string
:字符串长度为 0-n string
:字符串长度不为 0
关于()与 { }
( )和 { }都可以将多个命令组合再一次,批量执行,{ } 里的内容需要与两侧用空格隔开并在命令结尾加上;
( )会开启子shell,并且list中变量赋值及内部命令执行后,将不再影响后续的环境
{ } 不会开启子shell,在当前shell中运行,会影响当前shell环境
4.7 使用read命令命令来接受输入
read 是 Shell 内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据
4.7.1 语法结构
read [option] [variables] --options表示选项 --variables表示用来存储数据的变量,可以有一个,也可以有多个。 -- options和variables都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。
4.7.2 选项:
Option | 说明 |
---|---|
-a array | 把读取的数据赋值给数组array,从下标0开始 |
-d delimiter | 把字符串delimiter指定读取结束的位置,而不是一个换行符(读取的数据不包括delimiter) |
-e | 在获取用户输入的时候,对功能键进行编码转换,不会直接显示功能键对应的字符 |
-n num | 读取num个字符,而不是整行字符 |
-p prompt | 显示提示信息,提示内容为prompt |
-r | 原样读取(Raw mode),不会把反斜杠字符解释为转义字符 |
-s | 静默模式(Silent mode),不会再屏幕上显示输入的字符。例如:输入密码 |
-t seconds | 设置超时时间,单位为秒。如果用户没能按时完成,返回一个非0的退出状态 |
-u fd | 使用文件描述符fd作为输入源,而不是标准输入,类似于重定向 |