Shell教程(五):替代、引用机制、输入输出重定向

替代是什么?

Shell当它遇到一个表达式,其中包含一个或多个特殊字符进行替代。

例子:

下面的例子,同时使打印取代的其值的变量的值。同时“ ”是一个新行取代:

#!/bin/sh
 
a=10
echo -e "Value of a is $a 
"

这将产生下面的结果。这里-e选项可以解释反斜杠转义。

Value of a is 10

下面是结果没有-e选项:

Value of a is 10

这里echo命令可以用在以下转义序列:

转义

描述

\

backslash

a

alert (BEL)

 

 

backspace

c

suppress trailing newline

f

form feed

 

new line

 

carriage return

 

horizontal tab

v

vertical tab

可以使用-E选项禁用解释反斜杠转义(默认)。

您可以使用-n选项来禁用插入新行。

命令替换:

命令替换shell执行的机制,一组给定的命令,然后替代它们的输出在命令。

语法

执行命令替换的命令时,被给定为:

`command`

当执行命令替换,确保您使用的是反引号,不是单引号字符。

例子:

命令替换一般是用一个命令的输出分配给一个变量。下面的例子演示命令替换:

#!/bin/sh
 
DATE=`date`
echo "Date is $DATE"
 
USERS=`who | wc -l`
echo "Logged in user are $USERS"
 
UP=`date ; uptime`
echo "Uptime is $UP"

这将产生以下结果:

Date is Thu Jul  2 03:59:57 MST 2009
Logged in user are 1
Uptime is Thu Jul  2 03:59:57 MST 2009
03:59:57 up 20 days, 14:03,  1 user,  load avg: 0.13, 0.07, 0.15

变量替代:

变量替换可使Shell程序员操纵变量的值,根据其状态。

这里是所有可能的替换如下表:

格式

描述

${var}

Substitue the value of var.

${var:-word}

If var is null or unset, word is substituted for var. The value of var does not change.

${var:=word}

If var is null or unset, var is set to the value of word.

${var:?message}

If var is null or unset, message is printed to standard error. This checks that variables are set correctly.

${var:+word}

If var is set, word is substituted for var. The value of var does not change.

例子:

下面的例子显示各种状态,上述替代:

#!/bin/sh
 
echo ${var:-"Variable is not set"}
echo "1 - Value of var is ${var}"
 
echo ${var:="Variable is not set"}
echo "2 - Value of var is ${var}"
 
unset var
echo ${var:+"This is default value"}
echo "3 - Value of var is $var"
 
var="Prefix"
echo ${var:+"This is default value"}
echo "4 - Value of var is $var"
 
echo ${var:?"Print this message"}
echo "5 - Value of var is ${var}"

这将产生以下结果:

Variable is not set
1 - Value of var is
Variable is not set
2 - Value of var is Variable is not set
 
3 - Value of var is
This is default value
4 - Value of var is Prefix
Prefix
5 - Value of var is Prefix

 

 

元字符:

UNIX Shell提供各种元字符有特殊的意义,同时利用他们在任何Shell脚本,并导致终止一个字,除非引用。

举个例子: ?匹配一个单一的系统字符,而列出文件中的目录和*匹配多个字符。下面是一个清单shell特殊字符(也称为元字符):

* ? [ ] ' "  $ ; & ( ) | ^ < > new-line space tab

它与前可能被引用的字符(例如,放置自身) .

例子:

下面的例子,显示了如何打印  a * 或a ?:

#!/bin/sh
 
echo Hello; Word

这将产生下面的结果。

Hello
./test.sh: line 2: Word: command not found
 
shell returned 127

现在,让我们尝试使用带引号的字符:

#!/bin/sh
 
echo Hello; Word

这将产生以下结果:

Hello; Word

$符号是一个元字符,所以它必须被引用,以避免特殊处理:

#!/bin/sh
 
echo "I have $1200"

这将产生以下结果:

I have $1200

是以下四种形式引用:

引用

描述

Single quote

All special characters between these quotes lose their special meaning.

Double quote

Most special characters between these quotes lose their special meaning with these exceptions:

·         $

·         `

·         $

·         '

·         "

·         \

Backslash

Any character immediately following the backslash loses its special meaning.

Back Quote

Anything in between back quotes would be treated as a command and would be executed.

单引号:

考虑echo命令,其中包含许多特殊的shell字符:

echo <-$1500.**>; (update?) [y|n]

将在每个特殊字符前的反斜杠是繁琐的,使该行难以阅读:

echo <-$1500.**>; (update?) [y|n]

有一个简单的方法来引用一大组字符。将一个单引号(')的开头和结尾的字符串:

echo '<-$1500.**>; (update?) [y|n]'

单引号内的任何字符均以一个反斜杠,就好像是在前面的每个字符。所以,现在这个echo命令将显示正确。

如果要输出一个字符串内出现一个单引号,你不应该把单引号内的整个字符串,而不是对子进行使用反斜杠()如下:

echo 'It's Shell Programming'

双引号:

尝试执行以下shell脚本。这个shell脚本使用单引号:

 
VAR=ZARA
echo '$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]'

这将产生以下输出结果:

$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]

所以这不是你想显示什么。很明显,单引号防止变量替换。如果想替换的变量值和倒置逗号如预期那样运作,那么就需要在双引号命令如下:

VAR=ZARA
echo "$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]"

这将产生以下结果:

ZARA owes <-$1500.**>; [ as of (07/02) ]

双引号带走下列以外的所有字符的特殊含义:

·        $ 参数替代。

·        用于命令替换的反引号。

·        $ 使字面美元标志。

·        ` 使文字反引号。

·        " 启用嵌入式双引号。

·        \ 启用嵌入式反斜杠。

·        所有其他字符是文字(而不是指定)。

单引号内的任何字符均以一个反斜杠,就好像是在前面的每个字符。所以,现在这个echo命令将显示正确。

如果要输出一个字符串内出现一个单引号,不应该把单引号内的整个字符串,而不是对子进行使用反斜杠()如下:

echo 'It's Shell Programming'

反引号:

把反引号之间的任何shell命令将执行命令

语法

下面是一个简单的语法,把反引号之间的任何Shell命令:

例子:

var=`command`

例子:

继执行date命令,产生的结果将被存储在 DATA 变量。

DATE=`date`
 
echo "Current Date: $DATE"

这将产生以下输出结果:

Current Date: Thu Jul  2 05:28:45 MST 2009

 

 

大多数 Unix 系统命令从终端的输入和发送所产生的输出返回​​到您的终端。一个命令通常从一个地方叫标准输入,默认情况下,这恰好是你的终端读取输入。同样,一个命令通常写入其输出到标准输出,这也是默认情况下,从你的终端。

输出重定向:

通常用于标准输出命令的输出可以很容易地转移到一个文件中代替。这种能力被称为输出重定向:

如果记号> file附加任何命令,通常写入其输出到标准输出,该命令的输出将被写入文件,而不是你的终端:

检查使用 who 命令,将完整的输出重定向命令在用户文件。

$ who > users

请注意,没有输出出现在终端中。这是因为输出已被重定向到指定的文件从默认的标准输出设备(终端)。如果想检查用户的文件,然后将完整的内容:

$ cat users
oko         tty01   Sep 12 07:30
ai          tty15   Sep 12 13:32
ruth        tty21   Sep 12 10:10
pat         tty24   Sep 12 13:07
steve       tty25   Sep 12 13:03
$

如果命令输出重定向到一个文件,该文件已经包含了一些数据,这些数据将会丢失。考虑这个例子:

$ echo line 1 > users
$ cat users
line 1
$

您可以使用>>运算符将输出附加在现有的文件如下:

$ echo line 2 >> users
$ cat users
line 1
line 2
$

输入重定向:

正如一个命令的输出可以被重定向到一个文件中,所以可以输入一个命令从文件重定向。作为不是字符>用于输出重定向,小于字符<用于重定向一个命令的输入。

通常需要的命令,他们从标准输入的输入可以有自己的这种方式从文件输入重定向。例如,上面生成的文件中的用户的数量来计算的行,可以执行如下命令:

$ wc -l users
2 users
$

在这里,它产生的输出2行。可以指望的文件中的行数 wc 命令的标准输入重定向用户从文件:

$ wc -l < users
2
$

请注意,在由两种形式的wc命令产生的输出是有区别的。在第一种情况下,该文件的用户的名称列出的行数,在第二种情况下,它不是。

在第一种情况下,wc 知道,它是用户从文件读取输入。在第二种情况下,只知道它是从标准输入读取输入,所以它不显示文件名。

Here 文档:

 here document 是用来输入重定向到一个交互式shell脚本或程序。

在一个shell脚本中,我们可以运行一个交互式程序,无需用户操作,通过提供互动程序或交互式shell脚本所需的输入。

这里的文件的一般形式是:

command << delimiter
document
delimiter

这里的 shell 解释<<操作指令读取输入,直到它找到含有指定分隔符线。所有输入行的行分隔符,然后送入标准输入的命令。

分界符告诉shell 这里文件已完成。没有它,shell 不断的读取输入。分隔符必须是一个字不包含空格或制表符。

以下是输入命令wc -1 进行计数的行的总数:

$wc -l << EOF
          This is a simple lookup program 
          for good (and bad) restaurants
          in Cape Town.
EOF
3
$

可以在heredocument 打印多行,使用你的脚本如下:

#!/bin/sh
 
cat << EOF
This is a simple lookup program 
for good (and bad) restaurants
in Cape Town.
EOF       

这将产生以下结果:

This is a simple lookup program
for good (and bad) restaurants
in Cape Town.

下面的脚本运行一个会话vi文本编辑器中的输入和保存文件test.txt

#!/bin/sh
 
filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands

如果运行这个脚本,用vim作为vi,那么很可能会看到类似以下的输出:

$ sh test.sh
Vim: Warning: Input is not from a terminal
$

运行该脚本后,你应该看到以下内容添加到文件test.txt

$ cat test.txt
This file was created automatically from
a shell script
$

丢弃输出:

有时会需要执行命令,但不想显示在屏幕上的输出。在这种情况下,可以丢弃的输出重定向到文件 /dev/null:

$ command > /dev/null

这里 command 是要执行的命令的名字。文件/dev/null 是一个特殊的文件自动放弃其所有的输入。

同时要放弃一个命令的输出和错误输出,使用标准的重定向到STDOUT 到STDERR重定向:

$ command > /dev/null 2>&1

在这里,2代表stderr和1代表STDOUT。可以上显示一条消息到STDERR到 STDERR重定向标准输入到如下:

$ echo message 1>&2

重定向命令:

以下是命令,可以使用重定向的完整列表:

命令

描述

pgm > file

Output of pgm is redirected to file

pgm < file

Program pgm reads its input from file.

pgm >> file

Output of pgm is appended to file.

n > file

Output from stream with descriptor n redirected to file.

n >> file

Output from stream with descriptor n appended to file.

n >& m

Merge output from stream n with stream m.

n <& m

Merge input from stream n with stream m.

<< tag

Standard input comes from here through next tag at start of line.

|

Takes output from one program, or process, and sends it to another.

需要注意的是文件描述符0是正常标准输入(STDIN),1是标准输出(STDOUT),标准错误输出(STDERR)。


from: http://www.yiibai.com/shell/what_is_shell.html#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值