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#
Shell教程(五):替代、引用机制、输入输出重定向相关推荐
- shell学习(17)- shell中21的解释及输入输出重定向
大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令通常将其输出写入到标准输出,默 ...
- Linux Shell脚本入门教程系列之(十六) Shell输入输出重定向
本文是Linux Shell系列教程的第(十六)篇,更多Linux Shell教程请看:Linux Shell系列教程 Shell中的输出和输入的重定向是在使用中经常用到的一个功能,非常实用,今天就为 ...
- Shell 脚本 — 多行注释、开启子/不开启子进程执行、转义带颜色输出、读取键盘输入、输入输出重定向、单双引号、命令替换、读取变量、系统变量、正则过滤、算术运算、一行多条命令、字符串比较
1. 多行注释 #!/bin/bash<< COMMENT This is multi line comment COMMENTecho "This is demo script ...
- RHCE课程-RH033Linux基础笔记五之常用文本处理命令、输入输出重定向、管道
RHCE课程-初级部分5.常用文本处理命令,输入输出重定向,管道 今天主要以命令为主,虽然普通的命令没技术含量,但是有技术含量的都是以普通的命令为基础 Cat 文件名 cat是concatenate ...
- shell介绍,命令历史,命令补全和别名 ,通配符, 输入输出重定向
2019独角兽企业重金招聘Python工程师标准>>> shell介绍 shell是一个命令解释器,提供用户和机器之间的交互: 支持特定语法,比如逻辑判断.循环: 每个用户都可以有自 ...
- linux脚本重定向到输入,linux shell输入输出重定向
新建一个文本文件包含所需要的脚本.举例,我会使用pico编辑器写一个脚本用来运行程序tar,带上必要的可选项可以用来解压从因特网下载下来的*.tar的文件(我好像总是记不住tar的所有参赛).我决定把 ...
- 8.1-8.5 shell介绍,命令历史,命令补全和别名,通配符,输入输出重定向
8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重定向 8.1 shell介绍 Linux Shell基础 介绍shell的特性,用法. shell是 ...
- python3中异常处理_python中的五种异常处理机制介绍|python3教程|python入门|python教程...
https://www.xin3721.com/eschool/python.html 从几年前开始学习编程直到现在,一直对程序中的异常处理怀有恐惧和排斥心理.之所以这样,是因为不了解.这次攻pyth ...
- 8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重定向
执行过的命令Linux都会记录,预设可以记录1000条历史命令.这些命令保存在用户的家目录的.bash_history文件中.只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存至 ...
- shell介绍 命令历史 命令补全和别名 通配符 输入输出重定向
8.1 shell介绍 shell 是一个命令解释器,提供用户和机器之间的交互 支持特定语法,比如逻辑判断,循环 每个用户都可以有自己特定的shell CentOS7默认shell 为bash(Bou ...
最新文章
- C++自定义Log工具
- Android -- 通知栏的使用
- pthread_join
- 字体中字号,磅值和mm之间的转换
- 15年软件开发经验总结
- HTML5唐四薪,8文件存取组件课件.ppt
- 比较全面的MySQL优化参考
- Synchronized和Lock区别
- python发展历程
- hbuilderx制作简单网页_简单的手机网页制作教程
- 特斯拉不顾疫情开工,马斯克放话:若要逮捕,冲我一个人来!
- HDOJ1800 Flying to the Mars【Hash】
- 20155307《网络对抗》信息搜集与漏洞扫描
- 使用CounterDownTimer实现时分秒倒计时
- java控制zebra打印机_从Zebra打印机读取状态
- linux drupal 7安装教程,drupal7|drupal 7(建站开发工具)下载附安装教程 - 欧普软件下载...
- linux终端联网网速慢,解决ubuntu 上网速度慢的问题
- Ceph Calamari监控配置
- MySQL字段名获取
- VirtualBox :不能分配USB设备到虚拟电脑
热门文章
- 开发者成功使用机器学习的十大诀窍
- Java Review - 集合框架=Collection+Map
- 计网 - IPv4 协议:路由和寻址的区别是什么?
- MyBatis源码-解读Executor的三个实现类之BatchExecutor(批处理执行器)
- 高并发-【抢红包案例】之一:SSM环境搭建及复现红包超发问题
- Shell-实际业务操作03
- AS插件-Android Parcelable code generator.
- linux重定向文件过大,Linux大文件重定向和管道的效率对比总结
- 基于模糊控制的自平衡小车的研究
- 道格拉斯-普克 Douglas-Peuker(DP算法) python java实现