shell总结
shell脚本的本质是shell命令的有序集合
建立shell脚本的步骤:建立shell脚本,编写任意多行操作系统命令或shell命令,增加文件的执行权限,结束
shell变量
shell允许用户建立变量存储数据,但不支持数据类型。将任何赋给变量的值都解释为一串字符
shell有如下四种变量:用户自定义变量,位置变量,预定义变量,环境变量
用户自定义变量:
定义变量:COUNT=1
使用时前面加$:echo $COUNT
删除变量的赋值:unset COUNT
位置变量:
$0 与键入的命令行一样,包含脚本文件名
$1,$2...$9 分别包含第一个到第九个命令行参数
$# 包含命令行参数的个数
$* 包含所有命令行参数:“$1,$2...$9 ”
$$ 包含正在执行进程的ID号
shell环境变量
CDPATH 用于cd命令的查找路径
HOME 用户主目录
PATH 路径
shell 程序和语句
shell程序由0到n条shell语句构成,shell语句包括三大类:功能性语句、结构性语句、说明性语句
说明性语句:以#开始的部分,不被解释执行
可以出现在程序的任意位置,可以单独一行,也可以接在执行语句的后面
功能性语句:任意操作系统命令、shell内部命令、自编程序、等
read 从标准输入读出一行,赋给后面的变量
read var #把读入的数据全部赋给var
read var1 var2 var3 #把读入一行的第一、二个词分别赋给var1、var2,其他的都赋给var3
如果执行read语句时标准输入无数据,则程序在此停留等候,直到数据到来或终止运行
expr 主要用于简单的整数运算,包括 + - \* / % 等
反撇号用于引用命令的运行结果
test 用于测试三种对象:字符串、整数、文件属性
可用[ ]代替,注意左右都至少一个空格
语法结构:
case 字符串变量 in #case语句只能检测字符串变量
模式1)
命令表1
;;
模式2)
命令表2
;;
。。。。
*) # *表示其他所有
命令表n
;;
esac
例如:
case $1 in
file1)
echo “file1”
;;
file2)
echo “file2”
;;
*)
echo “others”
;;
esac
do
命令表
done
与上面的相反
循环控制语句:
break 和 continue
break n 跳出n层
continue 马上跳转到最近一层循环的下一轮循环
continue n 转到最近n层循环语句的下一轮循环上
shell函数
shell程序中,常把完成固定功能且多次使用的一组命令封装在一个函数中,每当要使用时,调用函数名即可
函数调用前必须先定义,即顺序上先定义函数,再调用
调用程序可以传递参数给函数,函数可以用return语句把运行结果返回调用程序
函数只在当前shell中起作用,不能输出到子shell中
shell函数定义格式
function funtion_name () #function可以省掉
{
...
}
函数调用方式
value_name = `function_name [arg1 arg2 ...]` #函数结果返回给变量
正斜杠//之间
元字符:表达的是不同于字符本身的含义
本书中的元字符有两类:shell元字符、正则表达式元字符,它们各司其职,shell元字符是由shell解析的,就是下面所讲的文件名置换;正则表达式元字符是由各种执行模式操作的程序来解析的,如vi、grep、sed、awk
---------------------------------------------------------------------
正则表达式元字符:
^ 行首定位
$ 行尾定位
. 匹配单个字符
* 匹配0或多个重复的位于*前的字符
[] 匹配指定组字符中的任意一个 ;如[LlT]
[-] 匹配指定范围内的字符 ;如[x-yA-Z0-8]
[^] 匹配不在指定组内的字符
[^ - ]跟上面的相反
\ 转移跟在后面的字符 #转义元字符,使之不被解释
\< 词首定位符 #定位以什么开头的词
\> 词尾定位符 #定位以什么结尾的词
---------------------------------------------------------------------
grep 家族
grep家族由grep、egrep、fgrep组成
grep命令在文件中全局查找指定的正则表达式,并打印所有包含该表达式的行
一般格式:grep [选项] 基本正则表达式 [文件]
选项:-n 显示行号 -i 大小写不敏感 -w表达式作为词来查找,也就是不是一个词的一部分 -r 递归查找
基本正则表达式:可为字符串,如果为字符串,最好用“”如果是模式匹配,用‘’调用变量时,也应该使用“”
文件:可以为多个文件;如 A1 A2
常用举例子
grep -n “your” www #文件www中查找含有your单词的行,且输出行号
grep -nw “your” www #文件www中查找含以your做单词的行,且输出行号
grep -nr ‘[a-zA-Z0-9].you’ ./ #递归./ 中查找含有以a-z A-Z 0-9开始的单词
nd命令及xargs
find pathname -options [-print -exec -ok]
常用的options为name 此时记住要用引号将文件名模式引起来
find ./ “*org.txt” #在当前目录及子目录中寻找以org.txt结尾的文件
find 找到文件后可用xargs对其操作
find ./ “*org.txt” | xargs ls
find ./ “*org.txt” | xargs grep “device” #在结果中搜索device
---------------------------------------------------------------------
启动
系统启动后
->init->getty进程
->/bin/login 初始化环境,启动shell
->/bin/bash 执行/ect/profile,执行~/.bash_profile ~/.bash_login ~/.profile,执行~/.bashrc
->等待用户输入
---------------------------------------------------------------------
环境
一个进程的环境包括:变量等,它定义了可以从一个进程继承到下一个进程的特性
用户的shell配置定义在shell初始化文件中,bash shell有许多启动文件,这些文件可以执行source命令,对一个文件执行source命令会使得这个文件中的所有设置称为当前shell的一部分,也就是说不会创建子shell
登陆时,会执行~/.bash_profile文件执行source命令,如无,则source ~/.bash_login,若无,则source ~/.profile,这三个文件只能source一个,再source ~/.bashrc
~/.bashrc:包含特定的变量和别名,当一个新的bash shell启动或bash脚本启动时会自动执行source ~/.bashrc
在当前提示符下输入shell或bash启动的是子shell
/etc/bashrc:系统级的函数和别名可以在/etc/bashrc文件中设置,主提示符一般在这设置
~/.profile:是一个用户定义的初始化文件,它是被Bourne shell使用的,因此不能包括对bash shell的特定设置,运行bash时只有没找到其他文件时才source此文件,它允许用户定制和修改shell环境,也可以放应用程序的初始化
如:ls app*
cd cmdd*
? 匹配文件(夹)名中的任意一个字符
[...] 匹配[]中的任意一个字符
[!...] 不匹配[]中!的任意一个字符
如:ls [a-z]*.o #匹配以a-z开头的已.o结尾的文件
ls [!0-9]*.o #匹配以非0-9开头的已.o结尾的文件