shell脚本本身自带的命令详解

描述

除了以文件形式保存在/usr/bin下面的命令,shell脚本中还可以使用shell本身自带的命令,即内置命令

1、:命令

它不做任何处理,并且永远将0作为退出状态码,也被称为空命令(null command),由于空命令返回的退出状态码永远为0,所以它也可以像下面这样用于编写无限循环的控制结构。因此true命令和:命令除了名称不一样,其余都是一样的。

 

while :     ←-----(本行及以下3行)使用了空命令的无限循环
do            
    处理内容  
done

 

2、echo/printf

echo命令比较简单不做过多介绍

▼echo命令的选项有-n、-e和-E。-n选项用于设置不让脚本输出行尾的换行符。其实准确来说,echo命令会在参数后面加上一个换行符并将其输出到标准输出中。但是,如果使用了-n选项,echo命令就不会在行尾添加换行符了。

▼printf命令和echo命令不同,不会在输出的行尾添加换行符。如果想输出换行符,需要在格式字符串中显式地添加 。另外,echo命令的-e选项中支持的转义字符也可以在printf中使用。唯一的例外是在输出8进制的ASCII码字符时,echo命令使用的是�nnn,而printf不需要前面的0,写成 nn就可以了。

3、command命令和builtin命令

函数的优先级高于可执行文,在这种情况下,要想执行优先级较低的内置命令或者可执行文件,可以使用内置命令command。command命令的使用方法为“command命令名”,使用它就可以只在内置命令和可执行文件中查找并执行指定的命令。

ASCII

这种情况下,就可以使用command命令或者builtin命令设置执行命令的优先顺序。

4、type命令

type命令用于判断指定的命令的类型。该命令可以输出参数中命令的类型,即别名、保留字、函数、内置命令、可执行文件中的任意一个

▼使用type命令显示别名的详细信息

 

$ alias ll='ls -l'
$ type ll
ll 是 `ls -l' 的别名

 

▼使用type命令显示函数的详细信息

 

$ hello() { echo 'Hello, world!'; }  ←----- 定义 hello 函数
$ type hello
hello 是函数
hello ()
{                        ←----- 函数体的代码
    echo 'Hello, world!'
}

 

▼将不存在的命令作为参数会报错

 

$ type xxx
-bash: type: xxx: 未找到

 

这时,type命令的退出状态码为1。反过来,如果命令存在于那几种类型之中,那么退出状态码为0

5、set命令

▼第1个功能是显示当前shell中的所有变量。如果在执行set命令时没有指定任何参数,那么该命令就会输出当前shell中设置的变量及其值的列表,以及函数名和函数体的列表。

 

$ set
BASH=/bin/bash
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
……以下省略……

 

▼也可以用来显示函数信息像type

▼使用set -o命令显示所有选项的状态

 

$ set -o
allexport        off
braceexpand      on
emacs            on
errexit          off
……以下省略……

 

▼使用set命令覆盖位置参数的值

 

#!/bin/bash
echo "$1, $2, $3, $4"
set 111 222 333
echo "$1, $2, $3, $4"
运行:
$ ./set_parameter.sh aaa bbb ccc ddd
aaa, bbb, ccc, ddd
111, 222, 333,    ←----- set 命令修改了位置参数的内容

 

6、unset

unset命令用于删除shell中的变量。使用方法为“unset变量名,删以后为空字符串

 

$ name=miyake
$ echo "name = $name"
name = miyake
$ unset name
$ echo "name = $name"
name =

 

标记为readonly的变量想删也删不掉

7、input

read命令用于从标准输入读取一行数据,其使用方法如下。

 

#!/bin/bash
echo 'delete file?'
read input  ←--------- 从标准输入读取 1 行数据并赋值给变量 input
if [[ $input == yes ]]; then
    echo 'DELETE'
else
    echo 'CANCEL'
fi

 

▼根据键盘的输入执行不同的处理

 

$ ./read_input.sh
delete file?
yes  ←----- 用户的输入
DELETE

 

▼将标准输入的内容逐行输出到标准输出

 

#!/bin/bash
while read line  ←----------- 标准输入的 1 行内容被不断地赋值给变量 line
do
  printf '%s
' "$line"
done

 

注意事项:read命令会将解析为转义字符。因此后面即使是IFS所包含的字符,也不能实现单词分割的功能。特别是,如果在行尾,那么换行符也会被忽略,这一行和下一行会被当成一行读取。要想禁止这一功能,可以使用-r选项。该选项可以让符号不再具有特殊的含义,即使出现在行尾,这一行也会和下一行保持独立,不会连到一起。

8、wait命令

wait命令用于等待在后台运行的进程的结束。在以后台的方式运行比较耗时的处理时,如果想等待所有处理结束,就可以使用wait命令

 

#!/bin/bash
./task1.sh &
./task2.sh &
wait
echo finish

 

9、eval

eval命令可以将参数指定的字符串当作shell的命令行解析并执行

例如eval ls ~

ls ~命令会被执行。这和直接在脚本中写入ls ~是一样的

  
      审核编辑:彭静
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分