风流邪警txt全集下载:shell脚本中一些特殊符号
来源:百度文库 编辑:九乡新闻网 时间:2024/07/14 06:45:28
shell脚本中一些特殊符号
1、{} 大括号:
用法一:通配符扩展
代码:
ls my_{finger,toe}s
这条命令相当于如下命令的组合:
ls my_fingers my_toes
mkdir {userA,userB,userC}-{home,bin,data}
我们将得到 userA-home, userA-bin, userA-data, userB-home, userB-bin,userB-data,userC-home, userC-bin, userC-data,这几个目录
用法二:可用于语句块的构造,语句之间用回车隔开。如果你想在某些使用单个语句的地方(比如在AND或OR列表中)使用多条语句,你可以把它们括在花括号{}中来构造一个语句块。
代码:
grep -v "$cdcatnum" $strack_file > $temp_file
cat $temp_file > $strack_file
echo
cat -n file1
(注:以上大括号中的四句命令够成了一个语句块)
用法三:参数扩展
代码:
${name:-default} 使用一个默认值(一般是空值)来代替那些空的或者没有赋值的变量 name;
${name:=default}使用指定值来代替空的或者没有赋值的变量 name;
${name:?message}如果变量为空或者未赋值,那么就会显示出错误信息并中止脚本的执行同时返回退出码 1。
${#name} 给出name的长度
${name%word} 从name的尾部开始删除与word匹配的最小部分,然后返回剩余部分
${name%%word} 从name的尾部开始删除与word匹配的最长部分,然后返回剩余部分
${name#word} 从name的头部开始删除与word匹配的最小部分,然后返回剩余部分
${name##word} 从name的头部开始删除与word匹配的最长部分,然后返回剩余部分
(注,name为变量名,word为要匹配的字符串)
用法三在处理字符串和未知变量时,是很有用的。
2、[] 中括号:
用法一:通配符扩展:
允许匹配方括号中任何一个单个字符
代码:
ls /[eh][to][cm]*
相当于执行 ls /etc /home(若有/eom目录,就相当于会执行ls /etc /home /eom)
注:在mkdir命令下不能扩展
用法二:用于条件判断符号:
[]符号可理解为指向test命令的一个软链接,所以其用法可完全参照test,将test位置替换为[便可。
代码:
if [ "$?" != 0 ] 等价于 if test "$?" != 0
then echo "Executes error"
3、`command` 反引号:
`command`与$(command)的含义相同,都是返回当前执行命令的结果
代码:
#!/bin/sh
for file in $(ls f*.sh);do
lpr $file
done
exit 0
该例实现了扩展f*.sh给出所有匹配模式的文件的名字。
4、'string' 单引号 和 "string" 双引号
双引号:如果想在定义的变量中加入空格,就必须使用单引号或双引号,
单、双引号的区别在于双引号转义特殊字符而单引号不转义特殊字符
代码:
$ heyyou=home
$ echo '$heyyou'
$ $heyyou ($没有转义)
eg: $ heyyou=home
$ echo "$heyyou"
$ home (很明显,$转义了输出了heyyou变量的值)
5、$# 它的作用是告诉你引用变量的总数量是多少;
代码:
$$ 它的作用是告诉你shell脚本的进程号;
$* 以一个单字符串显示所有的脚本传递的参数。等价于$1 $2 $3![](http://image37.360doc.cn/DownloadImg/2011/09/1911/17755999_1.gif)
.;
$@ 与$*基本类似(参见序号7),但在数组赋值时有些不同;
$ 前一个命令的退出码;
$- 显示shell使用的当前选项;
$! 最后一个后台运行的进程ID 号。
6、$((
))语法:对括号内的表达式求值
代码:
#!/bin/sh
x=0
hile [ "$x" -ne 10 ];do
echo $x
x=$(($x+1))
done
exit 0
7、shell中几种特殊的参数变量的引用
代码:
$1、$2、$3……${10}、${11}、${12}…… :表示脚本传入的的各个参数,注意当需表示两位数以后的参数时数字要用花括号括起。
$@ 列出所有的参数,各参数用空格隔开
$*: 列出所有的参数,各参数用环境变量IFS的第一个字符隔开
8、命令列表:
AND列表 statement1 && statement2 && statement3 && …:只有在前面所有的命令都执行成功的情况下才执行后一条命令
OR列表 statement1 || statement2 || statement3 || …:允许执行一系列命令直到有一条命令成功为止,其后所有命令将不再被执行
#!/bin/sh
代码:
touch file_one
rm -f file_two
if [ -f file_one ] && echo "hello" && [ -f file_two ] && echo " there"
then
echo "in if"
else
echo "in else"
fi
exit 0
上例的输出为:
代码:
hello
in else
关于AND列表与OR列表,在逻辑判断中很使用,下面就举一个其最常用的例子:
代码:
[ condition ] && command for true || command for false:
当条件为真时,执行 commandfor true ,当条件为假时,执行command for false
9、: 冒号:内建空指令,返回值为0
代码:
$ :
$ echo $
$ 0
while: (该语句结构可实现一个无限循环)
10、; 分号: 在 shell 中,担任"连续指令"功能的符号就是"分号"
代码:
cd ~/backup ; mkdir startup ; cp ~/.* startup/.
11、# 井号:表示符号后面的是注解文字,不会被执行;
代码:
* 匹配文件名中的任何字符,包括字符串;
匹配文件名中的任何单个字符。
~ 代表使用者的 home 目录
12、\ 反斜线:
放在指令前,有取消 aliases(别名) 的作用;
放在特殊符号前,则该特殊符号的作用消失;
放在指令的最末端,表示指令连接下一行(使得回车符无效,只起换行作用)
13、! 感叹号:
通常它代表反逻辑的作用,譬如条件侦测中,用 != 来代表"不等于"
14、** 次方运算:两个星号在运算时代表 "次方" 的意思
代码:
let "sus=2**3"
echo "sus = $sus"
$ sus = 8 -
标准的引用和转义字符(" '/) 可以用来转义#
; 命令分隔符,可以用来在一行中来写多个命令
;; 终止case选项
. .命令等价于source命令
. .作为文件名的一部分。如果作为文件名的前缀的话,那么这个文件将成为隐藏文件。将不为ls列出
. .作为正则表达式的一部分,用来匹配任何的单个字符
" 部分引用."STRING"阻止了一部分特殊字符。
' 全引用.'STRING'阻止了全部特殊字符
, 逗号链接了一些列的算诉操作系列的算术操作,虽然里边所有的内容都被运行了,但只有最后一项被返回。
/ 转义字符,如/X等价于"X"
/ 文件名路径分
" 部分引用."STRING"阻止了一部分特殊字符。
' 全引用.'STRIN割符,或用来做除法操作.
`
, 逗号链接了一系列的算术操作,虽然里边所有的内容都被运行了,但只有最后一项被
返回.
如:
1 let "t2 = ((a = 9, 15 / 3))" # Set "a = 9" and "t2 = 15 / 3"
/ 转义字符,如/X 等价于"X"或'X',具体见第 5 章.
/ 文件名路径分隔符.或用来做除法操作.
` 后置引用,命令替换,具体见第 14 章
: 空命令,等价于"NOP"(no op,一个什么也不干的命令).也可以被认为与 shell 的内建命令
(true)作用相同.":"命令是一个 bash 的内建命令,它的返回值为 0,就是 shell 返回的 true.
! 取反操作符,将反转"退出状态"结果,(见 Example 6-2).也会反转 test 操作符的意义.比
如修改=为!=.!操作是 Bash 的一个关键字.
* 万能匹配字符,用于文件名匹配(这个东西有个专有名词叫 file globbing),或者是正则
表达式中.注意:在正则表达式匹配中的作用和在文件名匹配中的作用是不同的.
* 数学乘法.
**是幂运算.
测试操作.在一个确定的表达式中,用?来测试结果.
(())结构可以用来做数学计算或者是写 c 代码,那?就是 c 语言的 3 元操作符的
一个.
在"参数替换"中,?测试一个变量是否被 set 了.
在 file globbing 中和在正则表达式中一样匹配任意的单个字符.
$ 变量替换
$ 在正则表达式中作为行结束符.
${} 参数替换
$*,$@ 位置参数
$? 退出状态变量.$?保存一个命令/一个函数或者脚本本身的退出状态.
$$ 进程 ID 变量.这个$$变量保存运行脚本进程 ID
() 命令组.如:
1 (a=hello;echo $a)
注意:在()中的命令列表,将作为一个子 shell 来运行.
在()中的变量,由于是在子 shell 中,所以对于脚本剩下的部分是不可用的.
如:
1 a=123
2 ( a=321; )
3
4 echo "a = $a" # a = 123
5 # 在圆括号中 a 变量,更像是一个局部变量.
用在数组初始化, 如:
1 Array=(element1,element2,element3)
{xxx,yyy,zzz...}
大括号扩展, 如:
1 cat {file1,file2,file3} > combined_file
2 # 把 file1,file2,file3 连接在一起,并且重定向到 combined_file 中.
3
4
5 cp file22.{txt,backup}
6 # 拷贝"file22.txt" 到"file22.backup" 中
一个命令可能会对大括号中的以逗号分割的文件列表起作用[1]. file globbing 将对
大括号中的文件名作扩展.
注意: 在大括号中,不允许有空白,除非这个空白是有意义的.
echo {file1,file2}/ :{/ A," B",' C'}
file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C
{} 代码块.又被称为内部组.事实上,这个结构创建了一个匿名的函数.但是与函数不同的
是,在其中声明的变量,对于脚本其他部分的代码来说还是可见的. 如:
bash$
{
local a;
a= 123;
}
bash 中的 local 申请的变量只能够用在函数中.
1 a=123
2 { a=321; }
3 echo "a = $a" # a = 321 (说明在代码块中对变量 a 所作的修改,影响了外边的变
量 a)
4
5 # Thanks, S.C.
注意: 与()中的命令不同的是,{}中的代码块将不能正常地开启一个新 shell.[2]
{} /; 路径名.一般都在 find 命令中使用.这不是一个 shell 内建命令.
注意: ";"用来结束 find 命令序列的-exec 选项.
[] test.
test 的表达式将在[] 中.
值得注意的是[是 shell 内建 test 命令的一部分,并不是/usr/bin/test 中的扩展命令
的一个连接.
[[]] test.
test 表达式放在[[]]中.(shell 关键字)
具体查看[[]]结构的讨论.
[] 数组元素
Array[1]=slot_1
echo ${Array[1]}
[] 字符范围
在正则表达式中使用,作为字符匹配的一个范围
(()) 数学计算的扩展
在(())结构中可以使用一些数字计算.
具体参阅((...))结构.
>&>>&>><
重定向.
scriptname >filename 重定向脚本的输出到文件中.覆盖文件原有内容.
command &>filename 重定向 stdout 和 stderr 到文件中
command >&2 重定向 command 的 stdout 到 stderr
scriptname >>filename 重定向脚本的输出到文件中.添加到文件尾端,如果没有文件,
则创建这个文件.
进程替换,具体见"进程替换部分",跟命令替换极其类似.
(command)>
<(command)
<和> 可用来做字符串比较
<和> 可用在数学计算比较
<< 重定向,用在"here document"
<<< 重定向,用在"here string"
<,> ASCII 比较
/<,/> 正则表达式中的单词边界. 如:
bash$grep '/ ' textfile
| 管道.分析前边命令的输出,并将输出作为后边命令的输入.这是一种产生命令链的
好方法.
1 echo ls -l | sh
2 # 传递"echo ls -l"的输出到 shell 中,
3 #+ 与一个简单的"ls -l"结果相同.
4
5
6 cat *.lst | sort | uniq
7 # 合并和排序所有的".lst"文件,然后删除所有重复的行.
管道是进程间通讯的一个典型办法,将一个进程的 stdout 放到另一个进程的 stdin 中.
标准的方法是将一个一般命令的输出,比如 cat 或 echo,传递到一个过滤命令中(在这个
过滤命令中将处理输入),得到结果, 如:
cat $filename1 | $filename2 | grep $search_word
当然输出的命令也可以传递到脚本中.如:
>| 强制重定向(即使设置了 noclobber 选项--就是-C 选项).这将强制的覆盖一个现存文件.
|| 或-逻辑操作.
& 后台运行命令.一个命令后边跟一个&,将表示在后台运行.
- 用于重定向 stdin 或 stdout.
注意:以"-"开头的文件名在使用"-"作为重定向操作符的时候,可能会产生问题.
应该写一个脚本来检查这个问题,并给这个文件加上合适的前缀. 如:
./-FILENAME, $PWD/-FILENAME,或$PATHNAME /-FILENAME.
如果变量的值以"-"开头,可能也会引起问题.
1 var="-n"
2 echo $var
3 #具有"echo -n"的效果了,这样什么都不会输出的.
- 之前工作的目录."cd -"将回到之前的工作目录,具体请参考"$OLDPWD"环境变量.
注意:一定要和之前讨论的重定向功能分开,但是只能依赖上下文区分.
- 算术减号.
= 算术等号,有时也用来比较字符串.
1 a=28
2 echo $a # 28
+ 算术加号,也用在正则表达式中.
+ 选项,对于特定的命令来说使用"+"来打开特定的选项,用"-"来关闭特定的选项.
% 算术取模运算.也用在正则表达式中.
~ home 目录.相当于$HOME 变量.
~+ 当前工作目录,相当于$PWD 变量.
~- 之前的工作目录,相当于$OLDPWD 内部变量.
=~ 用于正则表达式,这个操作将在正则表达式匹配部分讲解,只有 version3 才支持.
^ 行首,正则表达式中表示行首."^"定位到行首.
1、{} 大括号:
用法一:通配符扩展
代码:
ls my_{finger,toe}s
这条命令相当于如下命令的组合:
ls my_fingers my_toes
mkdir {userA,userB,userC}-{home,bin,data}
我们将得到 userA-home, userA-bin, userA-data, userB-home, userB-bin,userB-data,userC-home, userC-bin, userC-data,这几个目录
用法二:可用于语句块的构造,语句之间用回车隔开。如果你想在某些使用单个语句的地方(比如在AND或OR列表中)使用多条语句,你可以把它们括在花括号{}中来构造一个语句块。
代码:
grep -v "$cdcatnum" $strack_file > $temp_file
cat $temp_file > $strack_file
echo
cat -n file1
(注:以上大括号中的四句命令够成了一个语句块)
用法三:参数扩展
代码:
${name:-default} 使用一个默认值(一般是空值)来代替那些空的或者没有赋值的变量 name;
${name:=default}使用指定值来代替空的或者没有赋值的变量 name;
${name:?message}如果变量为空或者未赋值,那么就会显示出错误信息并中止脚本的执行同时返回退出码 1。
${#name} 给出name的长度
${name%word} 从name的尾部开始删除与word匹配的最小部分,然后返回剩余部分
${name%%word} 从name的尾部开始删除与word匹配的最长部分,然后返回剩余部分
${name#word} 从name的头部开始删除与word匹配的最小部分,然后返回剩余部分
${name##word} 从name的头部开始删除与word匹配的最长部分,然后返回剩余部分
(注,name为变量名,word为要匹配的字符串)
用法三在处理字符串和未知变量时,是很有用的。
2、[] 中括号:
用法一:通配符扩展:
允许匹配方括号中任何一个单个字符
代码:
ls /[eh][to][cm]*
相当于执行 ls /etc /home(若有/eom目录,就相当于会执行ls /etc /home /eom)
注:在mkdir命令下不能扩展
用法二:用于条件判断符号:
[]符号可理解为指向test命令的一个软链接,所以其用法可完全参照test,将test位置替换为[便可。
代码:
if [ "$?" != 0 ] 等价于 if test "$?" != 0
then echo "Executes error"
3、`command` 反引号:
`command`与$(command)的含义相同,都是返回当前执行命令的结果
代码:
#!/bin/sh
for file in $(ls f*.sh);do
lpr $file
done
exit 0
该例实现了扩展f*.sh给出所有匹配模式的文件的名字。
4、'string' 单引号 和 "string" 双引号
双引号:如果想在定义的变量中加入空格,就必须使用单引号或双引号,
单、双引号的区别在于双引号转义特殊字符而单引号不转义特殊字符
代码:
$ heyyou=home
$ echo '$heyyou'
$ $heyyou ($没有转义)
eg: $ heyyou=home
$ echo "$heyyou"
$ home (很明显,$转义了输出了heyyou变量的值)
5、$# 它的作用是告诉你引用变量的总数量是多少;
代码:
$$ 它的作用是告诉你shell脚本的进程号;
$* 以一个单字符串显示所有的脚本传递的参数。等价于$1 $2 $3
![](http://image37.360doc.cn/DownloadImg/2011/09/1911/17755999_1.gif)
![](http://image37.360doc.cn/DownloadImg/2011/09/1911/17755999_1.gif)
$@ 与$*基本类似(参见序号7),但在数组赋值时有些不同;
$ 前一个命令的退出码;
$- 显示shell使用的当前选项;
$! 最后一个后台运行的进程ID 号。
6、$((
![](http://image37.360doc.cn/DownloadImg/2011/09/1911/17755999_1.gif)
代码:
#!/bin/sh
x=0
hile [ "$x" -ne 10 ];do
echo $x
x=$(($x+1))
done
exit 0
7、shell中几种特殊的参数变量的引用
代码:
$1、$2、$3……${10}、${11}、${12}…… :表示脚本传入的的各个参数,注意当需表示两位数以后的参数时数字要用花括号括起。
$@ 列出所有的参数,各参数用空格隔开
$*: 列出所有的参数,各参数用环境变量IFS的第一个字符隔开
8、命令列表:
AND列表 statement1 && statement2 && statement3 && …:只有在前面所有的命令都执行成功的情况下才执行后一条命令
OR列表 statement1 || statement2 || statement3 || …:允许执行一系列命令直到有一条命令成功为止,其后所有命令将不再被执行
#!/bin/sh
代码:
touch file_one
rm -f file_two
if [ -f file_one ] && echo "hello" && [ -f file_two ] && echo " there"
then
echo "in if"
else
echo "in else"
fi
exit 0
上例的输出为:
代码:
hello
in else
关于AND列表与OR列表,在逻辑判断中很使用,下面就举一个其最常用的例子:
代码:
[ condition ] && command for true || command for false:
当条件为真时,执行 commandfor true ,当条件为假时,执行command for false
9、: 冒号:内建空指令,返回值为0
代码:
$ :
$ echo $
$ 0
while: (该语句结构可实现一个无限循环)
10、; 分号: 在 shell 中,担任"连续指令"功能的符号就是"分号"
代码:
cd ~/backup ; mkdir startup ; cp ~/.* startup/.
11、# 井号:表示符号后面的是注解文字,不会被执行;
代码:
* 匹配文件名中的任何字符,包括字符串;
匹配文件名中的任何单个字符。
~ 代表使用者的 home 目录
12、\ 反斜线:
放在指令前,有取消 aliases(别名) 的作用;
放在特殊符号前,则该特殊符号的作用消失;
放在指令的最末端,表示指令连接下一行(使得回车符无效,只起换行作用)
13、! 感叹号:
通常它代表反逻辑的作用,譬如条件侦测中,用 != 来代表"不等于"
14、** 次方运算:两个星号在运算时代表 "次方" 的意思
代码:
let "sus=2**3"
echo "sus = $sus"
$ sus = 8 -
linux_shell 特殊符号的介绍
#:注释,行首以#开头为注释标准的引用和转义字符(" '/) 可以用来转义#
; 命令分隔符,可以用来在一行中来写多个命令
;; 终止case选项
. .命令等价于source命令
. .作为文件名的一部分。如果作为文件名的前缀的话,那么这个文件将成为隐藏文件。将不为ls列出
. .作为正则表达式的一部分,用来匹配任何的单个字符
" 部分引用."STRING"阻止了一部分特殊字符。
' 全引用.'STRING'阻止了全部特殊字符
, 逗号链接了一些列的算诉操作系列的算术操作,虽然里边所有的内容都被运行了,但只有最后一项被返回。
/ 转义字符,如/X等价于"X"
/ 文件名路径分
" 部分引用."STRING"阻止了一部分特殊字符。
' 全引用.'STRIN割符,或用来做除法操作.
`
, 逗号链接了一系列的算术操作,虽然里边所有的内容都被运行了,但只有最后一项被
返回.
如:
1 let "t2 = ((a = 9, 15 / 3))" # Set "a = 9" and "t2 = 15 / 3"
/ 转义字符,如/X 等价于"X"或'X',具体见第 5 章.
/ 文件名路径分隔符.或用来做除法操作.
` 后置引用,命令替换,具体见第 14 章
: 空命令,等价于"NOP"(no op,一个什么也不干的命令).也可以被认为与 shell 的内建命令
(true)作用相同.":"命令是一个 bash 的内建命令,它的返回值为 0,就是 shell 返回的 true.
! 取反操作符,将反转"退出状态"结果,(见 Example 6-2).也会反转 test 操作符的意义.比
如修改=为!=.!操作是 Bash 的一个关键字.
* 万能匹配字符,用于文件名匹配(这个东西有个专有名词叫 file globbing),或者是正则
表达式中.注意:在正则表达式匹配中的作用和在文件名匹配中的作用是不同的.
* 数学乘法.
**是幂运算.
测试操作.在一个确定的表达式中,用?来测试结果.
(())结构可以用来做数学计算或者是写 c 代码,那?就是 c 语言的 3 元操作符的
一个.
在"参数替换"中,?测试一个变量是否被 set 了.
在 file globbing 中和在正则表达式中一样匹配任意的单个字符.
$ 变量替换
$ 在正则表达式中作为行结束符.
${} 参数替换
$*,$@ 位置参数
$? 退出状态变量.$?保存一个命令/一个函数或者脚本本身的退出状态.
$$ 进程 ID 变量.这个$$变量保存运行脚本进程 ID
() 命令组.如:
1 (a=hello;echo $a)
注意:在()中的命令列表,将作为一个子 shell 来运行.
在()中的变量,由于是在子 shell 中,所以对于脚本剩下的部分是不可用的.
如:
1 a=123
2 ( a=321; )
3
4 echo "a = $a" # a = 123
5 # 在圆括号中 a 变量,更像是一个局部变量.
用在数组初始化, 如:
1 Array=(element1,element2,element3)
{xxx,yyy,zzz...}
大括号扩展, 如:
1 cat {file1,file2,file3} > combined_file
2 # 把 file1,file2,file3 连接在一起,并且重定向到 combined_file 中.
3
4
5 cp file22.{txt,backup}
6 # 拷贝"file22.txt" 到"file22.backup" 中
一个命令可能会对大括号中的以逗号分割的文件列表起作用[1]. file globbing 将对
大括号中的文件名作扩展.
注意: 在大括号中,不允许有空白,除非这个空白是有意义的.
echo {file1,file2}/ :{/ A," B",' C'}
file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C
{} 代码块.又被称为内部组.事实上,这个结构创建了一个匿名的函数.但是与函数不同的
是,在其中声明的变量,对于脚本其他部分的代码来说还是可见的. 如:
bash$
{
local a;
a= 123;
}
bash 中的 local 申请的变量只能够用在函数中.
1 a=123
2 { a=321; }
3 echo "a = $a" # a = 321 (说明在代码块中对变量 a 所作的修改,影响了外边的变
量 a)
4
5 # Thanks, S.C.
注意: 与()中的命令不同的是,{}中的代码块将不能正常地开启一个新 shell.[2]
{} /; 路径名.一般都在 find 命令中使用.这不是一个 shell 内建命令.
注意: ";"用来结束 find 命令序列的-exec 选项.
[] test.
test 的表达式将在[] 中.
值得注意的是[是 shell 内建 test 命令的一部分,并不是/usr/bin/test 中的扩展命令
的一个连接.
[[]] test.
test 表达式放在[[]]中.(shell 关键字)
具体查看[[]]结构的讨论.
[] 数组元素
Array[1]=slot_1
echo ${Array[1]}
[] 字符范围
在正则表达式中使用,作为字符匹配的一个范围
(()) 数学计算的扩展
在(())结构中可以使用一些数字计算.
具体参阅((...))结构.
>&>>&>><
重定向.
scriptname >filename 重定向脚本的输出到文件中.覆盖文件原有内容.
command &>filename 重定向 stdout 和 stderr 到文件中
command >&2 重定向 command 的 stdout 到 stderr
scriptname >>filename 重定向脚本的输出到文件中.添加到文件尾端,如果没有文件,
则创建这个文件.
进程替换,具体见"进程替换部分",跟命令替换极其类似.
(command)>
<(command)
<和> 可用来做字符串比较
<和> 可用在数学计算比较
<< 重定向,用在"here document"
<<< 重定向,用在"here string"
<,> ASCII 比较
/<,/> 正则表达式中的单词边界. 如:
bash$grep '/
| 管道.分析前边命令的输出,并将输出作为后边命令的输入.这是一种产生命令链的
好方法.
1 echo ls -l | sh
2 # 传递"echo ls -l"的输出到 shell 中,
3 #+ 与一个简单的"ls -l"结果相同.
4
5
6 cat *.lst | sort | uniq
7 # 合并和排序所有的".lst"文件,然后删除所有重复的行.
管道是进程间通讯的一个典型办法,将一个进程的 stdout 放到另一个进程的 stdin 中.
标准的方法是将一个一般命令的输出,比如 cat 或 echo,传递到一个过滤命令中(在这个
过滤命令中将处理输入),得到结果, 如:
cat $filename1 | $filename2 | grep $search_word
当然输出的命令也可以传递到脚本中.如:
>| 强制重定向(即使设置了 noclobber 选项--就是-C 选项).这将强制的覆盖一个现存文件.
|| 或-逻辑操作.
& 后台运行命令.一个命令后边跟一个&,将表示在后台运行.
- 用于重定向 stdin 或 stdout.
注意:以"-"开头的文件名在使用"-"作为重定向操作符的时候,可能会产生问题.
应该写一个脚本来检查这个问题,并给这个文件加上合适的前缀. 如:
./-FILENAME, $PWD/-FILENAME,或$PATHNAME /-FILENAME.
如果变量的值以"-"开头,可能也会引起问题.
1 var="-n"
2 echo $var
3 #具有"echo -n"的效果了,这样什么都不会输出的.
- 之前工作的目录."cd -"将回到之前的工作目录,具体请参考"$OLDPWD"环境变量.
注意:一定要和之前讨论的重定向功能分开,但是只能依赖上下文区分.
- 算术减号.
= 算术等号,有时也用来比较字符串.
1 a=28
2 echo $a # 28
+ 算术加号,也用在正则表达式中.
+ 选项,对于特定的命令来说使用"+"来打开特定的选项,用"-"来关闭特定的选项.
% 算术取模运算.也用在正则表达式中.
~ home 目录.相当于$HOME 变量.
~+ 当前工作目录,相当于$PWD 变量.
~- 之前的工作目录,相当于$OLDPWD 内部变量.
=~ 用于正则表达式,这个操作将在正则表达式匹配部分讲解,只有 version3 才支持.
^ 行首,正则表达式中表示行首."^"定位到行首.