Bash 行操作
简介
Bash 内置了 Readline
库,具有这个库提供的很多“行操作”功能,比如命令的自动补全,可以大大加快操作速度。
这个库默认采用 Emacs 快捷键,也可以改成 Vi 快捷键。
1$ set -o vi
下面的命令可以改回 Emacs 快捷键。
1$ set -o emacs
如果想永久性更改编辑模式(Emacs /
Vi),可以将命令写在~/.inputrc文件,这个文件是 Readline
的配置文件。
1set editing-mode vi
本章介绍的快捷键都属于 Emacs 模式。Vi 模式的快捷键,读者可以参考 Vi
编辑器的教程。
Bash 默认开启这个库,但是允许关闭。
1$ bash --noediting
上面命令中,--noediting参数关闭了 Readline 库,启动的
Bash 就不带有行操作功能。
光标移动
Readline 提供快速移动光标的快捷键。
Ctrl + a:移到行首。
Ctrl + b:向行首移动一个字符,与左箭头作用相同。
Ctrl + e:移到行尾。
Ctrl + f:向行尾移动一个字符,与右箭 ...
Bash 的算术运算
算术表达式
((...))语法可以进行整数的算术运算。
123$ ((foo = 5 + 5))$ echo $foo10
((...))会自动忽略内部的空格,所以下面的写法都正确,得到同样的结果。
123$ ((2+2))$ (( 2+2 ))$ (( 2 + 2 ))
这个语法不返回值,命令执行的结果根据算术运算的结果而定。只要算术结果不是0,命令就算执行成功。
123$ (( 3 + 2 ))$ echo $?0
上面例子中,3 + 2的结果是5,命令就算执行成功,环境变量$?为0。
如果算术结果为0,命令就算执行失败。
123$ (( 3 - 3 ))$ echo $?1
上面例子中,3 - 3的结果是0,环境变量$?为1,表示命令执行失败。
如果要读取算术运算的结果,需要在((...))前面加上美元符号$((...)),使其变成算术表达式,返回算术运算的值。
12$ echo $((2 + 2))4
((...))语法支持的算术运算符如下。
+:加法
-:减法
*:乘法
/:除法(整除)
%:余数
**:指数
++:自增运算(前缀或后缀)
- ...
字符串操作
本章介绍 Bash 字符串操作的语法。
字符串的长度
获取字符串长度的语法如下。
1${#varname}
下面是一个例子。
123$ myPath=/home/cam/book/long.file.name$ echo ${#myPath}29
大括号{}是必需的,否则 Bash
会将$#理解成脚本的参数个数,将变量名理解成文本。
12$ echo $#myvar0myvar
上面例子中,Bash
将$#和myvar分开解释了。
子字符串
字符串提取子串的语法如下。
1${varname:offset:length}
上面语法的含义是返回变量$varname的子字符串,从位置offset开始(从0开始计算),长度为length。
123$ count=frogfootman$ echo ${count:4:4}foot
上面例子返回字符串frogfootman从4号位置开始的长度为4的子字符串foot。
这种语法不能直接操作字符串,只能通过变量来读取字符串,并且不 ...
Bash 变量
简介
Bash 变量分成环境变量和自定义变量两类。
环境变量
环境变量是 Bash 环境自带的变量,进入 Shell
时已经定义好了,可以直接使用。它们通常是系统定义好的,也可以由用户从父
Shell 传入子 Shell。
env命令或printenv命令,可以显示所有环境变量。
123$ env# 或者$ printenv
下面是一些常见的环境变量。
BASHPID:Bash 进程的进程 ID。
BASHOPTS:当前 Shell
的参数,可以用shopt命令修改。
DISPLAY:图形环境的显示器名字,通常是:0,表示
X Server 的第一个显示器。
EDITOR:默认的文本编辑器。
HOME:用户的主目录。
HOST:当前主机的名称。
IFS:词与词之间的分隔符,默认为空格。
LANG:字符集以及语言编码,比如zh_CN.UTF-8。
PATH:由冒号分开的目录列表,当输入可执行程序名后,会搜索这个目录列表。
PS1:Shell 提示符。
PS2: 输入多行命令时,次要的 Shell 提示符。
PWD:当前工作目录。
RANDOM:返回一个0到32767之 ...
引号和转义
Bash 只有一种数据类型,就是字符串。不管用户输入什么数据,Bash
都视为字符串。因此,字符串相关的引号和转义,对 Bash 来说就非常重要。
转义
某些字符在 Bash
里面有特殊含义(比如$、&、*)。
123$ echo $date$
上面例子中,输出$date不会有任何结果,因为$是一个特殊字符。
如果想要原样输出这些特殊字符,就必须在它们前面加上反斜杠,使其变成普通字符。这就叫做“转义”(escape)。
12$ echo \$date$date
上面命令中,只有在特殊字符$前面加反斜杠,才能原样输出。
反斜杠本身也是特殊字符,如果想要原样输出反斜杠,就需要对它自身转义,连续使用两个反斜线(\\)。
12$ echo \\\
上面例子输出了反斜杠本身。
反斜杠除了用于转义,还可以表示一些不可打印的字符。
\a:响铃
\b:退格
\n:换行
\r:回车
\t:制表符
如果想要在命令行使用这些不可打印的字符,可以把它们放在引号里面,然后使用echo命令的-e参数。
12345$ echo a\tbatb$ echo -e "a\tb&q ...
Bash 的模式扩展
简介
Shell
接收到用户输入的命令以后,会根据空格将用户的输入,拆分成一个个词元(token)。然后,Shell
会扩展词元里面的特殊字符,扩展完成后才会调用相应的命令。
这种特殊字符的扩展,称为模式扩展(globbing)。其中有些用到通配符,又称为通配符扩展(wildcard
expansion)。Bash 一共提供八种扩展。
波浪线扩展
? 字符扩展
* 字符扩展
方括号扩展
大括号扩展
变量扩展
子命令扩展
算术扩展
本章介绍这八种扩展。
Bash 是先进行扩展,再执行命令。因此,扩展的结果是由 Bash
负责的,与所要执行的命令无关。命令本身并不存在参数扩展,收到什么参数就原样执行。这一点务必需要记住。
模块扩展的英文单词是globbing,这个词来自于早期的 Unix
系统有一个/etc/glob文件,保存扩展的模板。后来 Bash
内置了这个功能,但是这个名字就保留了下来。
模式扩展与正则表达式的关系是,模式扩展早于正则表达式出现,可以看作是原始的正则表达式。它的功能没有正则那么强大灵活,但是优点是简单和方便。
Bash 允许用户关闭扩展。
...
Bash 的基本语法
本章介绍 Bash 的最基本语法。
echo 命令
由于后面的例子会大量用到echo命令,这里先介绍这个命令。
echo命令的作用是在屏幕输出一行文本,可以将该命令的参数原样输出。
12$ echo hello worldhello world
上面例子中,echo的参数是hello world,可以原样输出。
如果想要输出的是多行文本,即包括换行符。这时就需要把多行文本放在引号里面。
12345678$ echo "<HTML> <HEAD> <TITLE>Page Title</TITLE> </HEAD> <BODY> Page body. </BODY></HTML>"
上面例子中,echo可以原样输出多行文本。
-n参数
默认情况下,echo输出的文本末尾会有一个回车符。-n参数可以取消末尾的回车符,使得下一个提示符紧跟在输出内容的后面。
12$ echo -n hello w ...
Bash 简介
Bash 是 Unix 系统和 Linux 系统的一种
Shell(命令行环境),是目前绝大多数 Linux 发行版的默认 Shell。
Shell 的含义
学习 Bash,首先需要理解 Shell 是什么。Shell
这个单词的原意是“外壳”,跟
kernel(内核)相对应,比喻内核外面的一层,即用户跟内核交互的对话界面。
具体来说,Shell 这个词有多种含义。
首先,Shell
是一个程序,提供一个与用户对话的环境。这个环境只有一个命令提示符,让用户从键盘输入命令,所以又称为命令行环境(command
line interface,简写为 CLI)。Shell
接收到用户输入的命令,将命令送入操作系统执行,并将结果返回给用户。本书中,除非特别指明,Shell
指的就是命令行环境。
其次,Shell
是一个命令解释器,解释用户输入的命令。它支持变量、条件判断、循环操作等语法,所以用户可以用
Shell 命令写出各种小程序,又称为脚本(script)。这些脚本都通过 Shell
的解释执行,而不通过编译。
最后,Shell
是一个工具箱,提供了各种小工具,供用户方便地 ...
Web Share API
概述
网页内容如果要分享到其他应用,通常要自己实现分享接口,逐一给出目标应用的连接方式。这样很麻烦,也对网页性能有一定影响。Web
Share API
就是为了解决这个问题而提出的,允许网页调用操作系统的分享接口,实质是 Web
App 与本机的应用程序交换信息的一种方式。
这个 API
不仅可以改善网页性能,而且不限制分享目标的数量和类型。社交媒体应用、电子邮件、即时消息、以及本地系统安装的、且接受分享的应用,都会出现在系统的分享弹窗,这对手机网页尤其有用。另外,使用这个接口只需要一个分享按钮,而传统的网页分享有多个分享目标,就有多少个分享按钮。
目前,桌面的 Safari 浏览器,手机的安卓 Chrome 浏览器和 iOS Safari
浏览器,支持这个 API。
这个 API 要求网站必须启用 HTTPS 协议,但是本地 Localhost 开发可以使用
HTTP 协议。另外,这个 API
不能直接调用,只能用来响应用户的操作(比如click事件)。
接口细节
该接口部署在navigator.share,可以用下面的代码检查本机是否支持该接口。
123 ...
WebSocket
WebSocket 是一种网络通信协议,很多高级功能都需要它。
初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP
协议,为什么还需要另一个协议?它能带来什么好处?
答案很简单,因为 HTTP
协议有一个缺陷:通信只能由客户端发起。举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP
协议做不到服务器主动向客户端推送信息。HTTP
协议的这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用“轮询”:每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。
轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP
连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket
就是这样发明的。
简介
WebSocket
协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。
它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。We ...