shell中的传递参数$0 / $n、shell运算符(算术/关系/布尔/字符串/文件测试)、echo 命令输出字符串、printf 命令输出格式化的字符串、test 命令检查某条件是否成立
一、传递参数
1、在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。
n 代表一个数字,0 为执行的文件名,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推
#以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):
#!/bin/bash
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
为脚本设置可执行权限,并执行脚本,输出结果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
# 结果
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
2、其他特殊符号:
$# 传递到脚本的参数个数、$* 或 $@ 所有向脚本传递的参数、$$ 脚本运行的当前进程ID号、$! 后台运行的最后一个进程的ID号、
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
二、shell 运算符
1、算术、关系、布尔、字符串、文件测试运算符。
2、原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
#两个数相加(注意使用的是反引号 ` 而不是单引号 ')
#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"
两点注意:
(1)表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
(2)完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
3、算术运算符:
#假定变量 a 为 10,变量 b 为 20:
`expr $a + $b` #30
`expr $a - $b` #-10
`expr $a \* $b` # 200
`expr $b / $a` # 2
`expr $b % $a` #0 取余
a=$b # 赋值 - 将把变量 b 的值赋给 a
[ $a == $b ] # false - == 相等。用于比较两个数字,相同则返回 true
[ $a != $b ] # true - != 不相等。用于比较两个数字,不相同则返回 true
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
4、关系运算符:关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
-eq 检测两个数是否相等,相等返回 true。
-ne 检测两个数是否不相等,不相等返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。
5、布尔运算符 —— ! 非运算、-o 或运算、-a 与运算
6、逻辑运算符 —— && 逻辑的 AND、|| 逻辑的 OR
7、字符串运算符:
= 检测两个字符串是否相等、 != 检测两个字符串是否不相等、
-z 检测字符串长度是否为0,为0返回 true、 -n 检测字符串长度是否不为 0
$ 检测字符串是否为空,不为空返回 true
8、文件测试运算符:用于检测 Unix 文件的各种属性。
-e 判断对象是否存在
-d 判断对象是否存在,并且为目录
-f 判断对象是否存在,并且为常规文件
-L 判断对象是否存在,并且为符号链接
-h 判断对象是否存在,并且为软链接
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-w 判断对象是否存在,并且可写
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-nt 判断file1是否比file2新 [ "/data/file1" -nt "/data/file2" ]
-ot 判断file1是否比file2旧 [ "/data/file1" -ot "/data/file2" ]
三、echo 命令 - 用于字符串的输出
#显示普通字符串:
echo "It is a test"
#显示转义字符:
echo "\"It is a test\""
1、显示变量:read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量
#!/bin/sh
read name
echo "$name It is a test"
#以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:
[root@www ~]# sh test.sh
OK #标准输入
OK It is a test #输出
2、-e 用于开启转义
#显示换行
echo -e "OK! \n" # -e 开启转义 \n 换行
#显示不换行
echo -e "OK! \c" # -e 开启转义 \c 不换行
3、显示结果定向至文件
echo "It is a test" > myfile
4、原样输出字符串,不进行转义或取变量(用单引号)
echo '$name\"'
#输出结果:
$name\"
5、显示命令执行结果
echo `date`
#注意: 这里使用的是反引号 `, 而不是单引号 '。
#结果将显示当前日期
四、printf 命令
printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。
printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认的 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
1、printf 命令的语法:printf format-string [arguments...]
- format-string: 为格式控制字符串
- arguments: 为参数列表。
2、我来用一个脚本来体现 printf 的强大功能:
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
#执行脚本,输出结果如下所示:
姓名 性别 体重kg
郭靖 男 66.12
杨过 男 48.65
郭芙 女 47.99
%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中 .2 指保留2位小数。
五、test 命令
1、Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
2、Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。例如
cd /bin
if test -e ./notFile -o -e ./bash
then
echo '至少有一个文件存在!'
else
echo '两个文件都不存在'
fi
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2020-08-19 如何编写 Dockerfile 文件创建 Docker 镜像
2019-08-19 Vue项目预渲染机制
2019-08-19 nuxt项目服务端渲染应用部署、使用pm2守护进程及遇到的问题处理
2017-08-19 Java的JDBC事务详解
2017-08-19 常用sql函数:COALESCE()进行空值处理、greatest函数和least函数