Shell脚本学习之旅(2)— 变量和重定向

Shell脚本学习之旅(2)— 变量和重定向

一、环境变量

shell维护着一组环境变量,用来记录特定的系统信息。比如系统的名称、登录到系统上的用户名、用户的系统ID(也称为UID)、用户的默认主目录以及shell查找程序的搜索路径。可以用set命令来显示一份完整的当前环境变量列表。
在这里插入图片描述
在脚本中,可以在环境变量名称之前加上美元符( $)来使用这些环境变量。编写如下脚本:

#!/bin/bash
# display user information from the system.
echo "User info for userid: $USER"
echo UID: $UID
echo HOME: $HOME

运行,可以看到,成功打印了用户名、用户的系统ID(UID)、用户的默认主目录
在这里插入图片描述
使用$即可引用变量了,但这有一个问题,如下所示,脚本会尝试显示变量$1(但并未定义),再显示数字5。
在这里插入图片描述
所以。当我们想要显示美元符时,必须在它前面放置一个反斜线,因为反斜线允许shell脚本将美元符解读为实际的美元符,而不是变量。
在这里插入图片描述

二、用户变量

除了环境变量, shell脚本还允许在脚本中定义和使用自己的变量。用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过20个。用户变量区分大小写,所以变量Var1和变量var1是不同的。我们使用等号将值赋给用户变量,但是在变量、等号和值之间不能出现空格,shell脚本会自动决定变量值的数据类型。和系统变量一样,用户变量也是通过美元符引用。
编写脚本如下所示

#!/bin/bash
# testing variables
days=10
guest="Katie"
echo "$guest checked in $days days ago"
days=5
guest="Jessica"
echo "$guest checked in $days days ago"

运行如图所示,变量每次被引用时,都会输出当前赋给它的值。
另外需要记住的是,引用一个变量值时需要使用美元符,而对变量进行赋值时则不要使用美元符。
在这里插入图片描述

三、命令替换

shell脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。把输出赋给变量之后,就可以随意在脚本中使用了。
有两种方法可以将命令输出赋给变量:

  1. 反引号字符( `)
  2. $()格式
    注意,在美式键盘上,反引号字符通常和波浪线( ~)位于同一键位。
    编写脚本如下所示
#!/bin/bash

datestring=`date`
echo "The date and time are: " $datestring
whostring=$(who)
echo "Let's see who's logged into the system:" $whostring

运行可以看到
在这里插入图片描述
我们经常会使用的是如下所示,在脚本中通过命令替换获得当前日期并用它来生成唯一文件名。

#!/bin/bash
# new a log file
today=$(date +%y%m%d)
touch log_$today.log

运行他,可以看到,在当前目录下生成了使用当前日期的文件名,其中+%y%m%d格式是告诉date命令将日期显示为两位数的年月日的组合。
在这里插入图片描述
注意:命令替换会创建一个子shell来运行对应的命令。子shell( subshell)是由运行该脚本的shell所创建出来的一个独立的子shell( child shell)。正因如此,由该子shell所执行命令是无法使用脚本中所创建的变量的。

四、输出重定向

有些时候想要保存某个命令的输出而不仅仅只是让它显示在显示器上。 bash shell提供了几个操作符,可以将命令的输出重定向到另一个位置(比如文件)。
最基本的重定向将命令的输出发送到一个文件中。 bash shell用大于号( >)来完成这项功能:
在这里插入图片描述
重定向操作符创建了一个文件test2(通过默认的umask设置),并将date命令的输出重定向到该文件中。如果输出文件已经存在了,重定向操作符会用新的文件数据覆盖已有文件。
在这里插入图片描述
有时,你可能并不想覆盖文件原有内容,而是想要将命令的输出追加到已有文件中,比如你正在创建一个记录系统上某个操作的日志文件。在这种情况下,可以用双大于号( >>)来追加数据。
在这里插入图片描述

五、输入重定向

输入重定向和输出重定向正好相反。输入重定向将文件的内容重定向到命令,而非将命令的输出重定向到文件。
输入重定向符号是小于号( <)
wc命令可以对对数据中的文本进行计数。
默认情况下,它会输出3个值:1、文本的行数;2、文本的词数;3、文本的字节数
通过将文本文件重定向到wc命令,你立刻就可以得到文件中的行、词和字节的计数。如下所示
在这里插入图片描述
还有另外一种输入重定向的方法,称为内联输入重定向( inline input redirection)。这种方法无需使用文件进行重定向,只需要在命令行中指定用于输入重定向的数据就可以了。内联输入重定向符号是远小于号( <<)。
除了这个符号,你必须指定一个文本标记来划分输入数据的开始和结尾。任何字符串都可作为文本标记,但在数据的开始和结尾文本标记必须一致。
如下所示,EOF作为文本标记,然后次提示符会持续提示,以获取更多的输入数据,直到输入EOF字符串。
在这里插入图片描述

六、管道

我们有时需要将一个命令的输出作为另一个命令的输入,这可以用重定向来实现,即先将命令输出到一个文件,然后将这个文件输入到另一个命令,但这样就比较繁琐了。
使用管道,我们可以用不着将命令输出重定向到文件中,而是可以将其直接重定向到另一个命令,这个过程叫作管道连接( piping)。
管道符号由两个竖线构成,一个在另一个上面,但是他的印刷体通常看起来更像是单个竖线( |)。在美式键盘上,它通常和反斜线( \)位于同一个键。管道被放在命令之间,将一个命令的输出重定向到另一个命令中。
在Linux系统中,由管道串起的两个命令会同时运行,在系统内部将它们连接起来。在第一个命令产生输出的同时,输出会被立即送给第二个命令。数据传输不会用到任何中间文件或缓冲区。
在这里插入图片描述
如图所示,将ls的输出直接作为wc的输入,可以很方便的看到当前目录下的文件个数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值