Shell 命令分为外部命令和内置命令:
比较 | 内置命令 | 外部命名 |
---|---|---|
定义 | Bash Shell 自带的命令 | Linux 系统中的应用程序 |
执行效率 | 高 | 低 |
执行过程 | 调用当前 Shell 进程的一个函数 | 触发磁盘 I/O,fork 出一个单独的进程,执行完成后退出 |
内建命令是由 Bash 自身提供的命令,而不是文件系统中的某个可执行文件
使用 type 来确定一个命令是否是内建命令
type cd
cd is a Shell builtin
type ifconfig
ifconfig is /sbin/ifconfig
从返回结果来看,cd是一个内建命令,ifconfig是一个外部文件
命令 | 说明 |
---|---|
: | 扩展参数列表,执行重定向操作 |
. | 读取并执行指定文件中的命令(在当前 shell 环境中) |
alias | 为指定命令定义一个别名 |
bg | 将作业以后台模式运行 |
bind | 将键盘序列绑定到一个 readline 函数或宏 |
break | 退出 for、while、select 或 until 循环 |
builtin | 执行指定的 shell 内建命令 |
caller | 返回活动子函数调用的上下文 |
cd | 将当前目录切换为指定的目录 |
command | 执行指定的命令,无需进行通常的 shell 查找 |
compgen | 为指定单词生成可能的补全匹配 |
complete | 显示指定的单词是如何补全的 |
compopt | 修改指定单词的补全选项 |
continue | 继续执行 for、while、select 或 until 循环的下一次迭代 |
declare | 声明一个变量或变量类型。 |
dirs | 显示当前存储目录的列表 |
disown | 从进程作业表中刪除指定的作业 |
echo | 将指定字符串输出到 STDOUT |
enable | 启用或禁用指定的内建shell命令 |
eval | 将指定的参数拼接成一个命令,然后执行该命令 |
exec | 用指定命令替换 shell 进程 |
exit | 强制 shell 以指定的退出状态码退出 |
export | 设置子 shell 进程可用的变量 |
fc | 从历史记录中选择命令列表 |
fg | 将作业以前台模式运行 |
getopts | 分析指定的位置参数 |
hash | 查找并记住指定命令的全路径名 |
help | 显示帮助文件 |
history | 显示命令历史记录 |
jobs | 列出活动作业 |
kill | 向指定的进程 ID(PID) 发送一个系统信号 |
let | 计算一个数学表达式中的每个参数 |
local | 在函数中创建一个作用域受限的变量 |
logout | 退出登录 shell |
mapfile | 从 STDIN 读取数据行,并将其加入索引数组 |
popd | 从目录栈中删除记录 |
printf | 使用格式化字符串显示文本 |
pushd | 向目录栈添加一个目录 |
pwd | 显示当前工作目录的路径名 |
read | 从 STDIN 读取一行数据并将其赋给一个变量 |
readarray | 从 STDIN 读取数据行并将其放入索引数组 |
readonly | 从 STDIN 读取一行数据并将其赋给一个不可修改的变量 |
return | 强制函数以某个值退出,这个值可以被调用脚本提取 |
set | 设置并显示环境变量的值和 shell 属性 |
shift | 将位置参数依次向下降一个位置 |
shopt | 打开/关闭控制 shell 可选行为的变量值 |
source | 读取并执行指定文件中的命令(在当前 shell 环境中) |
suspend | 暂停 Shell 的执行,直到收到一个 SIGCONT 信号 |
test | 基于指定条件返回退出状态码 0 或 1 |
times | 显示累计的用户和系统时间 |
trap | 如果收到了指定的系统信号,执行指定的命令 |
type | 显示指定的单词如果作为命令将会如何被解释 |
typeset | 声明一个变量或变量类型。 |
ulimit | 为系统用户设置指定的资源的上限 |
umask | 为新建的文件和目录设置默认权限 |
unalias | 刪除指定的别名 |
unset | 刪除指定的环境变量或 shell 属性 |
wait | 等待指定的进程完成,并返回退出状态码 |
alias 用来给命令创建一个别名。若直接输入该命令且不带任何参数,则列出当前Shell进程中使用了哪些别名。
#!/bin/bash
alias timestamp='date +%s'
#alias
begin=`timestamp`
sleep 10s
finish=$(timestamp)
difference=$((finish - begin))
echo "run time:${difference} s"
在执行该脚本时,需要使用source
或者.
关键字使其在当前shell环境中执行脚本,详见shell脚本简介中运行Shell的四种方法
还有就是Shell变量中的命令替换的使用,之前是直接使用的date + %s,现在使用了alias就可以简化代码
改别名创建后只是暂时的,而且只能在当前环境下访问的到,在子进程和其他进程中均不可使用。
使用 unalias 内建命令可以删除当前 Shell 进程中的别名。
使用方法
-a
参数,删除当前 Shell 进程中所有的别名。这两种方法都是在当前 Shell 进程中生效的。要想永久删除配置文件中定义的别名,只能进入该文件手动删除。
在前边我门已经用了很多次echo输出了,在这里进行一下系统的总结。
echo
命令输出结束后默认会换行,如果不希望换行,可以加上-n
参数
默认情况下,echo
不会解析以反斜杠\
开头的转义字符。比如,\n
表示换行,echo
默认会将它作为普通字符对待。我们可以添加-e
参数来让 echo 命令解析转义字符。
#!/bin/bash
echo "hello \nworld"
echo -e "hello \nworld"
输出如下
hello \nworld
hello
world
read是内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据。
read [-options] [variables]
options
表示选项,如下表所示;variables
表示用来存储数据的变量,可以有一个,也可以有多个。
options
和variables
都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。
options选项及说明
选项 | 说明 |
---|---|
-a array | 把读取的数据赋值给数组 array,从下标 0 开始。 |
-d delimiter | 用字符串 delimiter 指定读取结束的位置,而不是一个换行符(读取到的数据不包括 delimiter)。 |
-e | 在获取用户输入的时候,对功能键进行编码转换,不会直接显式功能键对应的字符。 |
-n num | 读取 num 个字符,而不是整行字符。 |
-p prompt | 显示提示信息,提示内容为 prompt。 |
-r | 原样读取(Raw mode),不把反斜杠字符解释为转义字符。 |
-s | 静默模式(Silent mode),不会在屏幕上显示输入的字符。当输入密码和其它确认信息的时候,这是很有必要的。 |
-t seconds | 设置超时时间,单位为秒。如果用户没有在指定时间内输入完成,那么 read 将会返回一个非 0 的退出状态,表示读取失败。 |
-u fd | 使用文件描述符 fd 作为输入源,而不是标准输入,类似于重定向。 |
#!/bin/bash
read -p "请分别输入名字、性别和年龄:" name sex age
echo "名字:$name"
echo "性别:$sex"
echo "年龄:$age"
read -n 1 -p "输入一个字符:" char && printf "\n"
echo $char
if
read -t 20 -sp "请在20s内输入密码:" pass1 && printf "\n"
read -t 20 -sp "请再次在20s内输入密码:" pass2 && printf "\n"
[ $pass1 == $pass2 ]
then
echo "输入正确"
else
echo "输入错误"
fi
执行结果
exit用来退出当前进程,并返回一个退出状态。使用$?
可以接收这个状态。
exit还可以指定一个整数值作为退出状态,若不指定,则为0。一般退出状态为0表示成功,非0表示失败。
#!/bin/bash
echo "exit 执行前"
exit 5
echo "exit 执行后"
执行完成后,输出结果只有执行exit之前的输出,在执行exit之后直接就结束了
然后使用$?
在界面获取退出状态,状态为5
declare 和 typeset用法相同,都用来设置变量的属性。不过typeset已经被弃用了,由declare代替。
declare [+/-] [aAfFgilprtux] [变量名=变量值]
-
表示设置属性,+
表示取消属性,aAfFgilprtux
都是具体的选项
选项 | 含义 |
---|---|
-f [name] | 列出之前由用户在脚本中定义的函数名称和函数体。 |
-F [name] | 仅列出自定义函数名称。 |
-g name | 在 Shell 函数内部创建全局变量。 |
-p [name] | 显示指定变量的属性和值。 |
-a name | 声明变量为普通数组。 |
-A name | 声明变量为关联数组(支持索引下标为字符串)。 |
-i name | 将变量定义为整数型。 |
-r name[=value] | 将变量定义为只读(不可修改和删除),等价于 readonly name。 |
-x name[=value] | 将变量设置为环境变量,等价于 export name[=value]。 |
#!/bin/bash
#将多个变量声明为整数
declare -i m n
m=10
n=15
echo $((m - n))
#设置只读变量
declare -r n=20
n=25
echo $n
#显示m和n的和值
declare -p m n
执行结果
-5
./declare.sh: 行 11: n: 只读变量
20
declare -i m="10"
declare -ir n="20"