替代是什么?
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#