特殊字符:
; 命令分隔符。可以在一行上写两个或两个以上的命令。
echo hello; echo there
;; 终止case选项
case "$variable" in
abc) echo "\$variable = abc" ;;
xyz) echo "\$variable = xyz" ;;
esac
. 点命令。等价于source命令。这是一个bash的内建命令。
作为文件名的一部分。点放在文件名的开头,表示这个文件是隐藏文件。如果作为目录明的话,一个单独的点代表当前的工作目录,而两个点代表上一级目录。
“点”字符匹配。当用作匹配字符的作用时,通常都是作为正则表达式的一部分使用,“点”用来匹配任何的单个字符。
"" 部分引用。“STRING”将会阻止(解释)STRING中大部分特殊的字符。
'' 全引用。'STRING'将会阻止STRING中所有特殊字符的解释。这是一种比使用""更强烈的形式。
, 逗号操作符。链接一系列的算术操作。虽然里边所有内容都被运行了,但只有最后一项被返回。
let "t2 = ((a = 9, 15 / 3))"
\ 转义符
/ 文件名路径分隔符。
` 命令替换。`command`结构可以将命令的输出赋值到一个变量中去。
: 空命令。等价于"NOP"(一个什么也不干的命令)。也可以被认为与shell的内建命令true作用相同。":"命令是一个bash的内建命令,它的退出码是"true"(0)。
:
echo $?
死循环:
while :
do
operation-1
operation-2
...
operation-n
在if/then中的占位符:
if condition
then : #什么都不做,引出分支。
else
take-some-action
fi
在一个二元命令中提供一个占位符和默认参数。
: ${username=`whoami`} #如果没有开头的":",将会给出一个错误,除非"username"是一个命令或者内建命令。#这里还使用了命令替换。
使用参数替换来评估字符串变量
: ${HOSTNAME?} ${USER?} ${MAIL?}
变量扩展/字串替换
在与>重定向操作符结合使用时,将会把一个文件清空,但是并不会修改这个文件的权限。如果之前这个文件不存在,那么就创建这个文件。与>>使用不会产生任何影响。
: > data.xxx
:还用来在/etc/passwd和$PATH变量中做分隔符。
bash$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games
! 取反操作符。反转命令的退出码的结果。!操作符是Bash的关键字。
* 通配符。*可以用来作文件名匹配(它有个专有名词叫globbing)的“通配符”。也可以用在正则表达式中,用来匹配任意个数的字符。
* 算术操作符。表示乘法运算。**表示幂运算。
? 测试操作符。在一个特定的表达式中,?用来测试一个条件的结果。
在一个双括号结构中,?就是C语言的三元操作符。
在参数替换表达式中,?用来测试一个变量是否被set了。
? 通配符。?在通配(globbing)中,用来做匹配单个字符的通配符,在正则表达式中,用来表示一个字符。
$ 变量替换(引用变量的内容)
var1=5
var2=23skidoo
echo $var1
$ 行结束符。在正则表达式中,"$"表示行结束符。
${} 参数替换。
$*, $@ 位置参数
$? 退出状态码变量。
$$ 进程ID变量。
() 命令组
(a=hello; echo $a)在括号中的命令列表,将会作为一个子shell来运行。在括号中的变量,由于是在子shell中,所以对于脚本剩下的部分是不可用的。父进程,也就是脚本本身,将不能够读取在子进程中创建的变量,也就是在子shell中创建的变量。
初始化数组
Array=(element1 element2 element3)
{xxx, yyy, zzz, ...}大括号扩展
cat {file1,file2,file3} > combiled_file
#把file1,file2,file3连接在一起并重定向到combiled_file中。
cp file22.{txt, backup}
#拷贝"file22.txt"到"file22.backup"中。
在大括号中,不允许有空白,除非这个空白被引用或转义。
echo {file1,file2} \ :{\ A, " B", ' C'}
{} 代码块。又被称为内部组。这个结构事实上创建了一个匿名函数(一个没有名字的函数)。与"标准"函数不同的是,在其中声明的变量,对于脚本其他部分的代码来说还是可见的。
{} \ 路径名。一般都在find命令中使用。这不是一个shell内建命令。
[] 条件测试。条件测试表达式放在[]中。值得注意的是[是shell内建test命令中的一部分,并不是/usr/bin/test中的外部命令的一个链接。
[[]] 测试。测试表达式放在[[]]中。它是shell关键字。
[] 数组元素。
Array[1]=slot_1
echo ${Array[1]}
[] 字符范围。用作正则表达式的一部分,方括号描述一个匹配的字符范围。
(()) 整数扩展。扩展并计算在(())中的整数表达式。
> &> >& >> < <>重定向
scriptname >filename 重定向scriptname的输出到文件filename中。如果filename存在的话,那么将会被覆盖。
command &>filename 重定向command的stdout和stderr到filename中。
command >&2 重定向command的stdout到stderr中。
scriptname >>filename 把scriptname的输出追加到文件filename中。如果filename不存在的话,将会被创建。
[i]<>filename 打开文件filename用来读写,并且分给文件描述符i给这个文件。如果文件不存在将会被创建。
(command)>
<(command) 进程替换
<< 用在here document中的重定向
<<< 用在here string中的重定向
<, > ASCII比较。即小于号和大于号。
\<, \> 正则表达式中的单词边界。
bash$ grep '\<the\>' textfile
| 管道。分析前边命令的输出,并将输出作为后边命令的输入。这是一种产生命令链的好方法。
echo ls -l | sh
cat *.lst | sort | uniq
管道是进程间通讯的一个典型办法,将一个进程的stdout放到另一个进程的stdin中。标准的方法是将一个一般命令的输出,比如cat或者echo,传递到一个"过滤命令"(在这个过滤命令中将处理输入)中,然后得到结果。
cat $filename1 $filename2 | grep $search_word
管道中的每个进程的stdout必须被下一个进程作为stdin来读入。否则,数据流会阻塞,并且管道将产生一些非预期的行为。
作为子进程的运行的管道,不能够改变脚本的变量。
variable="initial_value"
echo "new_value" | read variable
echo "variable = $variable" #variable = initial_value
如果管道中的某个命令产生了一个一场,并中途失败,那么这个管道将过早的终止,这种行为被叫做broken pipe,并且这种状态下将发送一个SIGPIPE信号。
>| 强制重定向
|| 或-逻辑操作
& 后台运行命令。一个命令后边跟一个&表示在后台运行。
bash$ sleep 10 &
在一个脚本中,命令和循环都可能运行在后台。
for i in 1 2 3 4 5 6 7 8 9 10
do
echo -n "$i "
done & #在后台运行这个循环
&& 与-逻辑操作
- 选项,前缀。在所有的命令内如果想使用选项参数的话,前边都要加上"-".
COMMAND -[Option1][Option2][...]
用于重定向stdin或stdout。以"-"开头的文件名在使用"-"作为重定向操作符的时候,可能会产生问题,应该写一个脚本来检查这个问题,并给这个文件加上合适的前缀。
先前的工作目录
减号
= 等号
+ 加号
在另一种上下文环境中,+也是一种正则表达式操作。
选项。一个命令或者过滤器的选项标记。某些内建命令使用+来打开特定的选项,用-来禁用这些特定的选项。
% 取模
在不同的上下文中,%也是一种模式匹配操作。
~ home目录。相当于$HOME内部变量
~+ 当前工作目录。相当于$PWD内部变量
~- 先前的工作目录。相当于$OLDPWD内部变量。
=~ 正则表达式匹配。
^ 行首。在正则表达式中,"^"表示定位到文本行的行首。
控制字符 修改终端或文本显示的行为。控制字符以CONTROL + key这种方式进行组合。控制字符也可以使用8进制或16进制表示法来进行表示,但是前边必须要加上转义符。控制字符在脚本中不能正常使用。
Ctl-B 退格(非破坏性的),就是退格但不删掉前面的字符。
Ctl-C break.终结一个前台作业。
Ctl-D 从一个shell中登出。
Ctl-G 在一些老式的打字机终端上,它会响一下铃。
Ctl-H 退格(破坏性的),就是退格之后,还要删掉前边的字符。
a="^H^H" #两个Ctl-H
echo "abcdef"
echo -n "abcdef$a " #abcd f
Ctl-I 水平制表符
Ctl-J 重起一行(换一行并到行首)
Ctl-K 垂直制表符
Ctl-L 清屏
Ctl-M 回车
Ctl-Q 恢复(XON).在一个终端中恢复stdin
Ctl-S 挂起(XOFF)。在一个终端中冻结stdin。(使用Ctl-Q可以恢复输入)
Ctl-U 删除光标到行首的所有字符
Ctl-V 当输入字符时,Ctl-V允许插入控制字符。
Ctl-W 当在控制台或一个xterm窗口敲入文本时,Ctl-W将会删除当前光标到左边最近一个空格间的全部字符。在某些设置下,Ctl-W将会删除当前光标左边第一个非字母或数字之间的全部字符。
Ctl-Z 暂停前台作业
空白 用来分隔函数,命令或变量。空白包含空格,tab,空行,或者是它们之间任意的组合体。在某些上下文中,比如变量赋值,空白是不被允许的,会产生语法错误。
空行不会影响脚本的行为,因此使用空行可以很好的划分独立的函数段以增加可读性。
特殊变量$IFS用来做一些输入命令的分隔符,默认情况下是空白。
如果想在字符串或变量中使用空白,那么应该使用引用。
; 命令分隔符。可以在一行上写两个或两个以上的命令。
echo hello; echo there
;; 终止case选项
case "$variable" in
abc) echo "\$variable = abc" ;;
xyz) echo "\$variable = xyz" ;;
esac
. 点命令。等价于source命令。这是一个bash的内建命令。
作为文件名的一部分。点放在文件名的开头,表示这个文件是隐藏文件。如果作为目录明的话,一个单独的点代表当前的工作目录,而两个点代表上一级目录。
“点”字符匹配。当用作匹配字符的作用时,通常都是作为正则表达式的一部分使用,“点”用来匹配任何的单个字符。
"" 部分引用。“STRING”将会阻止(解释)STRING中大部分特殊的字符。
'' 全引用。'STRING'将会阻止STRING中所有特殊字符的解释。这是一种比使用""更强烈的形式。
, 逗号操作符。链接一系列的算术操作。虽然里边所有内容都被运行了,但只有最后一项被返回。
let "t2 = ((a = 9, 15 / 3))"
\ 转义符
/ 文件名路径分隔符。
` 命令替换。`command`结构可以将命令的输出赋值到一个变量中去。
: 空命令。等价于"NOP"(一个什么也不干的命令)。也可以被认为与shell的内建命令true作用相同。":"命令是一个bash的内建命令,它的退出码是"true"(0)。
:
echo $?
死循环:
while :
do
operation-1
operation-2
...
operation-n
在if/then中的占位符:
if condition
then : #什么都不做,引出分支。
else
take-some-action
fi
在一个二元命令中提供一个占位符和默认参数。
: ${username=`whoami`} #如果没有开头的":",将会给出一个错误,除非"username"是一个命令或者内建命令。#这里还使用了命令替换。
使用参数替换来评估字符串变量
: ${HOSTNAME?} ${USER?} ${MAIL?}
变量扩展/字串替换
在与>重定向操作符结合使用时,将会把一个文件清空,但是并不会修改这个文件的权限。如果之前这个文件不存在,那么就创建这个文件。与>>使用不会产生任何影响。
: > data.xxx
:还用来在/etc/passwd和$PATH变量中做分隔符。
bash$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games
! 取反操作符。反转命令的退出码的结果。!操作符是Bash的关键字。
* 通配符。*可以用来作文件名匹配(它有个专有名词叫globbing)的“通配符”。也可以用在正则表达式中,用来匹配任意个数的字符。
* 算术操作符。表示乘法运算。**表示幂运算。
? 测试操作符。在一个特定的表达式中,?用来测试一个条件的结果。
在一个双括号结构中,?就是C语言的三元操作符。
在参数替换表达式中,?用来测试一个变量是否被set了。
? 通配符。?在通配(globbing)中,用来做匹配单个字符的通配符,在正则表达式中,用来表示一个字符。
$ 变量替换(引用变量的内容)
var1=5
var2=23skidoo
echo $var1
$ 行结束符。在正则表达式中,"$"表示行结束符。
${} 参数替换。
$*, $@ 位置参数
$? 退出状态码变量。
$$ 进程ID变量。
() 命令组
(a=hello; echo $a)在括号中的命令列表,将会作为一个子shell来运行。在括号中的变量,由于是在子shell中,所以对于脚本剩下的部分是不可用的。父进程,也就是脚本本身,将不能够读取在子进程中创建的变量,也就是在子shell中创建的变量。
初始化数组
Array=(element1 element2 element3)
{xxx, yyy, zzz, ...}大括号扩展
cat {file1,file2,file3} > combiled_file
#把file1,file2,file3连接在一起并重定向到combiled_file中。
cp file22.{txt, backup}
#拷贝"file22.txt"到"file22.backup"中。
在大括号中,不允许有空白,除非这个空白被引用或转义。
echo {file1,file2} \ :{\ A, " B", ' C'}
{} 代码块。又被称为内部组。这个结构事实上创建了一个匿名函数(一个没有名字的函数)。与"标准"函数不同的是,在其中声明的变量,对于脚本其他部分的代码来说还是可见的。
{} \ 路径名。一般都在find命令中使用。这不是一个shell内建命令。
[] 条件测试。条件测试表达式放在[]中。值得注意的是[是shell内建test命令中的一部分,并不是/usr/bin/test中的外部命令的一个链接。
[[]] 测试。测试表达式放在[[]]中。它是shell关键字。
[] 数组元素。
Array[1]=slot_1
echo ${Array[1]}
[] 字符范围。用作正则表达式的一部分,方括号描述一个匹配的字符范围。
(()) 整数扩展。扩展并计算在(())中的整数表达式。
> &> >& >> < <>重定向
scriptname >filename 重定向scriptname的输出到文件filename中。如果filename存在的话,那么将会被覆盖。
command &>filename 重定向command的stdout和stderr到filename中。
command >&2 重定向command的stdout到stderr中。
scriptname >>filename 把scriptname的输出追加到文件filename中。如果filename不存在的话,将会被创建。
[i]<>filename 打开文件filename用来读写,并且分给文件描述符i给这个文件。如果文件不存在将会被创建。
(command)>
<(command) 进程替换
<< 用在here document中的重定向
<<< 用在here string中的重定向
<, > ASCII比较。即小于号和大于号。
\<, \> 正则表达式中的单词边界。
bash$ grep '\<the\>' textfile
| 管道。分析前边命令的输出,并将输出作为后边命令的输入。这是一种产生命令链的好方法。
echo ls -l | sh
cat *.lst | sort | uniq
管道是进程间通讯的一个典型办法,将一个进程的stdout放到另一个进程的stdin中。标准的方法是将一个一般命令的输出,比如cat或者echo,传递到一个"过滤命令"(在这个过滤命令中将处理输入)中,然后得到结果。
cat $filename1 $filename2 | grep $search_word
管道中的每个进程的stdout必须被下一个进程作为stdin来读入。否则,数据流会阻塞,并且管道将产生一些非预期的行为。
作为子进程的运行的管道,不能够改变脚本的变量。
variable="initial_value"
echo "new_value" | read variable
echo "variable = $variable" #variable = initial_value
如果管道中的某个命令产生了一个一场,并中途失败,那么这个管道将过早的终止,这种行为被叫做broken pipe,并且这种状态下将发送一个SIGPIPE信号。
>| 强制重定向
|| 或-逻辑操作
& 后台运行命令。一个命令后边跟一个&表示在后台运行。
bash$ sleep 10 &
在一个脚本中,命令和循环都可能运行在后台。
for i in 1 2 3 4 5 6 7 8 9 10
do
echo -n "$i "
done & #在后台运行这个循环
&& 与-逻辑操作
- 选项,前缀。在所有的命令内如果想使用选项参数的话,前边都要加上"-".
COMMAND -[Option1][Option2][...]
用于重定向stdin或stdout。以"-"开头的文件名在使用"-"作为重定向操作符的时候,可能会产生问题,应该写一个脚本来检查这个问题,并给这个文件加上合适的前缀。
先前的工作目录
减号
= 等号
+ 加号
在另一种上下文环境中,+也是一种正则表达式操作。
选项。一个命令或者过滤器的选项标记。某些内建命令使用+来打开特定的选项,用-来禁用这些特定的选项。
% 取模
在不同的上下文中,%也是一种模式匹配操作。
~ home目录。相当于$HOME内部变量
~+ 当前工作目录。相当于$PWD内部变量
~- 先前的工作目录。相当于$OLDPWD内部变量。
=~ 正则表达式匹配。
^ 行首。在正则表达式中,"^"表示定位到文本行的行首。
控制字符 修改终端或文本显示的行为。控制字符以CONTROL + key这种方式进行组合。控制字符也可以使用8进制或16进制表示法来进行表示,但是前边必须要加上转义符。控制字符在脚本中不能正常使用。
Ctl-B 退格(非破坏性的),就是退格但不删掉前面的字符。
Ctl-C break.终结一个前台作业。
Ctl-D 从一个shell中登出。
Ctl-G 在一些老式的打字机终端上,它会响一下铃。
Ctl-H 退格(破坏性的),就是退格之后,还要删掉前边的字符。
a="^H^H" #两个Ctl-H
echo "abcdef"
echo -n "abcdef$a " #abcd f
Ctl-I 水平制表符
Ctl-J 重起一行(换一行并到行首)
Ctl-K 垂直制表符
Ctl-L 清屏
Ctl-M 回车
Ctl-Q 恢复(XON).在一个终端中恢复stdin
Ctl-S 挂起(XOFF)。在一个终端中冻结stdin。(使用Ctl-Q可以恢复输入)
Ctl-U 删除光标到行首的所有字符
Ctl-V 当输入字符时,Ctl-V允许插入控制字符。
Ctl-W 当在控制台或一个xterm窗口敲入文本时,Ctl-W将会删除当前光标到左边最近一个空格间的全部字符。在某些设置下,Ctl-W将会删除当前光标左边第一个非字母或数字之间的全部字符。
Ctl-Z 暂停前台作业
空白 用来分隔函数,命令或变量。空白包含空格,tab,空行,或者是它们之间任意的组合体。在某些上下文中,比如变量赋值,空白是不被允许的,会产生语法错误。
空行不会影响脚本的行为,因此使用空行可以很好的划分独立的函数段以增加可读性。
特殊变量$IFS用来做一些输入命令的分隔符,默认情况下是空白。
如果想在字符串或变量中使用空白,那么应该使用引用。