shell 编程笔记

#! /bin/sh
寻找shell解释器 /bin/sh  是一个路径
#! /usr/bin/python
只是寻找一个python的解释器


运行linux程序的方法:
使得文件具有可执行的权限 直接运行
调用解释器来执行
使用source来执行
shell 存在着内部命令 和外部命令 内建命令就是shell 程序本身的命令
执行内部命令的时候 不包括进程的创建和消亡
但是在执行外部命令的时候,存在着进程是创建和消亡,以此同时
外部命令执行的过程如下:、
创建一个子进程
查找路径
子进程执行 父进程休眠
子进程执行完毕,父进程从终端读取下一条命令


source 命令的执行不会 创建进程 更加的不会有进程的消亡 没有子进程
只有在父进程中执行。


例如:echo.sh
#! /bin/sh
cd /tmp
echo "hello world"
执行方法选择的是 赋予权限的方式的话 ./echo.sh 此时父进程接受命令 发现不是内建命令 就会创建一个子进程(和父进程一模一样)来执行这个外部命令 此时子进程 来设置自己的环境变量 cd 命令改变的只是子进程的目录 并没有改变父进程的目录 ,子进程执行完成 消亡,父进程等待下个命令执行 所以此方式下的执行 cd命令会失效。


所以选择的执行方式 是source的形式 就会执行 source不会创建子进程 只是在父进程中进行。


shell变量:
全局变量 环境变量 自定义变量
局部变量 必须使用local声明 否则还是全局可见的
export 用于设置当前的环境变量  


计算机 不能直接理解高级语言 需要将高级语言 翻译成机器语言 计算机才能看的明白 翻译是方式有两种 一种是:编译 一种是:解释
编译型的语言 是在程序执行之前 需要一个专门的编译过程 ,只做一次的编译,运行的时候不需要进行编译了 执行效率较高
解释型的语言 是在程序在执行的时候 执行一次 翻译一次 效率较低。


脚本参数的传递
参数的传递 可以将外部的值传递到脚本的内部函数中去,提高脚本的灵活性。
testfunc()
echo "$# parameters";
echo "$@";


testfunc a b c 
3 parameters 
a b c 
testfunc a "b c"
2 parameters
a b c 


shell中的变量是不区分类型的 都是字符串类型 shell变量中有3中:用户变量 位置变量 环境变量 


linux中shell变量$#,$@,$0,$1,$2的含义解释: 
变量说明: 
$$ 
Shell本身的PID(ProcessID) 
$! 
Shell最后运行的后台Process的PID 
$? 
最后运行的命令的结束代码(返回值) 有数值的情况下返回数值 成功返回0值 退出的状态0 表示正常退出 非0表示执行出现异常 
$- 
使用Set命令设定的Flag一览 
$* 
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 
$@ 
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 
$# 
添加到Shell的参数个数 
$0 
Shell本身的文件名 
$1~$n 
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。 


启动文件:
/bin/login   读取/etc/passwd文件成功登录后,启动一个交互的shell
/etc/environment 环境变量 
如果需要对shell做全局性的设置 并且在每次的启动的时候 自动加载 可以将命令写入启动文件中去


type用于显示 命令是什么类型的 是外部命令 内建命令 别名...
shell 的函数
#! /bin/sh
# 数字相加


function add(){
let "sum=$1+$2"
return $sum
}
执行:
source add.sh 将函数从文件中读入 之后可以直接调用
add 3 7
echo $? $? 保存是上一次的命令执行的返回值
7


shell的条件控制与流程


if condition
then 
statements
elif contition
then 
statements
else
statements
fi
shell里面的case语句 
case $1 in
-f) statements;;
-d) statements;;
esac 


for 循环语句
for name [in list]
do 
....
done
for file in `find . -iname "*.mp3"` //反单引号的作用就是将命令返回的结果作为字符串
do
mpg123 $file
done


无限循环 
path=$PATH
while true
do
if [-z $path]
then
break;
fi
ls -ld ${path%%:*} //列出path中第一个目录
path=${path#*:} //截取path中的第一个目录和冒号
done


Tips:
位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。
不带参数的shift命令相当于shift 1。
非常有用的 Unix 命令:shift。我们知道,对于位置变量或命令行参数,其个数必须是确定的,
或者当 Shell 程序不知道其个数时,可以把所有参数一起赋值给变量$*。
若用户要求 Shell 在不知道位置变量个数的情况下,还能逐个的把参数一一处理,
也就是在 $1 后为 $2,在 $2 后面为 $3 等。在 shift 命令执行前变量 $1 的值在 shift 命令执行后就不可用了。


linux shell里面的正则表达式:
定义:
简而言之,正则表达式就是记录文本规则的代码。
正则表达式:元字符 
\b 代表着单词的开头或是结尾
\d 代表着数字 例如0\d{2}-\d{8} 意思就是 010-12345678
grep 查找文本
正则表达式中的元字符:
^ :行或者字符串开始
$ :行或字符串结束
. :匹配一个非换行符的字符
* :匹配0个或多个先前字符 .* 代表任意字符
[...] :方括号表达式 [0-9]匹配单个数字 ^位于括号表达式的开头表示相反的意思[^0-9]不是0-9之间的数字
\ :打开或者关闭后续字符
正则表达式:基本正则表达式 和扩展正则表达式
\(\): 
\n:
x\{m,n\}: 区间表达式 x出现的次数 最少m次 最多n次 
+: 匹配前面正则表达式的一个或者多个实例
?: 匹配前面正则表达式的一个或者0个实例
():用括号括起来的正则表达式
|: 匹配|前面或者后面的正则表达式


grep支持的元字符
\<: 单词的开始
/>: 单词的结束
\w: 匹配文字或是数字 [:alnum:]
\W: 匹配非文字或是数字 [[:alnum:]_]
\b: 单词的锁定符


字符集:
[:alnum:]: 文字数字字符集 A-Za-z0-9
[:alpha:]: 文字字符集
[:blank:]: 空格或者定位字符
[:digit:]: 数字字符
[:graph:]: 非空字符
[:lower:]: 小写字符
[:cntrl:]: 控制字符
[:print:]: 非空字符
[:punct:]: 标点符号
[:space:]: 空白字符
[:upper:]: 大写字符
[:xdigit:]: 十六进制数字 0-9 a-f A-F


正则表达式里面的反向引用:
\(ab\)\(cd\)[efg]*\1\2 用来匹配: abcdabcd abcdeabcd abcdfabcd abcdgabcd \1: ab \2: cd 
\(go\).*\1 用来匹配一行出现了2个go
交替 | you|me 用来匹配 you 或者 me 交替的优先级是最低的
分组() (go)+ 匹配了一个go 或者是多个go 


罗马数字:
I=1
V=5 
X=10
L=50
C=100 CD=400 DC=600
D=500
M=1000 MCM=1900

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。