shell是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令。
一些shell命令:
$ /bin/bash --version 查看bash的版本号
$ /bin/sh * 执行一个脚本文件
$ chmod +x * 设置一个脚本文件为可执行
重定向符:> >> 2> >&
$ ls -l > lsoutput.txt 把ls命令的输出保存到文件lsoutput.txt中
$ ps >> lsoutput.txt 把ps命令的输出附加到文件lsoutput.txt的尾部
$ kill -HUP 1234 >killout.txt 2> killerr.txt 把kill命令的输出保存到文件killout.txt中,把kill命令的标准错误输出保存到文件killouterr.txt中
$ kill -HUP 1234 >killout.txt 2>&1 把kill命令的输出保存到文件killout.txt中,把kill命令的标准错误输出保存到同一文件
shell环境变量:
环境变量 说明
$HOME 当前用户的家目录
$PATH 以冒号分隔的用来搜索命令的目录列表
$PS1 命令提示符,通常是$字符,但在bash中,可以使用一些更复杂的值。
$PS2 二级提示符,用来提示后续的输入,通常是>字符
$IFS 输入域分隔符。当shell读取输入时,它给出用来分隔单词的一组字符。通常是空格、制表符和换行符
$0 shell脚本的名字
$# 传递给脚本的参数个数
$$ shell脚本的进程号。脚本程序通常使用它生成一个唯一的临时文件。
shell参数变量:
参数变量 说明
$1,$2,... 脚本程序的参数
$* 在一个变量中列出所有的参数,各个参数之间用环境变量IFS的第一个字符分隔开
$@ $*一种精巧的变体,不使用IFS环境变量。
布尔判断命令:[或test
字符串比较 结果
string1=string2 字符串相同结果为真
string1!=string2 字符串不同结果为真
-n string 字符串不为空结果为真
-z string 字符串为空结果为真
算术比较 结果
expressionl -eq expression2 表达式相等结果为真
expressionl -ne expression2 表达式不等结果为真
expressionl -gt expression2 表达式1大于表达式2结果为真
expressionl -ge expression2 表达式1大于等于表达式2结果为真
expressionl -lt expression2 表达式1小于表达式2结果为真
expressionl -le expression2 表达式1小于等于表达式2结果为真
! expression 表达式为假结果为真
文件条件测试 结果
-d file 文件为一个目录结果为真
-e file 文件存在结果为真,通常不使用此命令,因为历史上-e选项不可移植
-f file 文件为普通文件结果为真
-g file 文件的set-group-id位被设置结果为真
-r file 文件可读结果为真
-s file 文件大小不为0结果为真
-u file 文件的set-user-id位被设置结果为真
-w file 文件可写结果为真
-x file 文件可执行结果为真
if语句:
if conditon
then
statements
else
statements
fi
elif语句:
if condition
then
statements
elif
statements
else
statements
fi
for语句:
for variable in values
do
statements
done
for语句使用示例:
#!/bin/sh
for foo in bar fud 43
do
echo $foo
done
exit(0)
输出:
bar
fud
43
while语句:
while condition
do
statements
done
until语句:
until condition /* 循环将反复执行知道条件为真 */
do
statements
done
case语句:
case variable in
pattern [|pattern] ...) statements;;
pattern [|pattern] ...) statements;;
...
esac
shell脚本命令:
break 跳出当前循环,也可以提供一个额外的数值参数表明需要跳出的循环层数。
: 相当于true,但运行比true快
continue 使for、while、until循环跳到下一次循环继续执行
. 用于在当前shell执行命令
echo 输出带有换行符的字符串。去掉换行符的方法:echo -n:echo -e "string\c"
eval 对参数进行求值
exec 将当前shell替换为一个不同的程序;修改当前文件描述符
exit n 使脚本程序以退出码n结束运行;
在shell脚本中,退出码0代表成功,1~125代表错误。126代表文件不可执行.127代表命令未找到。128代表出现一个信号。
export export命令将作为它的参数的变量导出到子shell中,使之在子shell中有效。
expr expr命令将它的参数当作一个表达式来求值。但这个命令执行起来相当慢,一种更好的方法是使用$(())。
printf 输出,不支持浮点数,可打印字符、转义字符、字符转换限定符
return 使函数返回
set 为shell设置参数变量
shift 把所有参数变量左移一个位置,使$2变成$1,$3变成$2,$1的值被丢弃,$0仍保持不变
trap 用于指定在接收到信号后将要采取的行动。比如在脚本程序被中断时完成清理工作。
trap命令有两个参数,第一个是接收到信号采取的行动,第二个是参数名。
unset 从环境中删除变量或函数,但并不能删除shell本身定义的只读变量
字符转换限定符:
字符转换限定符 说明
d 输出一个十进制数字
c 输出一个字符
s 输出一个字符串
% 输出一个%字符
trap信号说明:
信号 说明
HUP(1) 挂起,通常因终端掉线或用户推出而引发
INT(2) 中断,通常因按下Ctrl+C组合键而引发
QUIT(3) 退出,通常因按下Ctrl+\组合键而引发
ABRT(6) 中止,通常因某些严重的执行错误而引发
ALRM(14) 报警,通常用来处理超时
TERM(15) 终止,通常在系统关机时发送find命令
find命令
完整语法:
find [path] [options] [tests] [actions]
options
选项 含义
-depth 在查看目录本身之前先搜索目录的内容
-follow 跟随符号链接
-maxdepths N 最多搜索N层目录
-mount(或-xdev) 不搜索其他文件系统中的目录
tests
测试 含义
-atime N 文件在N天之前被最后访问过
-mtime N 文件在N天之前被最后修改过
-name pattern 文件名匹配pattern。pattern需要用引号括起
-newer otherfile 文件比otherfile文件要新
-type c/f/d 文件的类型为c,c是一个特殊类型。常见的是d(目录)和f(普通文件)。
-user username 文件的拥有者是指定的用户username
actions
动作 含义
-exec command 执行一条命令
-ok 与-exec类似,但在执行命令之前会针对每个文件提示用户进行确认
-printf 打印文件名
-ls 对当前文件使用命令ls-dils
grep(通用正则表达式解析器)命令:
grep语法结构如下:
grep [options] PATTERN [FILES] //如果没有提供文件名,则grep命令将搜索标准输入
选项 含义
-c 输出匹配行的数目,而不是输出匹配的行
-E 启用扩展表达式
-h 取消每个输出行的普通前缀,即匹配查询模式的文件名
-i 忽略大小写
-l 只列出包含匹配行的文件名,而不输出真正的匹配行
-v 对匹配模式取反,即搜索不匹配行
正则表达式:
在正则表达式中,一些字符是以特定方式处理的。
字符 含义
^ 指向一行的开头
$ 指向一行的结尾
. 任意单个字符
[] 方括号内包含一个字符范围,其中任何一个字符都可以被匹配。在字符范围前面加上^符号表示使用反向字符范围。
如果想将上述字符用作普通字符,需要在前面加上\字符。
在方括号中可以使用一些有用的特殊匹配模式:
匹配模式 含义
[:alnum:] 字母与数字字符
[:alpha:] 字母
[:ascii:] ASCII字符
[:blank:] 空格或制表符
[:cntrl:] ASCII控制字符
[:digit:] 数字
[:graph:] 非控制、非空格字符
[:lower:] 小写字母
[:print:] 可打印字符
[:punct:] 标点符号字符
[:space:] 空白字符,包括垂直制表符
[:upper:] 大写字母
如果使用了-E选项,在使用控制匹配完成的其他字符之前加上\字符
选项 含义
? 匹配是可选的,但最多匹配一次
* 必须匹配0次或多次
+ 必须匹配1次或多次
{n} 必须匹配n次
{n,} 必须匹配n次或n次以上
{n,m} 匹配次数在n到m之间,包括n和m
shell参数扩展方法:
参数扩展 说明
$(param:-default) 如果param为空,就把它设置为default的值
$(#param) 给出param的长度
$(param%word) 从param的尾部开始删除与word匹配的最小部分,返回剩余部分
$(param%%word) 从param的尾部开始删除与word匹配的最长部分,返回剩余部分
$(param#word) 从param的头部开始删除与word匹配的最小部分,返回剩余部分
$(param##word) 从param的头部开始删除与word匹配的最长部分,返回剩余部分
shell调试:
命令行选项 set选项 说明
sh -n <script> set -o noexec 只检查语法错误,不执行命令
set -n
sh -v <script> set -o verbose 在执行命令之前回显它们
set -v
sh -x <script> set -o xtrace 在处理命令之后回显它们
set -x
sh -u <script> set -o nounset 如果使用了未定义的变量,就给出出错信息
set -u
CD数据库应用程序:
需求: 保存CD基本资料:唱片的名称、音乐类型、艺术家、作曲家的名字
能以每张唱片为单位搜索
能保存一些简单的唱片信息
能对唱片资料进行输入、更新、删除
设计: 把标题信息与曲目信息分开,用不同的文件保存它们
对每张CD唱片保存以下信息:
CD唱片的目录编号
标题
曲目类型
作曲家或艺术家
对曲目保存以下信息:
曲目编号
曲名
使用到的函数:
get_return()
get_confirm()
set_menu_choice()
insert_title()
insert_track()
add_record_tracks()
add_records()
find_cd()
update_cd()
count_cds()
remove_records()
list_tracks()