一起来学linux:shell script(二)关于脚本
(一)首先来看shell脚本的执行方式,shell脚本的后缀名都是sh文件。
1 sh test.sh
2 source test.sh
这两种方式有什么区别呢。test.sh 里的脚本很简单, 从键盘输入名字后赋值个name变量
read -p “Please input your name:” name
执行如下
root@zhf-linux:/home/zhf/zhf/shell_prj# sh test1.sh
please input your name:zhf
root@zhf-linux:/home/zhf/zhf/shell_prj# echo $name
echo $name是空值。原因前面介绍过。bash在执行脚本的时候,是另起一个子进程。当子进程完成后,子进程内的变量不会传入父进程中去
但是用source执行脚本就不一样了。 原因在于source对script的执行方式是在父进程中进行的。
root@zhf-linux:/home/zhf/zhf/shell_prj# source test1.sh
please input your name:zhf
root@zhf-linux:/home/zhf/zhf/shell_prj# echo $name
zhf
在脚本中,避免不了要进行各种条件判断。条件判断有test 和[]两种方式
test方式:
read -p "please input your name:" name
test -z $name && echo "you must input your name"
-z 是判断字符串是否为0也就空字符串,如果是,则提示输入名字
root@zhf-linux:/home/zhf/zhf/shell_prj# sh test1.sh
please input your name:
you must input your name
test有很多判断参数,具体可以用man test的进行查看
[]方式:
read -p "please input your name:" name
[ -z "$name" ] && echo "please input your name"
使用[]有几点需要注意:
1 在中括号内的每个组件都需要有空格键来分隔
2 在中括号内的变量都需要用双引号起来
关于第二点,如果不用双引号括起来,会引起如下问题:
root@zhf-linux:/home/zhf/zhf/shell_prj# name="cq zhf"
root@zhf-linux:/home/zhf/zhf/shell_prj# [ $name == "cq zhf" ]
bash: [: too many arguments
原因在于$name=cq zhf, 如果没有双括号,那么上面的不等式就等于 cq zhf == “cq zhf”。系统会认为是2个变量,因此提示too many arguments.
(二)script的变量。
在执行脚本的时候,会传入某些参数。那么在脚本里面如何监控这些参数呢
$#代表参数的个数
$@得到全部的参数
$1,$2…..代表的是各个参数。其中$0是指的脚本名称。
root@zhf-linux:/home/zhf/zhf/shell_prj# sh test1.sh one two three
The scritp name is test1.sh
The total number of parameter is 3
The first parameter is one
如果输入的变量太多,单从顺序上去记忆也比较麻烦,有一种参数偏移的方法可以省事一些。shift命令。这个命令的作用好比是一个FIFO的栈。
root@zhf-linux:/home/zhf/zhf/shell_prj# sh test1.sh one two three
The scritp name is test1.sh
The total number of parameter is 3
The first parameter is one
The first parameter is two
其他流程控制语句,例如if, when, for...do...done等都和其他语言用法类似。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架