命令
- 外部命令: 在命令提示符中执行的”普通”命令
- 内部命令: 在shell内部实现, 不能作为外部程序被调用. 然而大多数的内部命令同时也提供了独立运行的程序版本.
通常情况下, 命令是内部的还是外部的并不重要, 只是内部命令执行效率更高.
常用命令
- 1.break命令
跳出fork, while或until循环. 可以为break命令提供一个额外的参数表明需要跳出的循环层数. - 2.:命令
:命令是一个空命令. 偶尔用于简化条件逻辑, 相当于true的一个别名. 它是内置命令, 运行的比true快, 但它的输出可读性差. 可以用while : 代替while true实现一个无限循环. - 3.echo命令
如何去掉换行符:
常见方法:
echo -n "string to output"
或echo -e "string to output\c"
第二种方法echo -e确保启用了反斜线转义字符(\c代表去掉的换行符). 老版本对反斜线转义字符的解释通常都是默认启用的, 新版默认不解释.
如果需要可移植的删除换行符的方法, 可以使用外部命令tr删除它, 但执行速度较慢. 要同时兼容UNIX系统, 最好坚持使用printf. - 4.eval命令
eval允许对参数求值. shell内置命令.
用法示例:
foo=10
x=foo
y='$'$x
echo $y
# 输出 $foo
foo=10
x=foo
eval y='$'$x
echo $y
# 输出 10
eval命令有点像一个额外的$, 它给出一个变量的值的值.
- exec命令
用法一:
将当前shell替换为一个不同的程序. 示例:
exec wall "Thanks for all the fish"
脚本中的这个命令会用wall命令替换当前的shell.
脚本程序中exec命令后面的代码都不会执行,
因为这个脚本的shell已经不存在了.
用法二:
修改当前文件描述符:
exec 3< afile
文件描述符3被打开以便从文件afile中读取数据. 这种用法很少见.
export命令
export命令把自己的参数创建为一个环境变量, 而这个环境变量可以被当前程序调用的其它脚本和程序看见. 即, 被导出的变量构成从该shell衍生的任何子进程的环境变量.expr命令
expr命令将它的参数当作一个表达式来求值. 常见用法是如下的简单数学运算:
x=`expr $x + 1`
反引号(“)字符使x取值为命令expr ()替换反引号, 如下所示:
x=$(expr $x + 1)
expr命令通常被更有效的$((...))语法替换.
- printf命令
X/Open规范建议用它来替代echo命令, 以产生格式化的输出.
语法:printf "format string" parameter1 parameter2 ...
格式字符串与C中使用的非常相似, 但不支持浮点数.
示例:
$ printf "%s %d\t%s" "Hi here" 15 people
Hi here 15 people
注意 Hi here使用双引号.
- set命令
为shell设置参数变量. 对输出结果是以空格分隔的值的命令非常有用.
示例:
#!/bin/bash
echo the date is $(date)
set $(date)
echo the month is $2
exit 0
该程序把date命令的输出设置为参数列表, 然后通过位置参数$2获得月份.
该示例仅作说明使用, 由于date命令的输出受本地语言影响较大, 实际工作中应使用date +%B来提前月份.
- shift命令
把所有参数变量左移一个位置, 使$2
变成$1
,$3
变成$2
, 以此类推. 原来$1
的值被丢弃, 而$0
保持不变. 如果调用shift命令时指定了一个数值参数, 则表示所有的参数将左移指定的次数.$*, $@, $#
也随之变化.
如果脚本程序需要10个或以上的参数, 就需要shift来访问第10个及其后面的参数.
示例: 依次扫描所有位置参数
#!/bin/bash
while [ "$1" != "" ]; do
echo "$1"
shift
done
exit 0
- “trap命令”
用于指定在接收到信号后要采取的行动. 常见用途是在脚本程序被中断时完成清理工作. 可以在命令提示符下输入命令trap -l
来查看信号编号及其相关联的名称.
trap命令有两个参数, 参数一是接收到指定信号时将要采取的行动, 参数二是要处理的信号名
trap command signal
如果要重置将某信号的处理方式到其默认值, 只需将command设置为-. 如果要忽略某个信号, 就把command设置为空字符串”. 一个不带参数的trap将列出当前设置的信号及其行动的清单.
一些常见的信号: 详见(man 7 signal)
信号 | 说明 |
---|---|
HUP(1) | 挂起, 通常因终端掉线或用户退出而引发 |
INT(2) | 中断, 通常因按下Ctrl+c引发 |
QUIT(3) | 退出, 通常因按下Ctrl+\引发 |
ABRT(6) | 中止, 通常因严重执行错误引发 |
ALRM(14) | 报警, 通常用来处理超时 |
TERM(15) | 终止, 通常在系统关机时发送 |
find命令
用于文件搜索
语法格式:find [path] [options] [tests] [actions]
options主要包含: -depth, -follow, -maxdepths N, -mount
tests主要包含: -atime N, -mtime N, -name pattern, -newer otherfile, -type c, -user username 可使用操作符组合测试(!/-not, -a/-and, -o/-or).
actions主要包含: -exec command, -ok command, -print, -lsgrep(General Regular Expression Parser)命令
find在系统中搜索文件, 而grep在文件中搜索字符串. 常见用法是在使用find命令时, 将grep作为传递给-exec的一条命令.
语法:grep [options] PATTERN [FILES]
没有提供文件名时, grep将搜索标准输入.
option主要包含:
选项 | 含义 |
---|---|
-c | 输出匹配行的数目, 而不是匹配的行 |
-h | 取消每个输出行的普通前缀, 即匹配查询模式的文件名 |
-E | 启用扩展表达式 |
-i | 忽略大小写 |
-l | 只列出包含匹配行的文件名, 而不输出真正的匹配行 |
-v | 对匹配模式取反, 即搜索不匹配行而不是匹配行 |