shell程序设计(五)常用命令

Bash ginotang 713℃ 0评论

命令替换$()

命令替换用于在shell中执行指定的命令,并把命令的输出捕获返回给shell。

例如:

上面的例子不太实用。另一个例子是,根据日期动态设置备份文件的名称。

文件名称就是backup_20180314。文件名会根据当前的实际时间作出变更。

命令替换还有其他写法,这种写法主要是兼容旧的shell,例如:

不过需要注意的是:命令替换会创建一个新的子shell来执行命令,也就是说,非全局变量将不能被这个子shell使用,除非是export变量。

source命令

source命令的别名叫做点( . )命令。当我们执行一个shell脚本的时候,都是在一个新建的环境中执行的,原来环境中的变量就无法使用。利用source命令,可以使shell脚本执行在旧的环境中,以便使用旧环境中的变量。

例如:

echo命令

echo命令用于在终端中输出文本,它有一些常用参数:-n 、-e

-n参数用于删除行尾的换行符,但这个选项不具备可移植性

-e选项用于保留转义字符的作用

printf命令

printf命令只有在新版本的shell中才有的命令,用于代替echo命令。printf命令的好处是可以格式化输出,像c语言中的printf。

set命令

set命令在之前的文章中有所提及,它的一个作用是设置shell的选项,以控制shell的行为。它还有一个作用:设置或重新设置位置参数的值。在不使用set的前提下,位置参数的值是无法修改的。

例如:set.sh脚本中有如下代码,单纯打印位置参数的值

在shell中运行该脚本

使用set修改位置参数的值

在上面的脚本中添加一行代码后如下:

然后执行脚本

虽然传递参数的时候第一个参数值是one,但是在脚本里面one已被set重新设置了新的值。因此位置参数$1的值变成了parameter-one。

需要注意的是,如果set设置的参数个数小于传递给脚本的参数个数,那么脚本的参数以set设置的为准,用户传递的参数被作废。

例如:

运行脚本观察输出结果:

虽然我们传递了三个参数给脚本,但是set只设置了一个参数,所以其他的参数都被丢弃了。

再谈双引号

set命令设置的参数以空格为分隔符,例如:set a b c 命令设置了3个参数,值分别是a、b和c。如果使用双引号的话:set “a b c”,则整个字符串作为一个参数。看下面的例子:

date命令的输出格式是以空格分开的时间值,因此,使用set $(date),每一个被空格隔开的值作为一个位置参数,而当使用双引号把date返回的结果括起来后"$(date)",set只有一个位置参数。

shift命令

shift命令把所有参数变量左移一个位置,$2变成$1, $3变成$2,$1则被丢弃,$0保持不变。如果调用shift的时候指定了一个值,则所有的参数将左移指定的次数。

例如:

运行:

由于左移了两个位置,参数$2没有了,直接从$3开始,$3变成$1, $5变成$3。

trap命令

trap命令用于指定接收到某个信号后要执行的操作,这个操作是可选的,如果没有指定操作,则使用默认行为处理这个信号,例如SIGINT信号默认退出程序。可以使用trap -l查看相关的信号列表,使用信号时可以使用完整的信号名称,也可以使用简单的信号名称(去掉SIG前缀)。

如果想还原信号的默认行为,可以像下面这样,三种方法都可以,例如:

exec命令

exec命令的主要用法是把当前的shell替换为一个不同的程序。

例如:

eval命令

eval命令的作用和JavaScript中的eval类似,用于解析字符串中是否有可执行的shell命令,如果是,则 执行该命令。

例如:

 

转载请注明:Pure nonsense » shell程序设计(五)常用命令

喜欢 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x