Shell Notes (revisited)¶
约 2838 个字 预计阅读时间 9 分钟
一个离散的知识列表
基础知识¶
内置变量/特殊变量¶
当前脚本的名称.对于被执行的脚本,它是脚本文件的路径和名称。
位置参数变量,表示脚本或函数的参数.\(1 表示第一个参数,\)2 表示第二个参数,依此类推。
表示所有位置参数的列表.在脚本中,可以使用"$@"将所有位置参数作为一个参数传递给其他命令或函数。
表示位置参数的数量。
上一个命令的退出状态.如果命令成功执行,则其值为 0,否则为非零值。
当前脚本的进程 ID(PID).
当前用户的用户名。
当前用户的主目录路径。
当前工作目录的路径。
当前主机的主机名。
一个随机整数。
内部字段分隔符,用于指定由哪个字符分割输入数据的字段.默认情况下,它包含空格、制表符和换行符。
一个由冒号分隔的目录列表(环境变量),shell 在其中查找命令。
重定向¶
将命令的标准输出重定向到文件.如果文件不存在,则会创建该文件;如果文件已存在,则会覆盖文件内容。
将命令的标准输出追加到文件的末尾.如果文件不存在,则会创建该文件。
将文件的内容作为命令的标准输入。
将命令的标准错误输出重定向到文件。
将命令的标准错误输出追加到文件的末尾。
将命令的标准输出和标准错误输出合并重定向到文件。
文件权限¶
-:普通文件 d:目录 l:符号链接(软链接) c:字符设备文件 b:块设备文件 s:套接字(socket)文件 p:命名管道(FIFO)文件
r:读取权限 w:写入权限 x:执行权限
由 10 个字符组成,第一个字符表示文件类型,后面三个字符表示文件所有者的权限,再后面三个字符表示文件所属组的权限,最后三个字符表示其他用户的权限。 例如,-rw-r--r--表示普通文件,文件所有者具有读取和写入权限,文件所属组和其他用户具有读取权限。
由三个八进制数字组成,每个数字表示文件所有者、文件所属组和其他用户的权限。 每个数字的计算方法是将对应的三个权限转换为八进制数拼接起来。 例如,-rw-r--r--对应的权限数字为 644,-rwxr-xr-x 对应的权限数字为 755.
chmod
:用于更改文件或目录的权限.可以使用数字表示法(如 chmod 755 file.txt)或符号表示法(如 chmod u+x file.txt)来修改权限。
chown
:用于更改文件或目录的所有者。
chgrp
:用于更改文件或目录的所属组。
umask
:设置新创建文件和目录的默认权限掩码。
文件操作¶
tee
是一个常用的命令行工具,用于从标准输入读取数据并将其同时输出到标准输出和指定的文件中。
常用选项包括:
-a:以追加模式将输出附加到文件中,而不是覆盖文件内容。
-i:忽略中断信号(SIGINT),即使收到中断信号也继续运行。
-p:使用原始数据块大小,而不是按行缓冲输出。
-u:禁用输出缓冲区,立即将数据写入文件。
脚本语法¶
SheBang¶
Bash 脚本通常以 shebang 作为脚本文件的第一行,指定要用于解释脚本的解释器.常见的 shebang 为#!/bin/bash,表示使用 Bash 解释器解释脚本。
环境变量路径
如果要在脚本中使用 shebang,最好使用#!/usr/bin/env bash
,这样可以避免使用绝对路径,而是使用环境变量中的路径。
变量¶
Bash 脚本中的变量不需要声明,直接使用即可.变量名和等号之间不能有空格,等号后面的值不能使用空格包围.变量名一般使用大写字母,但是不是必须的。
命令替换¶
命令替换用于将命令的输出结果赋值给变量.命令替换的语法有两种:
- `command`
- $(command)
进程替换¶
进程替换用于将命令的输出结果作为另一个命令的参数.进程替换的语法为<(command)
.
可以将进程替换看作是命令替换的特殊形式,命令替换将命令的输出结果赋值给变量,而进程替换将命令的输出结果作为另一个命令的参数。
例如:files=$(ls)
花括号扩展¶
花括号扩展用于生成一个字符串列表.花括号扩展的语法为{string1,string2,...}
.
例如:echo {1..10}
花括号扩展还可以进行笛卡尔积运算,语法为{string1,string2,...}{string1,string2,...}
.
通配符¶
通配符用于匹配文件名.常见的通配符包括:
*
:匹配任意数量的任意字符。?
:匹配任意一个字符。[characters]
:匹配任意一个属于字符集中的字符。[!characters]
:匹配任意一个不属于字符集中的字符。[[:class:]]
:匹配任意一个属于指定字符类中的字符。[^class]
:匹配任意一个不属于指定字符类中的字符。[x-y]
:匹配任意一个属于指定范围中的字符。[^x-y]
:匹配任意一个不属于指定范围中的字符。[:alnum:]
:匹配任意一个字母或数字。[:alpha:]
:匹配任意一个字母。[:blank:]
:匹配空格或制表符。[:digit:]
:匹配任意一个数字。[:lower:]
:匹配任意一个小写字母。[:upper:]
:匹配任意一个大写字母。[:space:]
:匹配任意一个空白字符。[:punct:]
:匹配任意一个标点符号。[:word:]
:匹配任意一个字母、数字或下划线。[:xdigit:]
:匹配任意一个十六进制数字。[:graph:]
:匹配任意一个图形字符。[:print:]
:匹配任意一个可打印字符。[:cntrl:]
:匹配任意一个控制字符。[:ascii:]
:匹配任意一个 ASCII 字符。
算术运算¶
Bash 脚本中的算术运算使用$((expression))
语法,例如:echo $((1+1))
逻辑运算¶
Bash 脚本中的逻辑运算使用&&
、||
和!
,例如:[ -d /tmp ] && echo "Directory exists"
条件判断¶
Bash 脚本中的条件判断使用if
语句,语法如下:
循环¶
Bash 脚本中的循环使用for
和while
语句,语法如下:
函数¶
Bash 脚本中的函数使用function
语句,语法如下:
数组¶
Bash 脚本中的数组使用array=(element1 element2 element3)
语法,例如:array=(1 2 3)
数组元素使用array[index]
语法访问,例如:echo ${array[1]}
数组长度使用${#array[@]}
语法获取,例如:echo ${#array[@]}
数组元素使用${array[@]:index:length}
语法获取,例如:echo ${array[@]:1:2}
,这会获取数组中从第二个元素开始的两个元素
数组元素使用${array[@]/pattern/string}
语法获取,例如:echo ${array[@]/2/4}
,这会将数组中的所有 2 替换为 4
字符串¶
Bash 脚本中的字符串使用'string'
或者"string"
语法,例如:echo 'Hello World!'
字符串长度使用${#string}
语法获取,例如:echo ${#string}
字符串使用${string:position:length}
语法获取,例如:echo ${string:1:2}
字符串使用${string/substring/replacement}
语法获取,例如:echo ${string/Hello/Hi}
,这会将字符串中的第一个 Hello 替换为 Hi
Here 文档¶
Here 文档用于将多行文本赋值给变量。
Bash 脚本中的 Here 文档使用<<
语法,例如:
Here 字符串¶
Bash 脚本中的 Here 字符串使用<<<
语法,例如:cat <<<"Hello World!"
Here 脚本¶
Bash 脚本中的 Here 脚本使用<<-
语法,例如:
输入¶
Bash 脚本中的输入使用read
语句
其参数包括:
- -p
:提示符
- -n
:读取的字符数
- -t
:超时时间
- -s
:不回显输入的字符
- -a
:将输入赋值给数组
- -d
:分隔符
- -r
:不对反斜杠进行转义
- -e
:使用 Readline 库
- -i
:默认值
- -u
:输入的文件描述符
例如: