当你面试的时候,可能要说的架构什么都准备好了,也说的七七八八,结果到最后问了一些基础的问题答不上来或者没想起来就很容易造成社会性死亡,一个没答上来道心被破,后面就更容易懵逼了
通常造成这个问题的原因是写脚本的频率和方法,也许对于一个常年工作的人,写脚本的频率是几月写一次,相似的场景复用旧脚本修改,时间长了不注意有的基础就忘了,但是面试的时候面试者可能近期有写脚本或者随手一搜shell基础或者随口一提
所以预计分几篇对这些可能问但有的不常用的shell基础问题进行汇总,这篇文章主要总结了$的相关含义以及具体的应用场景
大致的功能基本是用于向脚本内传递参数,就是说写一个传递参数的脚本,用于执行脚本内的某项功能,这种传参数类的脚本通常是多功能性的,常和函数或者case搭配使用。一般来说配置的越复杂,使用的传参类型越多的脚本,适应的环境或功能越复杂,常见于第三方公司或者某些公司为客户提供以便于用户使用、开源项目或者外挂式脚本(通过网页请求和参数后即可完成某项任务,例如某些病毒以此原理访问即会下载并传播)
而备份,还原,部署,定时任务等只需要完成某一项任务的脚本中通常很少见到$# $@ $*
示例:
/bin/sh test.sh hook
sh test.sh hook#!/bin/bash
echo $#
返回值为:
1代表你执行脚本的时候输入了一个参数,$#可用于判断执行该脚本时是否输入了参数,如果输入了参数执行脚本中该参数代表功能,如果没输入参数执行默认的设置或不执行
sh test.sh 1 2 3 4 5 6#!/bin/bash
echo $@
echo "$@"
echo "+++++++++++++++++++"
for i in "$@"
doecho $i
done
返回值为:
1 2 3 4 5 6
1 2 3 4 5 6
+++++++++++++++++++
1
2
3
4
5
6$@会把你执行脚本后面输入的参数都列出来,有文档说加双引号后,可能输出的结果不同,但经过Centos7.9和ubuntu18.04的测试,列出的数量限制和格式都没区别
$@传递参数时是把每一个参数都分开传了一次
sh test.sh 1 2 3 4 5 6#!/bin/bash
echo $*
echo "$*"
echo "+++++++++++++++++++"
for i in "$*"
doecho $i
done
返回值为:
1 2 3 4 5 6
1 2 3 4 5 6
+++++++++++++++++++
1 2 3 4 5 6$*也会把你执行脚本后面输入的参数都列出来,有文档说加双引号后,可能输出的结果不同,但经过Centos7.9和ubuntu18.04的测试,列出的数量限制和格式也都没区别
$*传递参数时是把所有参数当作了一个字符串
sh test.sh #!/bin/bash
echo $0
返回值为:
test.sh这个相较于前3个常用,常见于提示性内容的输出中。
当你没输入参数或者输入没有的参数时,进行提示。usage: sh $0 check|start|stop|restart
sh test.sh running 1 #!/bin/bash
echo $1
echo $2
返回值为:
running
1这个最常见和显而易见的,会根据第几个参数执行对应的命令。
通常用于输入多个参数后,当判断第一个参数是某个任务后,之后的参数配合前一个参数的任务进行补充性的执行,常见于部署或启动关闭服务等脚本。示例:sh online.sh stop 3 ,假设这是一个主要是上线相关功能的脚本,意思是执行关闭任务,关闭第3个节点
sh test.sh running 1 #!/bin/bash
echo $$
返回值为:
2913这个是返回执行这个脚本时的pid,实际应用只能说大多数人用的都很浅,用于提示性内容的输出,例如 脚本执行完成,返回个成功提示,告诉你服务启动完成,当前pid是XXX谁有获得pid后,后续又用其完成某项功能的 可以评论区投稿
sh test.sh #!/bin/bash
ls fuck1241d.txt
echo $?
返回值为:
2
因为实际没有这个文件,返回值不为0这个是最常用的$参数,常见大多数shell脚本,在shell脚本的实际应用为在执行某个命令后,判断是否成功或者失败,然后再根据成功或失败的反馈,执行不同情况的相应的命令。示例,yum安装某个软件,如果安装失败后,会通过wget或url等别的方式去再安装。
$- 显示 Shell 使用的当前选项
虽然有这个的解释,但是简直无法想象生产里实际用到这个或者问这个问题的是什么人,谁实际生产有使用到这个,可以评论区贴地址,大家去观摩一下