内建命令
所谓内建命令,就是bash自身提供的命令,不是外部可执行程序文件,可以用type来确定一个命令是否内建命令。
$PATH 变量包含的目录,都是外部命令
内建命令相当于调用shell进程的一个函数,比外部命令执行的快
type cd
type ifconfig
- Bash Shell 内建命令
命令 | 说明 |
---|---|
: | 扩展参数列表,执行重定向操作 |
. | 读取并执行指定文件中的命令,在当前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发送一个系统信号 |
let | 计算一个数学表达式中的每个参数 |
local | 在函数中创建一个作业域受限的变量 |
logout | 退出shell登录 |
mapfile | 从STDIN读取数据行,并将其加入索引数组 |
popd | 从目录栈中删除记录 |
printf | 使用格式化字符串显示文本 |
pushd | 向目录栈添加一个目录 |
pwd | 显示当前工作目录的路径名 |
read | 从STDIN读取一行数据并将其赋给一个变量 |
readarray | 从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 | 等待指定的进程完成,并返回退出状态码 |
echo
用来在终端输出字符串,并在最后默认增加换行符。
默认不会解析\开头的转义字符
echo str
# -n 取消换行
echo -n str
# -e 解析转义字符,行尾\c 取消换行
echo -e "hello \n world"
echo -e "hello \c"
read
用来从标准输入中读取数据赋值给变量,默认从键盘读取,重定向可以从文件读取
read [-options] [variables]
options 表示选项,variable表示用来存储数据的变量,可以多个,两者都是可选,如果没有变量名,默认赋值给REPLY。
- options 选项
选项 | 说明 |
---|---|
-a array | 读取的数据赋值给数据array,从下标0开始 |
-d delimiter | 用字符串delimiter指定读取结束的位置,而不是换行数,不包括delimiter |
-e | 获取数据进行编码转换,不会显示功能键字符 |
-n num | 读取num个字符,而不是整行字符 |
-p prompt | 显示提示信息,提示内容为prompt |
-r | 原样读取,不把反斜杠字符解析为转义字符 |
-s | 静默模式,不会再屏幕上显示输出 |
-t seconds | 设置超时时间,单位秒,没在指定时间输入完成,非0状态退出,读取失败 |
-u fd | 使用文件描述符fd作为输入源,而不是标准输入,类似重定向 |
- 只读取一个字符
#!/bin/bash
read -n 1 -p "Enter a char " char
printf "\n"
echo $char
exit
用来退出当前shell进程,并返回一个退出状态;使用$? 可以接收返回状态。
exit 不指定默认0,一般0成功,非0表示执行失败。
#!/bin/bash
echo "befor"
exit 8
echo "after"
declare 和typeset
它们的用法相同,都是用来设置变量的属性。 typeset 已经废弃。
命令语法
## -标识设置属性,+标识取消属性
declare [+/-] [aAfFgilpartux] [变量名=变量值]
- aAfFgliprtux 都是具体的选项,含义如下
选项 | 含义 |
---|---|
-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 ret
m=10
n=30
ret=$m+$n
echo $ret
shell 高级
- 输入方向就是数据从哪里流向程序。默认从键盘,如果改变了流入就是输入重定向。
- 输出方向就是数据从程序流向哪里,默认是显示器,如果改变了流出就是输出重定向。
linux中一切皆文件,包括标准输入设备和标准输出设备所有的计算机硬件都是文件。问了区分已经打开的文件,linux会给每个文件分配一个ID,这个ID是个整数,被称为文件描述符。
文件描述符 | 文件名 | 类型 | 硬件 |
---|---|---|---|
0 | stdin | 标准输入文件 | 键盘 |
1 | stdout | 标准输出文件 | 显示器 |
2 | stderr | 标准错误输出文件 | 显示器 |
- Linux Shell输出重定向
语法 fd>file 或 fd>>file ,fd文件描述符默认是1,和>或>> 不能有空格
类型 | 符号 | 作用 |
---|---|---|
标准输出重定向 | command >file | 以覆盖方式,把command正确结果输出到file |
- | command >>file | 以追加方式,把command正确结果输入到file |
标准错误输出重定向 | comand 2 >file | 覆盖方式,错误信息输入到file |
- | command 2>>file | 追加方式,错误信息输入到file |
正确和错误信息同时保存 | command >file 2>&1 | 覆盖方式,正确和错误信息同时保存到file |
- | command >>file 2>&1 | 追加方式,写入file |
- | command >file1 2>file2 | 覆盖方式正确写入file1,错误写入file2 |
- | command >>file1 2>>file2 | 追加方式 |
- /dev/null 文件
如果不想写入文件,也不想显示器展示,结果重定向到/dev/null。
/dev/null 当成linux 系统的垃圾箱,放到垃圾箱的数据不能恢复,丢弃。
- linux shell 输入重定向
符号 | 说明 |
---|---|
command <file | 将file文件中的内容作为command的输入 |
command <<END | 从标准输入中读取的数据,直到遇见分界符END才停止(分界符可自定义) |
command <file1 >file2 | 将file1作为command的输入,并将command结果输入到file2 |
- 输入重定向举例,
逐行读取文件内容
#!/bin/bash
while read str: do
echo $str
done <readme.txt
Shell 管道详解
将两个或多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,这种方式连接两个或多个命令就形成了管道(pipe)。
管道使用|连接多个命令,被称为管道符。语法如下
command1 | command2 [ | commandN...]
例,
mysqldump -u root -p '123456' wiki | gzip -9 |ssh username@remote_ip "cat >/backup/wikidb.gz"
- 重定向和管道的区别
重定向操作符>将命令与文件连接起来,用文件来接收命令的输出,而管道符|是命令与命令连接起来,用第二命令符接收第一个。
- 管道与输入重定向
command1 <input.txt | command2
- 管道与输出重定向
command1 < input.txt | command2 > output.txt
过滤器
将几个命令通过管道符组合在一起就形成了管道,通常,这种方式使用的命令称为过滤器。
常用过滤器命令:
命令 | 描述 |
---|---|
awk | 用于文本处理的解释性程序设计语言,通常是被作为数据提取和报告工具 |
cut | 用于将每个输入文件(如果没有指定文件,则标准输入)每一行的指定部分,输出的标准输出 |
grep | 用于搜索一个或多个文件中匹配指定模式的行 |
tar | 用于归档文件的应用程序 |
head | 用于读取文件的开头部分(默认10行),没有指定文件,标准输入 |
paste | 用于合并文件的行 |
sed | 用于过滤和抓好文本的流编辑器 |
sort | 用于对文本文件的行进行排序 |
split | 用于将文件分割成块 |
strings | 用于打印文件中可打印的字符串 |
tac | 与cat命令相反,用于倒序的显示文件或链接文件 |
tail | 用于显示文件的结尾部分 |
tee | 用于从标准输入读取文件内容写入标准输出或文件 |
tr | 用于转换或删除字符 |
uniq | 用于报告或忽略重复的行 |
wc | 用于打印文件中的总行数、单词数或字节数 |
在管道中使用awk命令
显示当前系统的总内存大小,单位为KB
free | grep Mem | awk '{print $2}'
cut命令
cut 命令用于文本处理,你可以使用这个命令来提取文本中指定内容。
查看系统登录shell是"/bin/bash"的用户名和对应用户主目录
grep "bin/bash" /etc/passwd | cut -d: -f1,6
grep 命令
查看日志文件中的错误信息
grep -i "error:" /var/log/messages | less
tar 命令
tar 命令是linux系统中最常用的打包文件程序
可以使用tar命令赋值一个目录的整体结构
tar cf - /home/larenzhang | (cd /backup/: tar xf -)
head 命令
打印命令前几行输出,默认10行
ls /usr/bin | head -n 5
uniq 命令
uniq 命令用于报告或删除重复的行。
去掉输出中重复的行
sort testfile | uniq -c | sort -nr
wc命令
用于统计包含在文本流中的字符数、单次数和行数
统计当前登录到系统的用户数
who | wc -l