Shell 语言作为类 Unix 系统的原生脚本,有着非常实用的价值。但对于很多刚刚接触 Shell 脚本的同学来说,搞懂 Shell 语言的语法却是一件非常困难的事情。甚至有人吐槽,或许没有谁能清楚地说明白 Shell 的语法。

例如下面这两个 Shell 脚本:

#!/bin/bash
a=10
if [ $a = 10 ]
then
echo "a is 10"
else
echo "a is not 10"
fi
#!/bin/bash
a=10
if [$a = 10 ] # $a 前没有加空格,非法
then
echo "a is 10"
else
echo "a is not 10"
fi

这两个脚本的区别只是 if 中的判断表达式,一个有空格,一个没有空格而已。但在 Shell 语法中,第二个没有在$a前加空格的脚本是非法的。再举一个例子:

a=10
a = 10

在我们看来这两个表达式没有什么区别嘛,都是给 a 变量赋值 10。但实际上在 Shell 语法中,第一个表达式a=10表示赋值,第二个表达式a = 10表示判断(判断 a 是否等于 10)。

又例如 Shell 中我们要进行数学运算,其实有很多种方式可以实现,例如:

#!/bin/bash
a=`expr 10 + 5`
echo $a

当然了,你还可以这么写:

#!/bin/bash
let a=10+5
echo $a

这两种方式都可以实现简单的数学运算。但相比这两种,我更推荐用下面这种形式:

(( a = 10 + 5 ))
echo $a

即将需要运算的内容放在两对中括号里面。因为这种方式更加简洁,并且功能也是最为完整,也是最为接近高级语言的写法。

正是因为 Shell 中的语法问题以及实现的多样性,许多初学者(包括我)都会对 Shell 语法感到迷惑。因此我有了写一个 Shell 快速入门系列的想法。

写作思路

为了能快速上手 Shell 语法,在很多时候我会对一些不是很重要的内容进行舍弃。这些内容则会作为补充内容在后续的文章中说明。例如在 Shell 中有许多种循环结构:for 循环、while 循环、util 循环,但实际上 while 循环和 until 循环基本上是一样的。在这种情况下我舍弃对于 until 循环这个语法的介绍。

例如在 Shell 中进行数学运算有很多种方式,可以使用-eq操作符,可以使用==操作符,可以使用=操作符、可以使用(())操作符等等。这个时候我也会进行取舍,取一种最简单、最通用的语法来实现。舍弃一些复杂的语法并不会影响我们使用 Shell 语言,反而会让我们更快入手。

这是本系列跟其他 Shell 入门教程的最大不同,即以快速入手为目的,并不追求大而全。对于入门系列的文章,目前写了大概十四篇。每篇文章阅读不会超过 10 分钟,每个知识点都有相应的代码可以运行,确保小白都能看得懂。

我觉得这种系列学习的文章并不适合放在公众号里发表,所以公众号的朋友可以通过我的个人博客:http://shuyi.me 来查看。

知识体系

那如果我想要用到更高级的语法怎么办?我的思路是直接搜索资料或者到下面的文章中看看。下面的文章是快速入门的延续,但是是较为高级的用法,我会根据我自身情况不断地增加内容,构建起 Shell 整套体系。希望在不久的将来,这一系列入门教程能够覆盖大多数的应用情况。

如果你有想补充的知识点,欢迎关注我的微信公众号,回复入群与我交流。

如果你想了解高级的用法,可以看下面的这些文章:

更新

  • 2018-07-04 08:23:40 更新。因为每篇的篇幅很短,不适合在博客园发表,所以需要看的可以点击链接到我的博客看。
  • 2018-07-05 20:23:27 更新。这个系列写完之后发现还是有许多写得不好的地方,后续会不断进行再写。大家有什么问题都可以留言,或者通过我的公众号加入微信群交流。
  • 2018-07-05 21:43:12 更新:完善了输出重定向章节。

最新文章

  1. silverlight中Combox绑定数据以及动态绑定默认选定项的用法
  2. psql-03数据类型(1)
  3. DB2 中将date类型的转换成timestamp
  4. WebClient.UploadValues Post中文乱码的解决方法
  5. Swift: Initialization-2
  6. AvalonEdit 移除自身ScrollViewer (可配合外部自定义ScrollViewer 使用)
  7. Mac实用技巧
  8. CSS随记
  9. CSharp Oracle 登陆
  10. nginx的5个特点
  11. 线性表的顺序存储结构的实现及其应用(C/C++实现)
  12. redis安装、测试&集群的搭建&踩过的坑
  13. Kafka,Mq,Redis作为消息队列使用时的差异?
  14. 在iOS 开发中用GDataXML(DOM方式)解析xml文件
  15. 网站运维之JAVA-SSH框架数据同步问题
  16. Laravel - Opening Multiple Projects
  17. Quartz教程三:Job与JobDetail介绍
  18. POJ 1087
  19. ES6 常用1
  20. 自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)

热门文章

  1. 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit
  2. TestFlight
  3. Emmet使用
  4. 【转】Eclipse里项目名有红叉,但是展开后里面又没有红叉叉
  5. CDH自己安装方式Hbase master备份方式
  6. asp.net 客户端上传文件全路径获取方法
  7. 【WP8】扩展CM的WindowManager
  8. 李洪强-C语言6-控制结构
  9. POJ 2887 Big String (块状数组)
  10. 使用ibatis时 sql中 in 的参数赋值
  11. SimpleDateFormat使用简析
  12. [转] 用source命令执行脚本和用sh执行脚本之间的区别
  13. poj 2251 Dungeon Master(bfs)
  14. mac环境破解navicat premium 12.1
  15. /etc/rc.d/init.d/iptables: No such file or directory 错误原因
  16. Angular2 CLI安装
  17. vue-awesome-swiper
  18. SQL 按照多个字段为标准的重复数据处理
  19. svg基础知识体系建立
  20. 巧用 git rebase 将某一部分 commit 复制到另一个分支