替代是什么?

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教程(五):替代、引用机制、输入输出重定向相关推荐

  1. shell学习(17)- shell中21的解释及输入输出重定向

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

  2. Linux Shell脚本入门教程系列之(十六) Shell输入输出重定向

    本文是Linux Shell系列教程的第(十六)篇,更多Linux Shell教程请看:Linux Shell系列教程 Shell中的输出和输入的重定向是在使用中经常用到的一个功能,非常实用,今天就为 ...

  3. Shell 脚本 — 多行注释、开启子/不开启子进程执行、转义带颜色输出、读取键盘输入、输入输出重定向、单双引号、命令替换、读取变量、系统变量、正则过滤、算术运算、一行多条命令、字符串比较

    1. 多行注释 #!/bin/bash<< COMMENT This is multi line comment COMMENTecho "This is demo script ...

  4. RHCE课程-RH033Linux基础笔记五之常用文本处理命令、输入输出重定向、管道

    RHCE课程-初级部分5.常用文本处理命令,输入输出重定向,管道 今天主要以命令为主,虽然普通的命令没技术含量,但是有技术含量的都是以普通的命令为基础 Cat 文件名  cat是concatenate ...

  5. shell介绍,命令历史,命令补全和别名 ,通配符, 输入输出重定向

    2019独角兽企业重金招聘Python工程师标准>>> shell介绍 shell是一个命令解释器,提供用户和机器之间的交互: 支持特定语法,比如逻辑判断.循环: 每个用户都可以有自 ...

  6. linux脚本重定向到输入,linux shell输入输出重定向

    新建一个文本文件包含所需要的脚本.举例,我会使用pico编辑器写一个脚本用来运行程序tar,带上必要的可选项可以用来解压从因特网下载下来的*.tar的文件(我好像总是记不住tar的所有参赛).我决定把 ...

  7. 8.1-8.5 shell介绍,命令历史,命令补全和别名,通配符,输入输出重定向

    8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重定向 8.1 shell介绍 Linux Shell基础 介绍shell的特性,用法. shell是 ...

  8. python3中异常处理_python中的五种异常处理机制介绍|python3教程|python入门|python教程...

    https://www.xin3721.com/eschool/python.html 从几年前开始学习编程直到现在,一直对程序中的异常处理怀有恐惧和排斥心理.之所以这样,是因为不了解.这次攻pyth ...

  9. 8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重定向

    执行过的命令Linux都会记录,预设可以记录1000条历史命令.这些命令保存在用户的家目录的.bash_history文件中.只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存至 ...

  10. shell介绍 命令历史 命令补全和别名 通配符 输入输出重定向

    8.1 shell介绍 shell 是一个命令解释器,提供用户和机器之间的交互 支持特定语法,比如逻辑判断,循环 每个用户都可以有自己特定的shell CentOS7默认shell 为bash(Bou ...

最新文章

  1. C++自定义Log工具
  2. Android -- 通知栏的使用
  3. pthread_join
  4. 字体中字号,磅值和mm之间的转换
  5. 15年软件开发经验总结
  6. HTML5唐四薪,8文件存取组件课件.ppt
  7. 比较全面的MySQL优化参考
  8. Synchronized和Lock区别
  9. python发展历程
  10. hbuilderx制作简单网页_简单的手机网页制作教程
  11. 特斯拉不顾疫情开工,马斯克放话:若要逮捕,冲我一个人来!
  12. HDOJ1800 Flying to the Mars【Hash】
  13. 20155307《网络对抗》信息搜集与漏洞扫描
  14. 使用CounterDownTimer实现时分秒倒计时
  15. java控制zebra打印机_从Zebra打印机读取状态
  16. linux drupal 7安装教程,drupal7|drupal 7(建站开发工具)下载附安装教程 - 欧普软件下载...
  17. linux终端联网网速慢,解决ubuntu 上网速度慢的问题
  18. Ceph Calamari监控配置
  19. MySQL字段名获取
  20. VirtualBox :不能分配USB设备到虚拟电脑

热门文章

  1. 开发者成功使用机器学习的十大诀窍
  2. Java Review - 集合框架=Collection+Map
  3. 计网 - IPv4 协议:路由和寻址的区别是什么?
  4. MyBatis源码-解读Executor的三个实现类之BatchExecutor(批处理执行器)
  5. 高并发-【抢红包案例】之一:SSM环境搭建及复现红包超发问题
  6. Shell-实际业务操作03
  7. AS插件-Android Parcelable code generator.
  8. linux重定向文件过大,Linux大文件重定向和管道的效率对比总结
  9. 基于模糊控制的自平衡小车的研究
  10. 道格拉斯-普克 Douglas-Peuker(DP算法) python java实现