返回首页 - Notes - 2014

Bash 基础


基本命令

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


常用工具

exprbc 可用于数值计算,其中 expr 只能用于整数运算

sleep 可用于设置延时,和 PHP 表现一致

调试 Bash 脚本可用 bash -x file.sh 的方式运行,Bash 内置调试器会实时打印脚本每一行的运行状态

可以在脚本中用 set 语句控制调试信息的输出与否


基本概念

文件描述符的 0标准输入)、1标准输出)、2标准错误) 是系统预留

可用 >>>文件描述符编号>文件描述符编号>> 实现输出重定向

可用 文件描述符编号+操作类型 的方式指定重定向文件描述符,如 cmd 2> err.txt

可用 & 符号将多个文件描述符重定向同一个,如 cmd out.txt 2>&1cmd &> 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


日期和时间


语法规则

等于号两侧不能随便加空格,var=value 是赋值,var = value 是相等操作,引用变量使用 美元符var 或者 美元符{var}(这也是 Perl/PHP 中美元符的来源)

语句末尾的分号可省略,字符串字面量可不用引号包围,也可自由选择单引号或双引号,其中双引号支持变量内插

获取变量的字符串长度:美元符{#var}(这一特性被 Perl 所继承,PHP 未继承)

使用 echo 美元符SHELLecho 美元符0 可以获知所使用的是哪个 Shell

UID 是一个特殊的只读环境变量,root 用户的 UID0,可据此判断当前用户是不是管理员

let 可用于赋值操作,且引用变量不需要加美元符,如 let c=a+b,写成 let c=美元符a+美元符bOK

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 的表现类似


date : 2014-08-09、2014-08-11、2014-08-15、2014-08-18