From 3f58b87493e75b2e62901608e26bfca4893b1fc5 Mon Sep 17 00:00:00 2001 From: jaywcjlove Date: Sun, 2 Oct 2022 16:37:47 +0000 Subject: [PATCH] feat: add `bash.md` cheatsheet. f65a82e176cfe0f28956c438820165b6f9b910d0 --- docs/bash.html | 1127 ++++++++++++++++++++++++++++++++++++++ docs/quickreference.html | 8 +- docs/xpath.html | 140 ++++- index.html | 6 +- style/style.css | 6 + 5 files changed, 1278 insertions(+), 9 deletions(-) create mode 100644 docs/bash.html diff --git a/docs/bash.html b/docs/bash.html new file mode 100644 index 00000000..ceea2a66 --- /dev/null +++ b/docs/bash.html @@ -0,0 +1,1127 @@ + + + + +Bash 备忘清单 + & bash cheatsheet & Quick Reference + + + + + + +

Bash 备忘清单

+

这是开始使用 linux bash shell 脚本的快速参考备忘单。

+

入门

+

hello.sh

+
#!/bin/bash
+VAR="world"
+echo "Hello $VAR!" # => Hello world!
+
+

执行脚本

+
$ bash hello.sh
+
+

变量

+
NAME="John"
+echo ${NAME}    # => John (变量)
+echo $NAME      # => John (变量)
+echo "$NAME"    # => John (变量)
+echo '$NAME'    # => $NAME (确切的字符串)
+echo "${NAME}!" # => John! (变量)
+NAME = "John"   # => Error (关于空间)
+
+

注释

+
# 这是一个内联 Bash 注释。
+
+
: '
+这是一个
+非常整洁的评论
+在 bash
+'
+
+

多行注释使用 :' 打开和 ' 关闭

+

参数

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表示描述
$1$9参数 1 ... 9
$0脚本本身的名称
$1第一个论点
${10}位置参数 10
$#参数数量
$$shell 的进程 id
$*所有论据
$@所有参数,从第一个开始
$-当前选项
$_上一个命令的最后一个参数
+

见:特殊参数

+

函数

+
get_name() {
+    echo "John"
+}
+echo "You are $(get_name)"
+
+

见:函数

+

条件句

+
if [[ -z "$string" ]]; then
+    echo "String is empty"
+elif [[ -n "$string" ]]; then
+    echo "String is not empty"
+fi
+
+

见:条件句

+

大括号扩展

+
echo {A,B}.js
+
+
+ + + + + + + + + + + + + + + + + + + + + +
表示描述
{A,B}A B 相同
{A,B}.jsA.js B.js 相同
{1..5}1 2 3 4 5 相同
+

见:大括号扩展

+

Shell 执行

+
# => I'm in /当前/的/路径
+echo "I'm in $(PWD)"
+# Same as:
+echo "I'm in `pwd`"
+
+

见:命令替换

+

Bash 参数扩展

+

语法

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
代码描述
${FOO%suffix}删除后缀
${FOO#prefix}删除前缀
${FOO%%suffix}去掉长后缀
${FOO##prefix}删除长前缀
${FOO/from/to}替换第一个匹配项
${FOO//from/to}全部替换
${FOO/%from/to}替换后缀
${FOO/#from/to}替换前缀
+

子字符串

+ + + + + + + + + + + + + + + + + +
表示描述
${FOO:0:3}子串 (位置,长度)
${FOO:(-3):3}从右边开始的子串
+

Length

+ + + + + + + + + + + + + +
表示描述
${#FOO}$FOO 的长度
+

默认值

+ + + + + + + + + + + + + + + + + + + + + + + + + +
表示描述
${FOO:-val}$FOO,如果未设置,则为 val
${FOO:=val}如果未设置,则将 $FOO 设置为 val
${FOO:+val}val 如果设置了$FOO
${FOO:?message}如果 $FOO 未设置,则显示消息并退出
+

替代 Substitution

+
echo ${food:-Cake}  #=> $food or "Cake"
+
+
STR="/path/to/foo.cpp"
+echo ${STR%.cpp}    # /path/to/foo
+echo ${STR%.cpp}.o  # /path/to/foo.o
+echo ${STR%/*}      # /path/to
+echo ${STR##*.}     # cpp (extension)
+echo ${STR##*/}     # foo.cpp (basepath)
+echo ${STR#*/}      # path/to/foo.cpp
+echo ${STR##*/}     # foo.cpp
+echo ${STR/foo/bar} # /path/to/bar.cpp
+
+

切片 Slicing

+
name="John"
+echo ${name}           # => John
+echo ${name:0:2}       # => Jo
+echo ${name::2}        # => Jo
+echo ${name::-1}       # => Joh
+echo ${name:(-1)}      # => n
+echo ${name:(-2)}      # => hn
+echo ${name:(-2):2}    # => hn
+
+length=2
+echo ${name:0:length}  # => Jo
+
+

见:参数扩展

+

基本路径和目录路径

+
SRC="/path/to/foo.cpp"
+
+
BASEPATH=${SRC##*/}   
+echo $BASEPATH  # => "foo.cpp"
+
+DIRPATH=${SRC%$BASEPATH}
+echo $DIRPATH   # => "/path/to/"
+
+

Transform

+
STR="HELLO WORLD!"
+echo ${STR,}      # => hELLO WORLD!
+echo ${STR,,}     # => hello world!
+
+STR="hello world!"
+echo ${STR^}      # => Hello world!
+echo ${STR^^}     # => HELLO WORLD!
+
+ARR=(hello World)
+echo "${ARR[@],}" # => hello world
+echo "${ARR[@]^}" # => Hello World
+
+

Bash 数组

+

定义数组

+
Fruits=('Apple' 'Banana' 'Orange')
+
+Fruits[0]="Apple"
+Fruits[1]="Banana"
+Fruits[2]="Orange"
+
+ARRAY1=(foo{1..2}) # => foo1 foo2
+ARRAY2=({A..D})    # => A B C D
+
+# 合并 => foo1 foo2 A B C D
+ARRAY3=(${ARRAY1[@]} ${ARRAY2[@]})
+
+# 声明构造
+declare -a Numbers=(1 2 3)
+Numbers+=(4 5) # 附加 => 1 2 3 4 5
+
+

索引

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:--
${Fruits[0]}第一个元素
${Fruits[-1]}最后一个元素
${Fruits[*]}所有元素
${Fruits[@]}所有元素
${#Fruits[@]}总数
${#Fruits}第一节长度
${#Fruits[3]}第n个长度
${Fruits[@]:3:2}范围
${!Fruits[@]}所有 Key
+

迭代 Iteration

+
Fruits=('Apple' 'Banana' 'Orange')
+for e in "${Fruits[@]}"; do
+    echo $e
+done
+
+

With index

+
for i in "${!Fruits[@]}"; do
+  printf "%s\t%s\n" "$i" "${Fruits[$i]}"
+done
+
+

操作

+ +
Fruits=("${Fruits[@]}" "Watermelon")         # 推
+Fruits+=('Watermelon')                       # 也推
+Fruits=( ${Fruits[@]/Ap*/} )                 # 通过正则表达式匹配删除
+unset Fruits[2]                              # 删除一项
+Fruits=("${Fruits[@]}")                      # 复制
+Fruits=("${Fruits[@]}" "${Veggies[@]}")      # 连接
+lines=(`cat "logfile"`)                      # 从文件中读取
+
+

数组作为参数

+
function extract()
+{
+  local -n myarray=$1
+  local idx=$2
+  echo "${myarray[$idx]}"
+}
+Fruits=('Apple' 'Banana' 'Orange')
+extract Fruits 2     # => Orangle
+
+

Bash 字典

+

定义

+
declare -A sounds
+
+
sounds[dog]="bark"
+sounds[cow]="moo"
+sounds[bird]="tweet"
+sounds[wolf]="howl"
+
+

使用字典

+
echo ${sounds[dog]} # Dog's sound
+echo ${sounds[@]}   # All values
+echo ${!sounds[@]}  # All keys
+echo ${#sounds[@]}  # Number of elements
+unset sounds[dog]   # Delete dog
+
+

迭代

+
for val in "${sounds[@]}"; do
+    echo $val
+done
+
+
+
for key in "${!sounds[@]}"; do
+    echo $key
+done
+
+

Bash 条件句

+

整数条件

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
条件描述
[[ NUM -eq NUM ]]等于 Equal
[[ NUM -ne NUM ]]不等于 Not equal
[[ NUM -lt NUM ]]少于 Less than
[[ NUM -le NUM ]]小于或等于 Less than or equal
[[ NUM -gt NUM ]]大于 Greater than
[[ NUM -ge NUM ]]大于或等于 Greater than or equal
(( NUM < NUM ))少于
(( NUM <= NUM ))小于或等于
(( NUM > NUM ))比...更棒
(( NUM >= NUM ))大于或等于
+

字符串条件

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
条件描述
[[ -z STR ]]空字符串
[[ -n STR ]]空字符串
[[ STR == STR ]]平等的
[[ STR = STR ]]相等(同上)
[[ STR < STR ]]小于 (ASCII)
[[ STR > STR ]]大于 (ASCII)
[[ STR != STR ]]不相等
[[ STR =~ STR ]]正则表达式
+

例子

+ +

字符串

+
if [[ -z "$string" ]]; then
+    echo "String is empty"
+elif [[ -n "$string" ]]; then
+    echo "String is not empty"
+else
+    echo "This never happens"
+fi
+
+

组合

+
if [[ X && Y ]]; then
+    ...
+fi
+
+

相等

+
if [[ "$A" == "$B" ]]; then
+    ...
+fi
+
+

正则表达式

+
if [[ '1. abc' =~ ([a-z]+) ]]; then
+    echo ${BASH_REMATCH[1]}
+fi
+
+

更小

+
if (( $a < $b )); then
+   echo "$a is smaller than $b"
+fi
+
+

存在

+
if [[ -e "file.txt" ]]; then
+    echo "file exists"
+fi
+
+

文件条件

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
条件描述
[[ -e FILE ]]存在
[[ -d FILE ]]目录
[[ -f FILE ]]文件
[[ -h FILE ]]符号链接
[[ -s FILE ]]大小 > 0 字节
[[ -r FILE ]]可读
[[ -w FILE ]]可写
[[ -x FILE ]]可执行文件
[[ f1 -nt f2 ]]f1 比 f2 新
[[ f1 -ot f2 ]]f2 早于 f1
[[ f1 -ef f2 ]]相同的文件
+

更多条件

+ + + + + + + + + + + + + + + + + + + + + + + + + +
条件描述
[[ -o noclobber ]]如果启用 OPTION
[[ ! EXPR ]]不是 Not
[[ X && Y ]]和 And
[[ X || Y ]]或者 Or
+

逻辑和,或

+
if [ "$1" = 'y' -a $2 -gt 0 ]; then
+    echo "yes"
+fi
+if [ "$1" = 'n' -o $2 -lt 0 ]; then
+    echo "no"
+fi
+
+

Bash 循环

+

基本 for 循环

+
for i in /etc/rc.*; do
+    echo $i
+done
+
+

类似 C 的 for 循环

+
for ((i = 0 ; i < 100 ; i++)); do
+    echo $i
+done
+
+

范围

+ +
for i in {1..5}; do
+    echo "Welcome $i"
+done
+
+

具有步长

+
for i in {5..50..5}; do
+    echo "Welcome $i"
+done
+
+

自动递增

+
i=1
+while [[ $i -lt 4 ]]; do
+    echo "Number: $i"
+    ((i++))
+done
+
+

自动递增

+
i=3
+while [[ $i -gt 0 ]]; do
+    echo "Number: $i"
+    ((i--))
+done
+
+

Continue

+
for number in $(seq 1 3); do
+    if [[ $number == 2 ]]; then
+        continue;
+    fi
+    echo "$number"
+done
+
+

Break

+
for number in $(seq 1 3); do
+    if [[ $number == 2 ]]; then
+        # Skip entire rest of loop.
+        break;
+    fi
+    # This will only print 1
+    echo "$number"
+done
+
+

Until

+
count=0
+until [ $count -gt 10 ]; do
+    echo "$count"
+    ((count++))
+done
+
+

永远

+
while true; do
+    # here is some code.
+done
+
+

永远(简写)

+
while :; do
+    # here is some code.
+done
+
+

正在读取行

+
cat file.txt | while read line; do
+    echo $line
+done
+
+

Bash 函数

+

定义函数

+
myfunc() {
+  echo "hello $1"
+}
+
+
# 同上(替代语法)
+function myfunc() {
+  echo "hello $1"
+}
+
+
myfunc "John"
+
+

返回值

+
myfunc() {
+    local myresult='some value'
+    echo $myresult
+}
+
+
result="$(myfunc)"
+
+

正在引发错误

+
myfunc() {
+    return 1
+}
+
+
if myfunc; then
+    echo "success"
+else
+    echo "failure"
+fi
+
+

Bash 选项

+ +

选项

+
# 避免覆盖文件
+# (echo "hi" > foo)
+set -o noclobber
+
+# 用于出错时退出
+# 避免级联错误
+set -o errexit   
+
+# 揭示隐藏的失败
+set -o pipefail  
+
+# 公开未设置的变量
+set -o nounset
+
+

全局选项

+
# 不匹配的 glob 被删除
+# ('*.foo' => '')
+shopt -s nullglob   
+
+# 不匹配的 glob 抛出错误
+shopt -s failglob  
+
+# 不区分大小写的球体
+shopt -s nocaseglob 
+
+# 通配符匹配点文件
+# ("*.sh" => ".foo.sh")
+shopt -s dotglob    
+
+# 允许 ** 进行递归匹配
+# ('lib/**/*.rb' => 'lib/a/b/c.rb')
+shopt -s globstar   
+
+

Bash 历史

+ +

命令

+ + + + + + + + + + + + + + + + + + + + + +
命令描述
history显示历史
sudo !!使用 sudo 运行上一个命令
shopt -s histverify不要立即执行扩展结果
+

表达式

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表达式描述
!$展开最新命令的最后一个参数
!*展开最新命令的所有参数
!-n展开第 n 个最近的命令
!n展开历史中的第 n 个命令
!<command>展开最近调用的命令 <command>
+

操作

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
代码描述
!!再次执行最后一条命令
!!:s/<FROM>/<TO>/在最近的命令中将第一次出现的 <FROM> 替换为 <TO>
!!:gs/<FROM>/<TO>/在最近的命令中将所有出现的 <FROM> 替换为 <TO>
!$:t仅从最近命令的最后一个参数扩展基本名称
!$:h仅从最近命令的最后一个参数展开目录
+

!!!$ 可以替换为任何有效的扩展。

+

切片 Slices

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
代码描述
!!:n仅扩展最近命令中的第 n 个标记(命令为 0;第一个参数为 1
!^从最近的命令展开第一个参数
!$从最近的命令中展开最后一个标记
!!:n-m从最近的命令扩展令牌范围
!!:n-$从最近的命令中将第 n 个标记展开到最后
+

!! 可以替换为任何有效的扩展,即 !cat!-2!42 等。

+

各种各样的

+

数值计算

+
$((a + 200))      # Add 200 to $a
+
+
$(($RANDOM%200))  # Random number 0..199
+
+

子 shell

+
(cd somedir; echo "I'm now in $PWD")
+pwd # still in first directory
+
+

检查命令

+
command -V cd
+#=> "cd is a function/alias/whatever"
+
+

重定向

+ +
python hello.py > output.txt   # 标准输出到(文件)
+python hello.py >> output.txt  # 标准输出到(文件),追加
+python hello.py 2> error.log   # 标准错误到(文件)
+python hello.py 2>&1           # 标准错误到标准输出
+python hello.py 2>/dev/null    # 标准错误到(空null)
+python hello.py &>/dev/null    # 标准输出和标准错误到(空null)
+
+
python hello.py < foo.txt      # 将 foo.txt 提供给 python 的标准输入
+
+

来源相对

+
source "${0%/*}/../share/foo.sh"
+
+

脚本目录

+
DIR="${0%/*}"
+
+

Case/switch

+
case "$1" in
+    start | up)
+    vagrant up
+    ;;
+    *)
+    echo "Usage: $0 {start|stop|ssh}"
+    ;;
+esac
+
+

陷阱错误

+ +
trap 'echo Error at about $LINENO' ERR
+
+

或者

+
traperr() {
+    echo "ERROR: ${BASH_SOURCE[1]} at about ${BASH_LINENO[0]}"
+}
+set -o errtrace
+trap traperr ERR
+
+

printf

+
printf "Hello %s, I'm %s" Sven Olga
+#=> "Hello Sven, I'm Olga
+
+printf "1 + 1 = %d" 2
+#=> "1 + 1 = 2"
+
+printf "Print a float: %f" 2
+#=> "Print a float: 2.000000"
+
+

获取选项

+ +
while [[ "$1" =~ ^- && ! "$1" == "--" ]]; do case $1 in
+    -V | --version )
+    echo $version
+    exit
+    ;;
+    -s | --string )
+    shift; string=$1
+    ;;
+    -f | --flag )
+    flag=1
+    ;;
+esac; shift; done
+if [[ "$1" == '--' ]]; then shift; fi
+
+

检查命令的结果

+ +
if ping -c 1 google.com; then
+    echo "看来您的互联网连接正常"
+fi
+
+

特殊变量

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
表达式描述
$?最后一个任务的退出状态
$!最后一个后台任务的 PID
$$shell PID
$0shell 脚本的文件名
+

特殊参数

+

grep 检查

+ +
if grep -q 'foo' ~/.bash_history; then
+    echo "您过去似乎输入过“foo”"
+fi
+
+

反斜杠转义

+ +
    +
  •  
  • +
  • !
  • +
  • "
  • +
  • #
  • +
  • &
  • +
  • '
  • +
  • (
  • +
  • )
  • +
  • ,
  • +
  • ;
  • +
  • <
  • +
  • >
  • +
  • [
  • +
  • |
  • +
  • \
  • +
  • ]
  • +
  • ^
  • +
  • {
  • +
  • }
  • +
  • `
  • +
  • $
  • +
  • *
  • +
  • ?
  • +
+ +

使用 \ 转义这些特殊字符

+

Heredoc

+
cat <<END
+hello world
+END
+
+

转到上一个目录

+
pwd # /home/user/foo
+cd bar/
+pwd # /home/user/foo/bar
+cd -
+pwd # /home/user/foo
+
+

读取输入

+
echo -n "Proceed? [y/n]: "
+read ans
+echo $ans
+
+
read -n 1 ans    # 只有一个字符
+
+

条件执行

+
git commit && git push
+git commit || echo "Commit failed"
+
+

严格模式

+
set -euo pipefail
+IFS=$'\n\t'
+
+

参见:非官方 bash 严格模式

+

可选参数

+
args=("$@")
+args+=(foo)
+args+=(bar)
+echo "${args[@]}"
+
+

将参数放入数组中,然后追加

+

另见

+ +
+ diff --git a/docs/quickreference.html b/docs/quickreference.html index 34fa1660..5d1836bf 100644 --- a/docs/quickreference.html +++ b/docs/quickreference.html @@ -190,7 +190,11 @@ -
:--
shortcuts快捷键样式
wrap-text超出换行
show-header展示表头
+ + + + +
:--
shortcuts快捷键样式
wrap-text超出换行
show-header展示表头
style-none隐藏 <ul> 列表样式

颜色标签

@@ -214,7 +218,7 @@ -
:--
<yel>黄色
<pur>紫色
<code>``绿色
+
:--
<yel>黄色
<pur>紫色
<code>``绿

布局

H2 部分

diff --git a/docs/xpath.html b/docs/xpath.html index ee2342a6..2ea0b637 100644 --- a/docs/xpath.html +++ b/docs/xpath.html @@ -37,12 +37,18 @@

XPath 备忘清单

这是一份 XPath 选择器备忘单,其中列出了常用的 XPath 定位方法和 CSS 选择器

XPath 选择器

-

入门

+

入门

+

XPath 即为 XML 路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的计算机语言。

  • Xpath test bed (whitebeam.org)
  • +
  • XPath 代表 XML 路径语言
  • +
  • XPath 使用 类似路径 语法识别和导航 XML 文档中的节点
  • +
  • XPath 包含超过 200 个内置函数
  • +
  • XPath 是 XSLT 标准中的主要元素
  • +
  • XPath 是 W3C 推荐的
-

在 Firefox 或 Chrome 控制台中测试:

+

FirefoxChrome 控制台中测试:

$x('/html/body')
 $x('//h1')
 $x('//h1')[0].innerText
@@ -197,7 +203,89 @@
 
 
XpathCSS
//h1/following-sibling::ulh1 ~ ul
//h1/following-sibling::ul[1]h1 + ul
//h1/following-sibling::[@id="id"]h1 ~ #id
-

jQuery

+

最有用的路径表达式

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
XpathCSS
nodename选择名称为 nodename 的所有节点
/从根节点中选择
//从当前节点中选择文档中与选择匹配的节点,无论它们在哪里
.选择当前节点
..选择当前节点的父节点
@选择属性
+ +

杂项选择器

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
XpathCSS
//h1[not(@id)]h1:not([id])
//button[text()="Submit"]文字匹配
//button[contains(text(),"Go")]文本包含(子字符串)
//product[@price > 2.50]算术
//ul[*]有孩子
//ul[li]有孩子(具体)
//a[@name or @href]或逻辑
//a | //div联合(加入结果)
+ +

jQuery

+ @@ -225,7 +313,8 @@
XpathCSS
//ul/li/..$('ul > li').parent()
//li/ancestor-or-self::section$('li').closest('section')
//a/@href$('a').attr('href')
//span/text()$('span').text()
-

杂项选择器

+

运算符

+ @@ -267,7 +356,46 @@ -
XpathCSS
//h1[not(@id)]h1:not([id])
//button[text()="Submit"]文字匹配
//button[contains(text(),"Go")]文本包含(子字符串)
//product[@price > 2.50]算术
//ul[*]有孩子
//ul[li]有孩子(具体)
//a[@name or @href]或逻辑
`//a//div`
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
运算符说明示例
|计算两个节点集//book | //cd
+添加6 + 4
-减法6 - 4
*乘法6 * 4
div分配8 div 4
=平等的price=9.80
!=不相等price!=9.80
<小于price<9.80
<=小于或等于price<=9.80
>大于price>9.80
>=大于或等于price>=9.80
or或者price=9.80 or price=9.70
andprice>9.00 and price<9.90
mod模数(除法余数)5 mod 2

XPath 表达式

步骤和轴

@@ -559,7 +687,7 @@ -
AxisAbbrevNotes
ancestor
ancestor-or-self
attribute@@hrefattribute::href 的缩写
childdivchild::div 的缩写
descendant
descendant-or-self/////descendant-or-self::node()/的缩写
namespace
self..self::node() 的缩写
parent....parent::node() 的缩写
following
following-sibling
preceding
preceding-sibling
+
AxisAbbrevNotes
ancestor选择当前节点的所有祖先(父母、祖父母等)
ancestor-or-self选择当前节点所有祖先(父、祖父等)和当前节点本身
attribute@@hrefattribute::href 的缩写
childdivchild::div 的缩写
descendant选择当前节点的所有后代(子、孙等)
descendant-or-self/////descendant-or-self::node()/的缩写 选择当前节点和当前节点本身的所有后代(子、孙等)
namespace选择当前节点的所有命名空间节点
self..self::node() 的缩写,选择当前节点
parent....parent::node() 的缩写,选择当前节点的父节点
following选择文档中当前节点结束标记之后的所有内容
following-sibling选择当前节点之后的所有兄弟节点
preceding选择文档中出现在当前节点之前的所有节点,除了祖先、属性节点和命名空间节点
preceding-sibling选择当前节点之前的所有兄弟节点

您还可以使用其他轴。

联合

diff --git a/index.html b/index.html index ff2d284d..39d53411 100644 --- a/index.html +++ b/index.html @@ -38,7 +38,11 @@

为开发人员分享快速参考备忘清单(主要是方便自己),在看到 Reference 快速参考备忘单,感觉非常简单,造轮子使命感突然来了,造个中文版本的,为了方便自己的技术栈查阅,立马撸起来 :)。

如果您发现此处的备忘单不合适,您可以通过提交 PR 来修复它或提供更好的备忘清单,只针对【中文】用户。以下是开源天使提供的一些备忘清单和快速参考 :)。

编程

-

+

+ + +Bash + Docker diff --git a/style/style.css b/style/style.css index d5c60ca9..93f610dd 100644 --- a/style/style.css +++ b/style/style.css @@ -543,6 +543,12 @@ body:not(.home) .h2wrap > h2 a::after { grid-template-columns: repeat(1,minmax(0,1fr)); } +.h3wrap > .wrap-body ul:not(:last-child), +.h3wrap > .wrap-body ol, +.h3wrap > .wrap-body dl { + margin-bottom: 0; +} + .h2wrap-body ul li, .h2wrap-body ol li, .h2wrap-body dl li {