每日Linux学习:Shell脚本中的内置变量($0,$1~$9,$?,$*,$@等)

Shell脚本内置变量用法浅析和注意事项

Shell脚本这东西,实则挺有用,许多时候要用到,它有一些自带的变量,挺重大的,得知道。

脚本自身的名字,还有路径,可以用`$0`拿到,写日志的时候可以用上,方便知道哪个脚本出的问题,还有显示协助信息,也挺好的,至少知道自己在干嘛。

`$1`到`$9`,是参数,脚本后面跟的那些东西,挨个对应,超过9个参数,得用`${10}`这种写法,不然就乱套了,大家都在想,这到底是怎么一回事,参数超过9个,处理起来的确 麻烦,一不小心就搞错了。

`$`这个是参数的个数,可以用来检查参数够不够,少了参数就报错,不然脚本跑起来也容易出问题。

上一条命令有没有执行成功,看`$?`,0就是成功了,不是0就是失败了,失败了肯定有缘由,得看看,错误处理的时候,这个很重大,不然都不知道哪里错了。

`$$`是当前脚本的进程ID,可以用来生成临时文件名,避免冲突,进程监控的时候也能用到,这个东西还挺重大的。

`$!`是最近一个放到后台跑的命令的进程ID,异步任务管理的时候用,有些任务不用等它跑完,就可以先放到后台,用这个可以监控它。

`$*`是把所有参数弄成一个字符串,用空格隔开,参数本身如果带有空格,就容易出问题,这里要小心,大家都在想,这到底是怎么一回事。

`$@`也是所有参数,但是它把每个参数当成一个独立的字符串,就算参数有空格,也能正确处理,这个就好多了,至少不会出问题。

<img src="https://img.dunling.com/blogimg/20251214/70520a287f6d4a7fa0df79fa15c8423d.jpg" alt="每日Linux学习:Shell脚本中的内置变量(每日Linux学习:Shell脚本中的内置变量($0,$1~$9,$?,$*,$@等),src=”https://p3-sign.toutiaoimg.com/tos-cn-i-axegupay5k/b813d08906d7402c8084a2a929163eef~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1766278255&x-signature=O9vHiZfhCLEet1UHexLzNc8fyo8%3D”~$9,$?,$*,$@等)”>,https://p3-sign.toutiaoimg.com/tos-cn-i-axegupay5k/b813d08906d7402c8084a2a929163eef~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1766278255&x-signature=O9vHiZfhCLEet1UHexLzNc8fyo8%3D~$9,$?,$*,$@等)” title=”每日Linux学习:Shell脚本中的内置变量(<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" alt="每日Linux学习:Shell脚本中的内置变量(每日Linux学习:Shell脚本中的内置变量($0,$1~$9,$?,$*,$@等),src=”data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7″~$9,$?,$*,$@等)”>,https://p3-sign.toutiaoimg.com/tos-cn-i-axegupay5k/b813d08906d7402c8084a2a929163eef~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1766278255&x-signature=O9vHiZfhCLEet1UHexLzNc8fyo8%3D~$9,$?,$*,$@等)”>

`”$*”`和`”$@”`,用双引号括起来的时候,差别很大,`”$*”`还是一个字符串,`”$@”`还是参数列表,这个必定要记住,许多时候会搞错,许多人看完这个故事,都会去想。

参数校验,用`$`检查参数数量,不够就报错,不能随意跑,用`$1`这些拿到参数值,还得检查一下是不是合法,列如文件是不是存在,权限对不对,这些都要思考,不然脚本跑起来容易出错。

错误处理,`$?`判断命令执行结果,失败了就重试,或者报警,不同的错误码代表不同的问题,处理方式也不一样,这个要搞清楚,不然都不知道怎么处理。

日志记录,用`$0`记录脚本名,方便定位问题,出了问题也知道是哪个脚本,大家都知道,这挺重大的。

临时文件管理,用`$$`生成唯一文件名,避免并发脚本冲突,不然大家的文件都乱了,用`$!`监控后台进程状态,做复杂的流程控制,有些流程需要监控后台任务的状态。

自动化部署脚本,举个例子,`deploy.sh`,先检查参数,环境对不对,版本号是不是正确,然后做错误处理,用`if`语句结合内置变量,判断各种情况,这个挺常见的。

参数数量不固定,可以用`shift`命令,动态调整参数列表,有些脚本参数数量不确定,这个挺有用的,不然没法处理。

内置变量可以和外部命令结合,像`awk`,`sed`这些,做复杂的数据处理,文本分析,功能会强劲许多,好多人都在用。

所有内置变量都是只读的,不能赋值,赋值会报错,这个必定要记住,不然会浪费时间,双引号很重大,必定要用双引号包裹`”$@”`,避免参数解析错误,由于空格可能会导致问题,掌握内置变量是写好Shell脚本的基础,健壮,灵活,许多脚本都需要用到这些知识。

<img src="https://img.dunling.com/blogimg/20251214/62d89b6fe00e4e20900c18fd0364a977.jpg" alt="每日Linux学习:Shell脚本中的内置变量(每日Linux学习:Shell脚本中的内置变量($0,$1~$9,$?,$*,$@等),src=”https://p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/0c555343be0044e1a113a2bd11a2a3ec~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1766278255&x-signature=g%2BgsPxz%2BoqbDL5v0CKwBdXFIqUg%3D”~$9,$?,$*,$@等)”>,https://p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/0c555343be0044e1a113a2bd11a2a3ec~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1766278255&x-signature=g%2BgsPxz%2BoqbDL5v0CKwBdXFIqUg%3D~$9,$?,$*,$@等)” title=”每日Linux学习:Shell脚本中的内置变量(<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" alt="每日Linux学习:Shell脚本中的内置变量(每日Linux学习:Shell脚本中的内置变量($0,$1~$9,$?,$*,$@等),src=”data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7″~$9,$?,$*,$@等)”>,https://p3-sign.toutiaoimg.com/tos-cn-i-6w9my0ksvp/0c555343be0044e1a113a2bd11a2a3ec~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1766278255&x-signature=g%2BgsPxz%2BoqbDL5v0CKwBdXFIqUg%3D~$9,$?,$*,$@等)”>

脚本出了问题,一般都是参数不对,或者权限不够,或者文件不存在,这些都要注意,大家都在想,问题出在哪里了,还得仔细检查,这个东西,说难不难,说简单也不简单,得用心去学,去实践,才能掌握,目前的人,要学的东西太多了,谁能受得了。

我之前写过一个脚本,用来备份数据库,用到了`$0`记录日志,用到了`$?`检查命令是否成功,用到了`$$`生成临时文件名,还用到了`$@`处理参数,当时也是踩了不少坑,才搞定的,这个东西,真是考验人,有时候觉得很简单,有时候又觉得很复杂,还得不断学习,不断进步,不然就要被淘汰了,目前技术更新太快了,谁能跟得上。

大家都觉得,写脚本很简单,但是要写好,写的健壮,写的灵活,就不容易了,得思考各种情况,还得注意细节,不然就容易出问题,有时候一个空格,一个引号,都会导致脚本跑不起来,这个东西,真是让人头疼,可是在那种环境下,谁能受得了,只能硬着头皮上,慢慢学习,慢慢积累经验,才能写出好的脚本。

许多时候,看别人的脚本,觉得很简单,但是自己写的时候,就发现各种问题,各种坑,还得慢慢填,慢慢解决,这个过程,真是让人崩溃,可是在那种情况下,谁能放弃,只能坚持下去,慢慢积累经验,才能写出好的脚本,目前的程序员,真是太难了,要学的东西太多了,还得不断加班,谁能受得了。

写脚本的时候,必定要注意代码风格,要写注释,要让别人能看懂,不然后来自己都看不懂,这个东西,真是让人头疼,可是在那种情况下,谁能怎么办只能硬着头皮写,慢慢积累经验,才能写出好的脚本,目前的程序员,真是太难了,要学的东西太多了,还得不断加班,所有人都觉得她后来不得了。

实则,脚本这东西吧,就是工具,用好了就能提高效率,用不好就浪费时间,关键是要掌握它的原理,理解它的用法,才能灵活运用,有些人觉得脚本很简单,但是真正用的时候,就发现各种问题,各种坑,还得慢慢填,慢慢解决,这个过程,真是让人崩溃,可是在那种情况下,谁能放弃,只能坚持下去,慢慢积累经验,才能写出好的脚本。

所以,学习Shell脚本,要从基础开始,掌握内置变量,理解常用命令,多看别人的脚本,多自己动手写,才能真正掌握,这个东西,真是让人头疼,可是在那种情况下,谁能怎么办只能硬着头皮写,慢慢积累经验,才能写出好的脚本,目前的程序员,真是太难了,要学的东西太多了,还得不断加班,所有人都觉得她后来不得了。

总而言之,Shell的内置变量是基础,参数的传递,状态的判断,ID的获取,都离不开它们,掌握了它们,才能写出更实用,更强劲的Shell脚本,许多人看完这个故事,都会去想。

© 版权声明

相关文章

1 条评论

  • 头像
    锦锦在悉尼 读者

    收藏了,感谢分享

    无记录
    回复