1.
环境变量,相当于全局变量。
定义变量;打印变量; 将自定义变量转成环境变量;显示所有环境变量;取消某个or多个环境变量or 本地变量;一个命令把自定义变量转成环境变量;显式所有本地变量;本地变量设成只读,即不可写; env 结合grep的管道命令用来显示希望查看的某个环境变量。
$ name=“kiki”
$ echo $(name) or $
echo ${age} or $echo $name
$ export name
$ env
$ unset name age
$ export name="kiki"
$ set
$ readonly
age="83"
$ env | grep HOME
2.
环境变量配置文件,包含/etc/profile和~/.bashrc文件。
1)/etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。
2)~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
3)最常用的环境变量PATH,
比如:修改环境变量,把交叉编译器的路径加入到PATH。在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称的时候出现“command
not found”的提示内容。如果每次都到安装目标文件夹内找到可执行文件来进行操作就太繁琐了,这就涉及到环境变量PATH的设置问题,而PATH的设置也是LINUX下定制环境变量的一个组成部分。
$ echo $PATH
/opt/fp_le/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/wangzhonghua/bin
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
3.
/etc/profile文件的shell思想
1)
特殊变量:$0 脚本名;$n 给脚本传递的参数;$? 命令的执行结果;
2)
比较控制符:真假[-eq
] : –eq,-neq,
-ge,-gt,-le,-lt; 可以比较某个变量和某个值[ != ][ = ];也可以比较是否是目录,还可以比较文件:空串[ -z ],and[ -a ],执行[ -x ]某个文件可执行-x, 是否link [ -l ];是否只读[ -r ];(1. w是否是空串,w是否可执行。2.)-f 表示正规文件,-w表示可写。
3)
当前用户的识别号:id –ru (real user);当前用户的姓名 id –un; 当前用户的名字:hostname;当前用户是谁及何时登陆的:who am i
If条件表达式与
[ ]&& 有相同的功能,但是&&只能达到一半的条件。
If [ ]; then
else
fi
4)
shell的函数: 函数名(){},不需要提供参数,在执行函数的时候提供参数即可。
5)
管道| 与重定向 有追加和覆盖两种
>,>> :把一个命令的输出作为另一个命令的输入。重定向有标准输出和标准错误输出两种。
wiki@wiki-desktop:/home/xufuli/backup/svnsync$
ll >kiki
-bash: ll:找不到命令
$ ll >kiki 2>&1
6)
转义序列: \n换行;\t调一个tab键。(),[]需要转义的。
~$ last | awk '{print $1
"\n" $3}'
7)定制shell环境
$ shopt -s cdspell;,自动纠正cd 拼写错误。
Checkwinsize; bash在每个命令后检查窗口大小,如果有必要,就更新LINES和COLUMNS的值;
Histappend;当shell退出时,历史清单将添加到以HISTFILE变量的值命名的文件中,而不是覆盖文件
8)eval 替换命令:然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次。
9)
alias :命令别名,
$
alias ll='ls -al'
8)linux特殊文件:/dev/null, linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的
所有信息时,就可以将输出重定向到/dev/null。用来使终端不显示任何信息。
9)case 条件语句的用法 以及脚本执行的追踪 –n检查语法问题;-v先show出脚本再执行;-x 跟踪执行每一步:
#!/bin/bash
2
3 case
$1 in
4 "spring") echo "in
spring";;
5 "summer") echo "in
summer";;
6 "winter") echo "in
winter";;
7 esac
7)
awk编程的了解,awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在
这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。awk分别 代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。
$ awk '{print $2;}' testfile 表示打印每一行的第二列,自动变量$1
、$2
分别表示第 一列、第二列等,类似于Shell脚本的位置参数,而$0
表示整个当前行。
4.
变量整数声明
$ declare -i sum=100+50
$ echo $sum
5.
过滤器
1)
管道过滤器:管道负责数据的传递,它把原始数据传递给第一个过滤器,把一个过滤器的输出传递给下一
个过滤器,作为下一个过滤器的输入,重复这个过程直到处理结束。要注意的是,管道只是对数据传输的抽象,它可能是管道,也可能是其它通信方式,甚至什么都 没有(所有过滤器都在原始数据基础上进行处理)。编译器就是基于管道过滤器模式设计的:
输入:源程序
预处理:负责宏展开和去掉注释等工作。
编译:进行词法分析、语法分析、语义分析、代码优化和代码产生。
汇编:负责把汇编代码转换成机器指令,生成目标文件。
链接:负责把多个目标文件、静态库和共享库链接成可执行文件/共享库。
输出:可执行文件/共享库。
2)
复合过滤器
过滤器可以由多个其它过滤器组合起来的,比如上面的“编译”过程可以认为是一个复合过 滤器,
输入:预处理之后的源代码。
词法分析:负责将源程序分解成一个一个的token,这些token是组成源程序的基本单元。
语法分析:把词法分析得到的token解析成语法树。
语义分析:对语法树进行类型检查等语义分析。
代码优化:对语法树进行重组和修改,以优化代码的速度和大小。
代码产生:根据语法树产生汇编代码。
输出:汇编代码。
3)grep stack /proc/2976/maps | sed -e “s/-/ /” | awk
‘{print strtonum(“0x”$2)-strtonum(“0x”$1)}’
grep是过滤器:它从文件/proc/2976/maps里找到下面这行数据。
sed是过滤器:sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有
改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。它把‘-’替换成‘ ’,数据变成下面的内容。
sed -e '62,66d' $DestPrjDir/hooks/pre-revprop-change
> $DestPrjDir/hooks/temp.c 删除文件中某些行
cp $DestPrjDir/hooks/temp.c $DestPrjDir/hooks/pre-revprop-change
$ sed '2,$d' example 删除example文件的第二行到末尾所有行
$ sed 's/test/mytest/g'
example 文件中所有都替换在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
$ sed -e '1,5d' -e
's/test/check/' example (-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执 行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
@sed -i 's/\[SVN_VER\]/$(SVN_REVISION)/g' $(ONU_INSTALL)/version 在指定文件中当前行前插入一行,此行的内容用某某替换某某。
awk是过滤器:它计算0xbfe73000和0x bfe5e000差值,并打印出来。
6.
数组,set显示的所有变量中是这样的,season=([1]="spring"
[2]="summer") ;打印数组变量值
$ season[1]=spring
$ season[2]=summer
$ echo ${season[1]}
7.
history 历史命令,显示最近100条命令;清除所有历史命令;
$ history 100
$ history –c
8.
打印输出。转义字符使能输出-e,推荐用双引号保持变量特性;
$ echo -e " kiki \n mina"
9.
打包(音译) tar文件 tarball。
@tar -jcvf $(ONU_FIRMWARE_BIN)-$(SVN_REVISION).$@.tar.bz2
$(ONU_FIRMWARE_BIN)-$(SVN_REVISION).$@.bin
$(ONU_FIRMWARE_BIN)-$(SVN_REVISION).$@.bin.upf
j参数代表是以.tar.bz2作为扩展名
@tar -cf $(ONU_FIRMWARE_BIN)-$(SVN_REVISION).$@.bin.tar
$(ONU_FIRMWARE_BIN)-$(SVN_REVISION).$@.bin.upf Lib/images/App4315.tkf
Lib/images/Pers4315.tkf 不用j,z,参数的代表是以.tar作为扩展名
10. shell 查找技巧:find 与xargs(参数替换) 用来删除所有某种特点的文件。
$ find -name
"xufuli" | xargs rm –rf 通过管道将find的结果作为输入,通过xargs作为rm命令的参数
11. 更改权限;
$chmod a+x kiki.sh
12. Makefile中sed的使用
@sed -i
's/\[SVN_VER\]/$(SVN_REVISION)/g'
$(ONU_INSTALL)/version 在指定文件中当前行前插入一行,此行的内容用某某替换某某。
13. 文件测试功能file:
$ file nullLog.sh用来测试文件是否是可执行文件。可执行文件是指二进制文件。
14.
15. Makefile中一些极好的shell命令
$ sudo rm -rf country/ 删除父子所有文件夹目录
$ sudo cp -rf xufuli/ kiki/ 完整拷贝目录结构到另一个文件夹
$ find -name
"xufuli" | xargs rm –rf 在当前目录查找名为xufuli的目录和文件,通过管道将find的结果作为输入,通过xargs作为rm命令的参数
$chmod a+x kiki.sh 更改权限
$chmod 755
$(ROOTFS_PATH)/home/www/html_asb/cgi-bin/*
@sed -i
's/\[SVN_VER\]/$(SVN_REVISION)/g'
$(ONU_INSTALL)/version 在指定文件中当前行前插入一行,此行的内容用某某替换某某。