{}

代码块[花括号]. 这个结构也是一组命令代码块,事实上,它是匿名的函数。然而与一个函数所不同的,在代码块里的变量仍然能被脚本后面的代码访问。

 bash$ { local a;
     a=123; }
 bash: local: can only be used in a
function
       

a=123
{ a=321; }
echo "a = $a"   # a = 321   (结果是在代码块里的值)

由花括号括起的代码块可以引起输入输出的I/O重定向。

#!/bin/bash
# 从/etc/fstab文件里按一次一行地读.

File=/etc/fstab

{
read line1
read line2
} < $File

echo "First line in $File is:"
echo "$line1"
echo
echo "Second line in $File is:"
echo "$line2"

exit 0

# 现在,你如何解析每一行的分割符?
# 提示: 使用awk.

  把一个代码块的结果写进一个文件

#!/bin/bash
# rpm-check.sh

# 查询一个rpm安装包的描述,软件清单,和是否它能够被安装.
# 并把结果保存到一个文件中.

# 这个脚本使用一个代码块来举例说明。

SUCCESS=0
E_NOARGS=65

if [ -z "$1" ]
then
  echo "Usage: `basename $0` rpm-file"
  exit $E_NOARGS
fi  


  echo
  echo "Archive Description:"
  rpm -qpi $1       # 查询软件包的描述.
  echo
  echo "Archive Listing:"
  rpm -qpl $1       # 查询软件包中的软件清单.
  echo
  rpm -i --test $1  # 查询该软件包能否被安装.
  if [ "$?" -eq $SUCCESS ]
  then
    echo "$1 can be installed."
  else
    echo "$1 cannot be installed."
  fi  
  echo
} > "$1.test"       # 把代码块的所有输出重定向到一个文件中。

echo "Results of rpm test in file $1.test"

# 参考rpm的man手册来理解上面所用的选项。

exit 0

不像一个用圆括号括起来的命令组,一个用花括号括起的代码块不会以一个子shell运行。[2]

{} \;
路径名. 基本上用于find命令里.它不是shell内建的.


分号";"结束find命令中-exec选项的命令序列.它应该转义一下以免被shell误解释。

[ ]
测试.

测试在[ ]中的表达式. 注意[是shell内建的测试的一部分(同义于测试),并非 是外部命令/usr/bin/test的链接.

[[ ]]
测试.

测试[[ ]]之中的表达式(shell的关键字).

参考[[ ... ]]结构的讨论.

[ ]
数组元素.

在数组的上下文中,方括号表示数组的每个元素的数字编号.
   1 Array[1]=slot_1
   2 echo ${Array[1]}

[ ]
字符集的范围.

用于正则表达式的一部分,方括号描述一个匹配的字符集范围.

(( ))
整数扩展.

扩展并计算(( ))里的整数表达式[译者注:粗心的读者要注意了,是整数计算,可不能用来做浮点计算].

参考(( ... ))结构的讨论.

> &> >& >> <
redirection重定向.

scriptname >filename重定向scriptname的输出到文件filename中去. 如果文件filename存在则将会被覆盖.

command &>filename 会重定向命令command标准输出(stdout)和标准错误(stderr)到文件filename中.

command >&2 把命令command的标准输出(stdout)重定向到标准错误(stderr).

scriptname >>filename appends把脚本scriptname的输出追加到文件filename.如果filename不存在,则它会被创建.

进程替换.

(command)>

<(command)

在不同的上下文中, 字符 "<"和">"会被当作字符比较操作符.

在另一种不同的上下文中, 字符"<"和">"被当作整数比较操作符. 请参考例子 12-9.

<<
在here document中使用的重定向.

<<<
在 here string中使用的重定向.

<, >
ASCII比较.
veg1=carrots
veg2=tomatoes

if [[ "$veg1" < "$veg2" ]]
then
  echo "Although $veg1 precede $veg2 in the dictionary,"
  echo "this implies nothing about my culinary preferences."
else
  echo "What kind of dictionary are you using, anyhow?"
fi

\<, \>
在 regular expression中的单词界线.

bash$ grep '\<the\>' textfile

|

管道. 把上一个命令的输出传给下一个命令,或是shell. 这是连接命令的一种方法.

echo ls -l | sh
#  把"echo ls -l"的输出传给shell,
#+ 这等同与直接的"ls -l".

cat *.lst | sort | uniq
# 合并且排序所有的".lst"文件,然后删除多余的相同行.

经典的进程间通信方法之一的管道能把一个进程的标准输出发到另一个进程的标准输入.在一种典型的情况,一个命令,比如说cat或echo, 管道传递一个数据流给过滤器(一个改变了它的输入的命令)。

cat $filename1 $filename2 | grep $search_word

一个命令或一组命令的输出可以由管道传给一个脚本.
#!/bin/bash
# uppercase.sh : 把输入字符改为大写.

tr 'a-z' 'A-Z'
#  字母的范围一定要引号引起来,
#+ 这样才能保护文件名而不会被扩展成单个字母的文件名.

exit 0
现在,让我们把ls -l的输出用管道与这个脚本连起来.
 bash$ ls -l | ./uppercase.sh
 -RW-RW-R--    1 BOZO  BOZO       109 APR  7 19:49 1.TXT
 -RW-RW-R--    1 BOZO  BOZO       109 APR 14 16:48 2.TXT
 -RW-R--R--    1 BOZO  BOZO       725 APR 20 20:56 DATA-FILE

管道里的每一个进程的标准输出都被当成下一个命令的标准输入. 如果不是这种情况,那么数据流会阻塞,并且管道不会引起预期的效果。
cat file1 file2 | ls -l | sort
# 来自"cat file1 file2"的输出会消失.

管道以子进程来运行, 因此不能引起变量的改变。
variable="initial_value"
echo "new_value" | read variable
echo "variable = $variable"     # variable = initial_value

如果在管道中的一个命令失败了,会过早的终结整个管道的执行。这称为管道破坏(broken pipe),这时会发送一个叫SIGPIPE 的信号.

>|
强迫重定向 (即使noclobber选项设置). 这会强迫覆盖一个存在的文件.

||
或逻辑操作符. 在一个测试结构中,||操作符当测试条件的任何一个为真时返回0 (成功)的标志.

&
在后台运行作业. 一个后面跟一个&的命令会在后台运行.

Linux Shell编程(5)——shell特殊字符(下)的更多相关文章

  1. 【Shell编程】Shell程序设计

    1.Shell简介   作为Linux灵感来源的Unix系统最初是没有图形化界面的,所有的任务都是通过命令行来实现的.因此,Unix的命令行系统得到了很大的发展,逐步成为一个功能强大的系统.   Sh ...

  2. Linux shell编程02 shell程序的执行 及文件权限

    第一个shell脚本 1.       shell编程的方式 交互式shell编程 非交互式shell编程:执行的语句存放到一个文件 shell脚本:可以任意文件名,建议扩展名为sh 2.       ...

  3. shell编程01—shell基础

    01.学习shell编程需要的知识储备 1.vi.vim编辑器的命令,vimrc设置 2.命令基础,100多个命令 3.基础.高端的网络服务,nfs,rsync,inotify,lanmp,sersy ...

  4. Shell编程入门(第二版)(下)

    ... ... command n done #select把关键字中的每一项做成类似表单,以交互的方式执行do和done之间的命令 示例-select.sh [python] view plainc ...

  5. Linux shell编程 4 ---- shell中的循环

    1 for循环 1 for语句的结构 for variable in values; do statement done 2 for循环通常是用来处理一组值,这组值可以是任意的字符串的集合 3 for ...

  6. 【Shell编程】Shell基本语法

    Shell 语法   Shell程序设计作为一种脚本语言,在Linux系统中有广泛的应用,本文记录了关于Shell程序设计的基础语法知识和常用命令,方便查询,熟练使用shell也需要经常实践,这对于完 ...

  7. Shell编程(二)——shell的基础知识及常用命令

    shell的基础知识 一.bash有以下特点: 1.记录命令历史 2.指令和文件名补全 3.别名 alias rm='rm -i' 4.通配符 * 0个或多个字符 ?​匹配一个字符 5 输入输出重定向 ...

  8. shell编程===执行shell脚本的四种方法

    使用vim创建一个shell文件,命名 hello.sh #!/bin/bash echo "hello shell !" 在linux中进行加载 chmod +x ./hello ...

  9. 【shell】shell编程(六)-shell函数的应用

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action; [return ...

  10. linux系统编程----统计一个目录下的普通文件个数

    主要是为了统计linux系统下一个指定目录下面的普通文件个数,运用目录操作的一些函数,配合递归调用来实现该功能. 首先介绍一下函数原型: 打开一个空目录                    DIR ...

随机推荐

  1. Java中获得程序当前路径的4中方法

    Java中获得程序当前路径的4中方法: 在Application中: import java.util.*; public class TestUserDir { public static void ...

  2. Bash远程文件传输命令scp

    备份远程文件(远程——>本地) scp -r 远程用户名@ip:文件绝对路径 本地绝对路径 还原远程文件(本地——>远程) scp -r 本地路径 远程用户名@ip:远程绝对路径 如果SS ...

  3. JS(一)

    额, 写了一堆, 待机win8崩溃, 重启之后只剩光秃秃的界面, 以后再填吧, 下次一定要一口气把博客写完,中间不能放下干其他事. 1.对象,以及对象与方法联合: var bob = new Obje ...

  4. PHP替换数据库的换行符

    //php 有三种方法来解决 //1.使用str_replace 来替换换行 $str = str_replace(array("\r\n", "\r", &q ...

  5. (转载)[FFmpeg]使用ffmpeg从各种视频文件中直接截取视频图片

    你曾想过从一个视频文件中提取图片吗?在Linux下就可以,在这个教程中我将使用ffmpeg来从视频中获取图片. 什么是ffmpeg?What is ffmpeg? ffmpeg是一个非常有用的命令行程 ...

  6. oracle官方文档- length篇

    一.首先介绍下单字节字符集和 多字节字符集 2.2字符编码方案 2.2.1 单字节编码     (1)单字节7位字符集,可以定义128个字符,最常用的字符集为 US7ASCII     (2)单字节8 ...

  7. 【转】WF4.0实战系列索引

    转自:http://www.cnblogs.com/zhuqil/archive/2010/07/05/wf4-in-action-index.html 此系列的工作流文件案例比较多点,实用性好. W ...

  8. elastic search 学习笔记

    Elastic search在数据分析的应用中相当于一个数据库的搜索引擎. 跟MySQL类似,它有自己的查询语言,只不过不是关系型数据库,属于NoSQL. 可以根据索引从分布式服务器文件系统中快速存取 ...

  9. php中的JSON中文处理

    最近在PHP中要输出JSON,上网查了一下,对中文支持不太好,要不就先转成utf-8的编码,再用json_encode生成,客户端还要再utf-8转中文.对于网页已经用GB2312的服务器,不想这样折 ...

  10. 图的遍历(bfs 和dfs)

    BFS的思想: 从一个图的某一个顶点V0出发,首先访问和V0相邻的且未被访问过的顶点V1.V2.……Vn,然后依次访问与V1.V2……Vn相邻且未被访问的顶点.如此继续,找到所要找的顶点或者遍历完整个 ...