Shell 脚本和编程 | 青训营笔记

160 阅读1分钟

shell运算符和引用

这里仅列出一部分符号

类型符号作用用法
引号双引号 ""部分引用,仅$`\保留作用foo="${a}123"
引号单引号 ''完全引用,原样输出foo='foo$a'
引号反引号 ``执行命令foo=ls -a

可以发现shell中引号的用法与其它编程语言有着很大的不同,双引号与单引号存在语法上的区别,而非大多数常见的编程语言可以混用表示字符串。

管道

管道符 | 是shell中常用的一个符号,将前一个命令的结果传递至后面的命令,给予了shell编程足够的灵活性。但值得注意的是,管道右侧的命令必须能接受标准输入,比如grep命令,ls、mv等不能直接使用,但是可以通过xargs处理。xargs顾名思义,arguments,将标准输出解析为参数。

如:

#!/bin/bash 指定解释器路径

cat platform.access.log | grep ERROR

netstat -an | grep ESTABLISHED | wc -l # 显示有多少已建立的连接

find . -maxdepth 1 -name "*.sh" | xargs ls -l # 递归深度为1  列出以.sh为后缀的文件

重定向

标准输入、标准输出、标准错误输出

2>:错误输出写入文件 &>:标准输出与标准错误输输出到同一个文件。

判断命令

shell中提供了test、[[[三种判断符号,可用于:

  • 整数测试
  • 字符串测试
  • 文件测试

语法:

  • test condition
  • [ condition ]
  • [[ condition ]]

注意:中括号前后要有空格符

可以发现,这又是shell中非常别扭的一点,即空格是语法的一部分。在赋值符号前后不能有空格,在判断的中括号前后又需要有空格,可以说是让人非常迷惑了。现代编程语言基本舍弃了这一点,大多数时候空格都是可选的。

分支语句

可分为if语法与case语法。下面是if语法的格式:

if condition ; then
    program
elif condition ; then
    program
else
    program
fi

倒是与现代编程语言的if分支没有5太大的不同,除了需要用fi结束分支块。

函数

  • funcName(){ echo "abc"; }
  • function funcName() { echo "abc";}

注意return仅仅表示函数执行状态,不代表结果。返回结果一般通过echo printf等,在函数外使用$()取得。

执行过程

  1. 字符解析
    • 识别换行符、分号(;)做行的分割
    • 识别命令连接符做命令的分割
    • 识别空格、tab符,做命令和参数的分割。
  2. shell展开
  3. 重定向
  4. 执行
  5. 收集状态并返回

总结

shell的语法多且繁杂,又与现代编程语言有着一定的出入,但在系统编程方面shell又有着一定的优势。现在我一般的做法就是简单任务、贴近系统的任务通过shell解决,其它情况通过通用编程语言调用shell子进程解决。不过现在有chat了,没事问问他可能更方便。