echo
输出双引号字符串时,不能有 !
符号;需要输出转义字符时使用 -e
参数,且该参数必须放在要输出的字符串之前,如 echo -e "My\tName\tis\tRuchee"
echo
输出可指定文本的颜色和背景颜色,每种颜色都有对应的颜色码,使用 \e[xm
的形式表达,其中 \e[0m]
代表复位,输出红色文字示例:echo -e "\e[31m My name is Ruchee \e[0m"
多个选项可用分号分隔,输出红色、高亮、下划线文字示例:echo -e "\e[1;4;31m My name is Ruchee \e[0m"
可以用 export
设置环境变量,设置的环境变量名会被执行的 Shell
脚本继承,如 $PATH
expr
和 bc
可用于数值计算,其中 expr
只能用于整数运算
sleep
可用于设置延时,和 PHP
表现一致
调试 Bash
脚本可用 bash -x file.sh
的方式运行,Bash
内置调试器会实时打印脚本每一行的运行状态
可以在脚本中用 set
语句控制调试信息的输出与否
set -x
:在执行时显示参数和命令
set +x
:禁止调试
set -v
:当命令进行读取时显示输入
set +v
:禁止打印输入
文件描述符的 0
(标准输入
)、1
(标准输出
)、2
(标准错误
) 是系统预留
可用 >
、>>
、文件描述符编号>
、文件描述符编号>>
实现输出重定向
可用 文件描述符编号+操作类型 的方式指定重定向文件描述符,如 cmd 2> err.txt
可用 &
符号将多个文件描述符重定向同一个,如 cmd out.txt 2>&1
、cmd &> out.txt
无价值或不想要的输出,可以丢到 Linux
特殊的 黑洞
里面:cmd 2> /dev/null
如果前一个命令的输出重定向到了文件,则下一个命令就不能通过管道接收到输入了,通过 tee
命令则可两者兼顾。将 cmd1 > out.txt | cmd2
改成 cmd1 | tee out.txt | cmd2
即可
向 tee
提供一个 -a
参数就不再是覆盖,而是追加,如 cmd1 | tee -a out.txt | cmd2
如果要将标准输入作为命令行参数,可以用 -
符指代,如 cmd1 | cmd2 -
在脚本中可以指定用部分内容作为某个命令的标准输入,如下例所示,将直到 EOF
再次出现的所有行的内容作为 cat
的标准输入:
#!/user/bin/env bash cat <<EOF > out.txt xxxx yyyy zzzz EOF
可以使用 exec
命令自定义文件描述符,如 exec 3<input.txt
表示将 input.txt
的文件内容作为 3
号文件描述符的标准输入,调用方式:cat <&3
date
:按本地格式打印日期、星期和时间
date +%s
:打印 UTC
时间(Unix
时间戳)
date '+%Y-%B-%d %H:%M:%S'
:打印当前日期和时间,注意前面有个 +
号,相当于 PHP
的 date('Y-m-d H:i:s')
,但时间格式符很大程度上不一样了
等于号两侧不能随便加空格,var=value
是赋值,var = value
是相等操作,引用变量使用 美元符var
或者 美元符{var}
(这也是 Perl/PHP
中美元符的来源)
语句末尾的分号可省略,字符串字面量可不用引号包围,也可自由选择单引号或双引号,其中双引号支持变量内插
获取变量的字符串长度:美元符{#var}
(这一特性被 Perl
所继承,PHP
未继承)
使用 echo 美元符SHELL
或 echo 美元符0
可以获知所使用的是哪个 Shell
UID
是一个特殊的只读环境变量,root
用户的 UID
为 0
,可据此判断当前用户是不是管理员
let
可用于赋值操作,且引用变量不需要加美元符,如 let c=a+b
,写成 let c=美元符a+美元符b
也 OK
let
支持自增自减、复合运算符,如 let a++
、let a+=2
此外,美元符[ xxx ]
与 美元符(( xxx ))
也可用于执行赋值操作
普通数组:
#!/user/bin/env bash # 定义数组 arr=(1 2 3 4 5) # 注意,元素间没有逗号 # 逐个赋值 arr[0]='Ruchee1' arr[1]='Ruchee2' # 引用元素 echo ${arr[1]} index=1 echo ${arr[$index]} # 获取数组元素的个数 echo ${#arr[*]} echo ${#arr[@]} # 获取某个数组元素的长度 echo ${#arr[1]}
关联数组:
#!/user/bin/env bash # 定义关联数组 arr=([name]='Ruchee' [email]='my@ruchee.com') # 元素间没有逗号 # 逐个赋值 arr[name]='Ruchee' arr[email]='my@ruchee.com' # 引用元素 echo ${arr[name]} # 获取数组元素的个数 echo ${#arr[*]} echo ${#arr[@]} # 获取某个数组元素的长度 echo ${#arr[name]}
可以用 {start..end}
的形式创建连续数组,如 {1..6}
将生成一个连续数组,元素为 1, 2, 3, 4, 5, 6
,这与 Ruby
的表现类似