#!/bin/bash
VAR="world"
echo "Hello $VAR!" # => Hello world!
运行 Bash 脚本
$ bash hello.sh
NAME="John"
echo ${NAME} # => John (变量引用)
echo $NAME # => John (变量引用)
echo "$NAME" # => John (变量引用)
echo '$NAME' # => $NAME (原样单引号字面量)
echo "${NAME}!" # => John! (拼接变量)
NAME = "John" # => 错误 (等号两边不能有空格)
# 这是单行 Bash 注释
: '
这是 Bash 中的
多行注释语法
'
多行注释使用 : ' 开始,以 ' 结尾。
| 表达式 | 说明 |
|---|---|
$1 … $9 |
第 1 到 第 9 个位置参数 |
$0 |
当前脚本本身的名称 |
$1 |
第一个传入参数 |
${10} |
第 10 个位置参数(需加大括号) |
$# |
传入参数的总个数 |
$$ |
当前 Shell 的进程 PID |
$* |
所有传入参数(作为一个整体字符串) |
$@ |
所有传入参数(保留各自参数边界) |
$- |
当前 Shell 开启的选项标志 |
$_ |
上一条命令的最后一个参数 |
参阅: Shell 特殊参数说明
if [[ -z "$string" ]]; then
echo "字符串为空"
elif [[ -n "$string" ]]; then
echo "字符串非空"
else
echo "其他情况"
fi
参阅: 条件判断详解
echo {A,B}.js # => A.js B.js
echo {A,B} # => A B
echo {1..5} # => 1 2 3 4 5
echo {1..10..2} # => 1 3 5 7 9
echo {a..e} # => a b c d e
echo "当前目录是 $(pwd)"
echo "当前目录是 `pwd`" # 旧式语法
| 语法 | 说明 |
|---|---|
${FOO:-val} |
如果 FOO 未设置或为空,返回 val |
${FOO:=val} |
如果 FOO 未设置或为空,将其赋值为 val 并返回 |
${FOO:+val} |
如果 FOO 已设置且非空,返回 val |
${FOO:?err} |
如果 FOO 未设置或为空,打印 err 报错并退出 |
FOO="Hello World"
echo ${FOO:0:5} # => Hello (从下标0开始截取5个字符)
echo ${FOO:6} # => World (从下标6开始截取到末尾)
echo ${FOO: -5} # => World (从末尾倒数第5个字符开始)
SRC="/path/to/file.txt"
echo ${SRC##*/} # => file.txt (获取文件名)
echo ${SRC%/*} # => /path/to (获取目录路径)
FOO="hello world"
echo ${FOO^} # => Hello world (首字母大写)
echo ${FOO^^} # => HELLO WORLD (全部转大写)
echo ${FOO/l/X} # => Hexlo world (替换第一个 l)
echo ${FOO//l/X} # => Hexxo worxd (替换所有 l)
| 比较运算符 | 含义 | 示例 |
|---|---|---|
-eq |
等于 (Equal) | [[ $a -eq $b ]] |
-ne |
不等于 (Not Equal) | [[ $a -ne $b ]] |
-lt |
小于 (Less Than) | [[ $a -lt $b ]] |
-le |
小于等于 | [[ $a -le $b ]] |
-gt |
大于 (Greater Than) | [[ $a -gt $b ]] |
-ge |
大于等于 | [[ $a -ge $b ]] |
| 比较运算符 | 含义 |
|---|---|
= / == |
字符串相同 |
!= |
字符串不相同 |
-z |
字符串为空 (Zero length) |
-n |
字符串非空 (Non-zero) |
| 测试条件 | 说明 |
|---|---|
-e file |
文件或目录是否存在 |
-f file |
是否为普通文件 |
-d file |
是否为目录 |
-r file |
文件是否可读 |
-w file |
文件是否可写 |
-x file |
文件是否可执行 |
-s file |
文件大小是否大于 0 |
# 列表遍历
for i in 1 2 3 4 5; do
echo "数字: $i"
done
# C 语言风格循环
for ((i = 0; i < 5; i++)); do
echo "索引: $i"
done
count=1
while [ $count -le 5 ]; do
echo "计数: $count"
((count++))
done
while read -r line; do
echo "读取行: $line"
done < input.txt