Acwing Linux 基础课 3, 4 章
Contents
shell 语法
语法详解
概论
shell:通过命令行与操作系统沟通的语言。脚本可在命令行中执行或组成一个文件复用。常见脚本:
- Bourne Shell(
/usr/bin/sh或/bin/sh
) - Bourne Again Shell(
/bin/bash
) - C Shell(
/usr/bin/csh
) - K Shell(
/usr/bin/ksh
) - zsh
Linux 系统中一般默认使用 bash,以下以 bash 中的语法为例。文件开头需要写 #! /bin/bash
,指明 bash 为脚本解释器。新建一个 test.sh
文件,内容如下:
|
|
可执行文件
|
|
解释器执行,不需要有可执行权限
|
|
注释
每行中 #
之后的内容均是注释。
|
|
多行注释格式如下,其中 EOF
可以换成其它任意字符串,也可以不加冒号。
|
|
变量
定义变量,不需要加 $
符号
|
|
使用变量,需要加上 $
符号,或者 ${}
符号。花括号是可选的,主要为了帮助解释器识别变量边界。
|
|
使用 readonly
或者 declare
可以将变量变为只读。
|
|
unset
可以删除变量。
|
|
变量类型分为:
-
自定义变量(局部变量):子进程不能访问的变量
-
环境变量(全局变量):子进程可以访问的变量
自定义变量改成环境变量:
|
|
环境变量改为自定义变量:
|
|
字符串可以用单引号,也可以用双引号,也可以不用引号。
单引号与双引号的区别:
- 单引号中的内容会原样输出,不会执行、不会取变量;
- 双引号中的内容可以执行、可以取变量;
|
|
获取字符串长度
|
|
提取子串
|
|
默认变量
在执行 shell 脚本时,可以向脚本传递参数。$1
是第一个参数,$2
是第二个参数,以此类推。特殊的,$0
是文件名(包含路径)。脚本传递参数时,参数个数超过一位需要用大括号括起来。
|
|
参数 | 说明 |
---|---|
$# |
代表文件传入的参数个数,如上例中值为 4 |
$* |
由所有参数构成的用空格隔开的字符串,如上例中值为 "$1 $2 $3 $4" |
$@ |
每个参数分别用双引号括起来的字符串,如上例中值为 "$1" "$2" "$3" "$4" |
$$ |
脚本当前运行的进程 ID |
$? |
上一条命令的退出状态(注意不是 stdout,而是 exit code)。0 表示正常退出,其他值表示错误 |
$(command) |
返回command 这条命令的 stdout(可嵌套) |
command\ |
返回 command 这条命令的 stdout(不可嵌套) |
数组
数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。数组下标从0开始。
- 定义
数组用小括号表示,元素之间用空格隔开。也可以直接定义数组中某个元素的值。
|
|
- 读取数组中某个元素的值
格式为 ${array[index]}
,例如
|
|
- 读取整个数组
格式:
|
|
- 数组长度
类似于字符串
|
|
expr 命令
expr命令用于求表达式的值,格式为 expr 表达式
- 字符串表达式
length STRING
: 返回STRING
的长度index STRING CHARSET
:CHARSET
中任意单个字符在STRING
中最前面的字符位置,下标从 1 开始。如果在STRING
中完全不存在CHARSET
中的字符,则返回 0substr STRING POSITION LENGTH
: 返回STRING
字符串中从POSITION
开始,长度最大为LENGTH
的子串。如果POSITION
或LENGTH
为负数,0 或非数值,则返回空字符串。
示例:
|
|
- 整数表达式