SHELL
shell脚本运行4种方法:
1. chmod a+x myshell.sh
./myshell.sh
2. . myshell.sh
3. source myshell.sh
4. /bin/bash myshell.sh
shell 语法:
数据类型: 字符串 String
变量: 全局变量 ---- 环境变量
局部变量 ---- 本地变量
变量名=变量值 VAR=10
对比:
$变量名: 取变量的值
${变量名}: 取变量的值(更安全)
$(命令): 取命令执行结果
$((变量名)): 对变量执行算数运算
$[变量名]: 对变量执行算数运算
导出:export
删除:unset
* ? [0123456789][0-9]
命令代换:
$() == `` VAR=`date`
算数代换:
$(()) == $[]
转义字符:
\ 转特殊意 , 转本身意
--
单引号: 括字符串 --- 不能展开变量
双引号: 括字符串 --- 可以将变量 展开。 --- 建议,在取变量值时,都加“”。尤其是在 测试条件中。
控制语句:if、else、switch case、for、while ...
条件判别表达式:真:0 假:1
test 测试条件
[空格 测试条件]
整数判别符: -eq 等于 只能用在 整数之间。
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
文件类型判别符:-d 目录文件
-f 普通文件
-p 管道
-l 软连接
-c 字符设备
-b 块设备
-s socket
字符串长度判断:
-z 空字符串(长度0)
-n 非空字符串(长度非0)
字符串判等: 不能使用 整数判断的 符号
= 相等
!= 不等
逻辑运算: a -- && 逻辑与
o -- || 逻辑或
! 逻辑非
【if语句】:
if [ 判别条件 ]; then
执行内容
elif [判别条件]
执行内容
else
执行内容
fi
demo:
! /bin/bash
echo "请输入你要判别的文件名:"
read file_name
if [ -f "$file_name" ];then
echo 'it is a file'
elif [ -d "$file_name" ];then
echo 'It is a dir'
elif [ -p $file_name ];then
echo 'It is pipe'
else
echo 'it is not a known file'
exit 1
fi
【case分支语句】:
! /bin/bash
echo "请输入你要判别的文件名:"
read file_name
case "$file_name" in
testfile|file1|file2)
echo "it is a file";;
testdir|dir1|dir2)
echo "it is a dir";;
p1)
echo "It's a pipe";;
*)
echo "not found";;
esac
【for循环语句】:
! /bin/bash
for TEST in ls
;do
ls -l $TEST
done
【while循环换语句】:
! /bin/bash
count=1
read passwd
while [ $passwd != "itcast" -a $count -lt 3 ]; do
echo "Try again"
count=$[count+1]
read passwd
done
【位置参数】:
$0: 类似于C中的argv[0] ---- 描述可执行程序名
$1-$N: 类似于C中的argv[1]--argv[N] 命令行参数
$#: 计算命令行参数的个数(不包含 argv[0])
$*/$@: 表示所有的 argv 命令行参数(不包含 argv[0])
$$: 取出本进程的进程号
shift 左移 命令参数
函数:
函数名(){
函数体
}
函数传参: 函数名 参数1 参数2 参数3 ...... 参数N
函数外:$0 ---命令行参数的 argv[0]
$1-$N 命令行参数的 argv[1]-argv[N]
函数内:$0 ---命令行参数的 argv[0]
$1-$N 函数的参数1--参数N
面向对象: 继承、重载、封装、多态。。。
框架:
正则表达式:
字符类使用的 符号:
. 匹配一个字符
* 匹配多个字符
[]匹配指定范围的字符
- 在[]内, 设定范围
^ 匹配除该符号以后的其他字符, 在[]内使用
grep 找文本容
grep -R -r “” /目录位置
find 找文件
-name
find ./ -name "init" find /目录位置 参数 “匹配项”
-size
find ./ -size +3M -size -7M
find ./ -size +20k -size -80k
find ./ -size +200 -size -500 --> 单位: 512B(扇区的大小 0.5k)
-type
-d/-f/-p/-l/-s/-c/-b
find ./ -type f
-maxdepth
find ./ -maxdepth 2 -type d
-exec
find ./ -maxdepth 2 -type d -exec ls -ld {}\;
-ok: 交互版的 -exec
find -maxdepth 1 -type d -ok rm -rf {}\;
-xargs
find -maxdepth 1 -type f | xargs ls -ld
-print
touch test\ test.c ---》 “test test.c”
find -maxdepth 1 -type f -print0 | xargs -0 ls -ld
-atime|ctime|mtime: 天为单位
a:访问
c:文件内容修改
m:文件属性被修改
-amin|cmin|mmin:分钟为单位
find ./ -name "syslog*" -mtime +5 -exec ls -l {} \;
sed ----行
格式1: sed 参数 脚本语句(/pattern/动作) 目标文件
格式2: sed 参数 -f 脚本文件 目标文件
a: 追加
i:插入
d:删除
s:替换
s/原串/目标串/g ---> action
p: 打印 ---- 满足条件打印两次,没有满足打一次。
-n: 原输出静默。
-i: 反应到源文件中
&: 替代原串
\1 \2: 原串中的第一个字符,第二个字符。
贪心算法。
基础正则。 -E 选用扩展正则。
awk ----列。
格式1: awk 参数 脚本语句(pattern { 动 作 }) 目标文件
格式2: awk 参数 -f 脚本文件 目标文件
awk '$2>75 {print $0} $2<75 {printf "%s %s\n", $0, "reorder"}' testfile
awk '$2>75 {print $0} $2<75 {printf("%s %s\n", $0, "reorder");}' testfile
awk '$2>75 {print $0} $2<75 {print $0 " reorder";}' testfile
CC CFLAGS CPPFLAGS...
脚本语句:
1. /pattern/ { 动作 }
2. condition { 动作 }
condition :BEGIN、END
c中使用正则。
egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}" test.regex
1. regcomp(): 编译正则表达式。————结构体。--》描述 "^([0-9]{1,3}\.){3}[0-9]{1,3}"
2. regexec(): 执行正则表达式。------》 用结构体样式的正则,匹配字符串
3. regfree(): 释放正则表达式。————结构体。释放
regerror():正则错误处理函数。 perror
1. int regcomp (regex_t *compiled, const char *pattern, int cflags)
参1: 传出参数。结构体,用于保存转化后的正则表达式。 regex_t regex; ®ex
参2:正则表达式字符串。
参3: REG_EXTENDED : 选用 扩展正则
REG_NOSUB : 当指定该选项时。说明,不保存正则表达式匹配后的结果。
影响regexec() nmatch = 0 和pmatch = NULL;
REG_ICASE: 忽略大小写
REG_NEWLINE: 识别换行符。 ^ $
返回值:成功:0 失败:错误号。
2. int regexec (const regex_t *compiled, const char *string, size_t nmatch, regmatch_t matchptr[], int eflags)
参1:regcomp传出参数。已经转化成结构体正则表达式
参2:待匹配字符串
参3:数组大小。欲使用该参数,要求:regcomp() 参3,应设置为非 REG_NOSUB 。
参4:用于盛装匹配成功的结果集的数组。 欲使用该参数,要求:regcomp() 参3,应设置为非 REG_NOSUB 。
参5:设置^ $ 失效。
REG_NOTBOL、REG_NOTEOL
返回值:成功:0 失败:错误号
3. void regfree (regex_t *compiled)