知人者智,自知者明。胜人者有力,自胜者强。知足者富。强行者有志。不失其所者久。

Ghostwwl’s Blog

五月 1, 2007

Linux桌面同样不错的

归类于: linux bash sehll, Ghostwwl有话要说 — ghostwwl @ 4:05 pm

最近发现win下恶意网站太多 所以回到偶的gnome桌面下了 因为我机器不怎么样内存才192M所有不能用KDE就用gnome 裸奔都比ie上网强起码不会恶意软件中毒。而且做开发 还是linux好,据说vista下很多win32api不能用了(我也是网上听说,还没装过呢,也不会去装),跟着微软走 累死你,出了新的就的学,而且是无穷无尽。给2张偶的gnome瞄瞄。
gnome1_text.jpg

4_text.jpg

• • •
 

九月 1, 2006

Shell函数

归类于: linux bash sehll — ghostwwl @ 12:02 am

Shell函数

一.函数的定义

1.什么叫做函数,那就不废话了。

shell中定义函数的格式为:
  函数名 ()
  {
    命令。。。
  }
 
另一种格式是:
  function 函数名 ()
   {
     …
     }
弄个简单的函数看看:
 
#!/bin/bash
#hellofunction
function hello()
{
   echo “hello, today is ‘date’”
   return 1
   }

2. 参数传递
    这个就是那些位置参数啦!$1–$9
调用的时候就在参数名后面直接跟 参数 然后函数中通过$1-$9这种形式调用

比喻上面一个函数我们可以改为:

#!/bin/bash
#hellofunction
function hello()
{
   echo “hello $1, today is ‘date’”
   return 1
   }

对了忘了说 要调用函数 直接要在要的地方 函数名就可以了
比喻用调用我们刚写的这个 可以: hello ghostwwl
如果是没有参数的那个就直接: hello

3. 函数文件

听名字就知道 把函数放在独立的文件中,那个文件就叫做函数文件
比喻我们放函数的文件叫做 fun
那么我们可以在要使用的 shell文件中

#!/bin/bash
. /home/ghostwwl/myshell/fun
hello

这样就可以执行fun文件中的 hello 函数
这个大家可以去看看/etc/rc.d/init.d/functions 这个里面定义了大量地动需要的函数
看看别人怎么写的,反正linux系统嘛,学编程最好找的就是系统的一些代码 而且基本
都还算比较严谨,当然也有些 嘿嘿 如果自己需要编辑或者修改 最好先做个备份。这样
出了问题还可以挽回

还没写完,我太懒!

• • •
 

八月 22, 2006

关于linux系统权限–以前读书笔记里找的一点东西

归类于: linux bash sehll — ghostwwl @ 11:45 pm

因为一直不能上网,发现mydocument居然有好几G,慢慢看,找到以前写的一篇读书笔记,看到一点东西,想起初接触linux的日子, 

一.处理/etc/passwd文件:
这个文件中的每一行都是一个用户的信息,其中每行中信息都用”:”来分隔
可以用python来读取这个当然其他语言通用可以,我举个例子,得到本机用户名,和加密
密码等信息:

def ReadPasswd(fp=”/etc/passwd”):
    UserInfo = dict()
    users = open(fp,’rb’).readlines()
    for user in users:
        if user:
           Item = user.split(’:')
           UserInfo[Item[0]] = Item[1:]
    return UserInfo

这样就可以把passwd文件中的名义行读入一个dict,key值就是用户名,其他的信息就是vaule,这样我们就可以来对需要的信息进行处理了。可以得到加密后的用户密码,用户主目录
等等一些信息。组信息在/etc/group中,如果用户加密口令为X,那么它使用了组影子文件
/etc/gshadow

注意的是 如果用户权限是root那么地三个元素应该是0,一般这样的用户信息值得注意,嘿
嘿!有了这个的用户信息,再把他的加密密码解密,who怕who了。
特别注意的是如果其他用户对一个文件夹具有写权限,那么它可以删除其中的文件和文件
夹,即使他不是这个文件加的所有者。所以自己的系统要特别注意w权限。对于一些重要
的文件我们最好加入i权限,这样这个文件就不能删除、修改、重命名、不能创建任何指
向他的链接,和不能写入任何数据。而加入s则可以保证在他删除时保证磁盘对应位置清零
这样就可以保证不可恢复。这些都用chattr来修改,lsattr用来查看。

二.磁盘限制
    显然linux支持磁盘配额,这就要用到牛XX的quota了。
具体步骤是:
a.在/etc/fstab中分区条目中加入4个字段如:
    /dev/hda4 /home ext2 defaults,usrquota 1 2
b.然后在该分区下创建2个文件并修改好权限
    touch /home/quota.user
    touch /home/quota.group
    chmod 600 /home/quota.user
    chmod 600 /home/quota.group
c.然后重新启动运行激活一个文本编辑器
    edquota -u guest
Quotas for user guest:
    /dev/hda4: blocks in use:4329,Limits(soft=0,hard=0)
               inodes in use:501,limits(soft=0,hard=0)
通过修改soft和hard的值可以限制,soft限制用户在系统中可使用的最大磁盘容量,当到达这个容量时将被系统警告,hard限制用户不能超越的磁盘容量,如果到达这个数值,用户将
不能使用任何额外的磁盘空间。

这样就对guest用户限制了磁盘配额

三.更变态的限制系统
     其实linux系统可以限制用户core文件大小,数据段大小,最多可使用的cpu时间,最
多可以打开的文件数目,进程数目限制,管道大小,驻留内存大小等等。够变态吧!
    这些其实是使用shell的ulimit命令,通常把他放到/etc/profile文件中,从而每一个
登陆的用户都会执行该命令,并设置相应的限制。所以一般先确定要限制的用户,然后将
相应的ulimit命令添加到/etc/profile文件中。

ulimit命令选项介绍:
  -a    显示所有限制
  -c    core文件大小的上限
  -d    进程数据段大小的上限
  -f    shell所能创建的文件大小的上限
  -m    驻留内存大小的上限
  -s    堆栈大小的上限
  -t    每秒可占用的cpu时间上限
  -p    管道大小
  -n    打开文件数的上限
  -u    进程数的上限
  -v    虚拟内存大上限
大家都应该知道怎么做了 不废话了

• • •
 

七月 28, 2006

文本过滤

归类于: linux bash sehll — ghostwwl @ 9:33 am

这几天电信封得厉害,我也没多大激情写,唉,这个还没有写完,特别
关于awk这里面如果要写下去,有很多东西,而且这个也不是那么简单介绍下就可以的,所以我想跳过去,哈哈!

这里介绍下文本过滤,文本过滤也是常用到的,当然里面有一些专用的文本过滤的命令,
还有就是传说中牛XX的正则表达式。最后就是文件的分割和合并。

1.正则表达式,我这里只是介绍下,因为这个我也不是很会用,正则表达式难的地方就是各种模式的组合,这个是需要经验,讲不来的,我正则也蛮乱。

什么是正则表达式,其实正则表达式就是用来描叙文本的特许语法。它由不同字符和特殊字符组成,基本都是用来匹配字符串的,下你在很多文本工具都支持正则表达式。如
我写这篇文章用的vi(vim,gvim)。

正则表达式中的元字符(也就是特殊字符)

^ 匹配行首(如:^a)
$ 匹配行尾
* 匹配0个或多个此字符
[] 匹配[]内的字符,可以是单个,也可以是序列。(如:[a-z])
\ 用来转义这里面的特殊字符(也就是屏蔽元字符的含义)
. 匹配任何单个字符
ghostwwl\{n\} 用来匹配ghostwwln次。
ghostwwl\{n,\} 同上,但是最少匹配n次。
ghostwwl\{n,m\} 同上,但是匹配的次数在n与m之间。

看几个小例子:
比喻我们要找到所有可执行的文件,可以用: …x..x..x去匹配文件属性
查找所有文件夹,我们可以用:^d去匹配文件的属性
install$ 匹配以install结尾的所有字符
^$ 这个是个特殊用法,匹配空行
^.$ 就是匹配只有一个字符的行
\*\.doc 这个就可以匹配以*.doc结尾的所有字符或文件
g\{2\}mm 匹配ggmm
g\{2,\}mm 匹配ggmm,gggmm,ggggmm等
g\{2,4\} 匹配ggmm,gggmm,ggggmm
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\ 这个可以用来匹配ip

2. find命令

这个是一个查找命令,用来查找某些特征文件,可以遍历这个目录甚至整个文件系统
,在遍历大的文件系统的时候通常放在在后台执行。类似于win的搜索。但是我们在遍历大
的(100G以上的文件的时候通常的方法是–>放在后台执行,把运行结果重定向到一个文件)
这个命令的格式是:
find pathname -optionts [-print -exec -ok]
这里的pathname表示要查找的路径
-print find命令用来将匹配的文件输出到标准输出
-exec find命令对匹配的文件执行该参数所给出的shell命令
-ok 和-exec是相同的,只不过是以一种更安全的模式执行shell命令,执行命令之前,
会给出提示,让用户确认是否执行。

参数 -name 按文件名查找
参数 -perm 按照文件权限来查找
参数 -user 按照文件属主来查找
参数 -group 按照文件所属组来查找
参数 -mtime -n +n 按照文件的更改时间来查找,-n表示更改时间在n天以内,+n表示更
改时间距现在n天以前,当然find还有-atime和-ctime都跟-mtime差不多
参数 -size n[c] 查找文件长度为n块的文件,带c时表示文件长度文件长度按字节算。
参数 -nogroup 查找无效所属组的文件。
参数 -nouser 查找无效所属主的文件。
参数 -newer file1 !file2查找更新时间比file1新,但是比file2旧的文件
参数 -type 查找某一类型文件(b,d,c,p,l,f)等。
参数 -depth 先匹配目录下的文件 然后再去子目录中匹配
还是看几个例子吧!我这里把-print 省了默认都是输出到标准输出
find /usr -name “python.exe” 这个是用来在/usr目录以及它下面的下级目录中找。
find . -name “*.py” 在当前目录中遍历的寻找.py结尾的文件
find . perm 755 在当前目录中找权限为755的文件
find /etc -mtime -3 在/etc中找改变时间在三天之内的文件
find /etc -mtime +3 在/etc中找改变时间在三天以前的文件
find /myshell -newer “shuchu.txt” ! -newer “lineread.sh”在myshell中查找比
shuchu.txt新比lineread.sh旧的文件。
find $HOME -type d 找自己文件夹下面类型为d(为目录)的文件。
find / -name “backup.sh” -depth 先在当前目录中找”backup.sh”然后再去子目录中
find . -name “out.txt” -exec rm {} \;找到out.txt然后删除注意后面必须有{} \;
而且还要注意空格
find . -name “out.txt” -exec rm {} \;跟上面的相同,只是要问你是否删除

3. grep命令,这个命令还是使用的蛮多的。
对文本文件进行模式查找,它由三种变型
Grep 标准grep命令
Egrep 扩展的grep,支持基本及扩展的正则表达式
Fgrep 快速grep

使用格式为: grep [选项]基本正则表达式[文件]
这里的基本正则表达式最好用双引号括起来,免得被shell误解为命令,其次可以用来
查找多个答词组成的字符串。这里的选项可以有:
-c 只输出匹配行的计数
-i 不区分大小写(只适用于单字符)
-h 查询多文件时不显示文件名
-H 显示文件名
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号
-s 不显示不存在或无匹配的错误信息
-v 显示不包含匹配文本的所有行
还是搞几个例子看看:
grep “test” *.sh 在所有.sh文件中找包含test的行
grep -v “test” copy.sh 在copy.sh中找不包含test的行
grep “2006:16:3[0-9]” *.log 在.log文件查找包含2006:16:30-2006:16:39间的行
grep “^[^0-9]” output.txt 找出不是以0-9开头的行
就搞这几个吧,其他的大家慢慢看,其实这些参数都不用记,用着用着就习惯了。如果文
间太长了可以用管道的加上more蛮好用。基本用来分析log文件源代码什么的都蛮好用的。
我们可以把分析的结果重定向到输出的文件。牛X的grep,如果用linux都不知道这个命令
感觉太可悲了,说不定用linux是凑热闹,现在很多人就是,什么都不会,出了问题就重
装,嘿嘿!
当然grep还有一些常用的正则的“类”封装:
[[:upper:]] 等价于 [A-Z]
[[:lower:]] 等价于 [a-z]
[[:alnum:]] 等价于 [0-9a-zA-Z]
[[:space:]] 等价于 空格或tab
[[:digit:]] 等价于 [0-9]
[[:alpha:]] 等价于 [a-zA-Z]
这里就搞个看看了:grep “[[:digit:]][[:digit:]]” my.txt在my.txt中匹配00-99的字符

4. awk这个是一个命令,也是一个编程语言,这个在文本方面老大哥的,不过我也不是很清楚,我知道的一点点,我也就懒得写出来,免得丢丑,大家还是去查点资料,现在还可以找得到很多awk语言写的脚本,我现在学python,也就懒得去弄这个。

• • •
 

文本过滤

归类于: linux bash sehll — ghostwwl @ 9:33 am

这几天电信封得厉害,我也没多大激情写,唉,这个还没有写完,特别
关于awk这里面如果要写下去,有很多东西,而且这个也不是那么简单介绍下就可以的,所以我想跳过去,哈哈!

这里介绍下文本过滤,文本过滤也是常用到的,当然里面有一些专用的文本过滤的命令,
还有就是传说中牛XX的正则表达式。最后就是文件的分割和合并。

1.正则表达式,我这里只是介绍下,因为这个我也不是很会用,正则表达式难的地方就是各种模式的组合,这个是需要经验,讲不来的,我正则也蛮乱。

什么是正则表达式,其实正则表达式就是用来描叙文本的特许语法。它由不同字符和特殊字符组成,基本都是用来匹配字符串的,下你在很多文本工具都支持正则表达式。如
我写这篇文章用的vi(vim,gvim)。

正则表达式中的元字符(也就是特殊字符)

^ 匹配行首(如:^a)
$ 匹配行尾
* 匹配0个或多个此字符
[] 匹配[]内的字符,可以是单个,也可以是序列。(如:[a-z])
\ 用来转义这里面的特殊字符(也就是屏蔽元字符的含义)
. 匹配任何单个字符
ghostwwl\{n\} 用来匹配ghostwwln次。
ghostwwl\{n,\} 同上,但是最少匹配n次。
ghostwwl\{n,m\} 同上,但是匹配的次数在n与m之间。

看几个小例子:
比喻我们要找到所有可执行的文件,可以用: …x..x..x去匹配文件属性
查找所有文件夹,我们可以用:^d去匹配文件的属性
install$ 匹配以install结尾的所有字符
^$ 这个是个特殊用法,匹配空行
^.$ 就是匹配只有一个字符的行
\*\.doc 这个就可以匹配以*.doc结尾的所有字符或文件
g\{2\}mm 匹配ggmm
g\{2,\}mm 匹配ggmm,gggmm,ggggmm等
g\{2,4\} 匹配ggmm,gggmm,ggggmm
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\ 这个可以用来匹配ip

2. find命令

这个是一个查找命令,用来查找某些特征文件,可以遍历这个目录甚至整个文件系统
,在遍历大的文件系统的时候通常放在在后台执行。类似于win的搜索。但是我们在遍历大
的(100G以上的文件的时候通常的方法是–>放在后台执行,把运行结果重定向到一个文件)
这个命令的格式是:
find pathname -optionts [-print -exec -ok]
这里的pathname表示要查找的路径
-print find命令用来将匹配的文件输出到标准输出
-exec find命令对匹配的文件执行该参数所给出的shell命令
-ok 和-exec是相同的,只不过是以一种更安全的模式执行shell命令,执行命令之前,
会给出提示,让用户确认是否执行。

参数 -name 按文件名查找
参数 -perm 按照文件权限来查找
参数 -user 按照文件属主来查找
参数 -group 按照文件所属组来查找
参数 -mtime -n +n 按照文件的更改时间来查找,-n表示更改时间在n天以内,+n表示更
改时间距现在n天以前,当然find还有-atime和-ctime都跟-mtime差不多
参数 -size n[c] 查找文件长度为n块的文件,带c时表示文件长度文件长度按字节算。
参数 -nogroup 查找无效所属组的文件。
参数 -nouser 查找无效所属主的文件。
参数 -newer file1 !file2查找更新时间比file1新,但是比file2旧的文件
参数 -type 查找某一类型文件(b,d,c,p,l,f)等。
参数 -depth 先匹配目录下的文件 然后再去子目录中匹配
还是看几个例子吧!我这里把-print 省了默认都是输出到标准输出
find /usr -name “python.exe” 这个是用来在/usr目录以及它下面的下级目录中找。
find . -name “*.py” 在当前目录中遍历的寻找.py结尾的文件
find . perm 755 在当前目录中找权限为755的文件
find /etc -mtime -3 在/etc中找改变时间在三天之内的文件
find /etc -mtime +3 在/etc中找改变时间在三天以前的文件
find /myshell -newer “shuchu.txt” ! -newer “lineread.sh”在myshell中查找比
shuchu.txt新比lineread.sh旧的文件。
find $HOME -type d 找自己文件夹下面类型为d(为目录)的文件。
find / -name “backup.sh” -depth 先在当前目录中找”backup.sh”然后再去子目录中
find . -name “out.txt” -exec rm {} \;找到out.txt然后删除注意后面必须有{} \;
而且还要注意空格
find . -name “out.txt” -exec rm {} \;跟上面的相同,只是要问你是否删除

3. grep命令,这个命令还是使用的蛮多的。
对文本文件进行模式查找,它由三种变型
Grep 标准grep命令
Egrep 扩展的grep,支持基本及扩展的正则表达式
Fgrep 快速grep

使用格式为: grep [选项]基本正则表达式[文件]
这里的基本正则表达式最好用双引号括起来,免得被shell误解为命令,其次可以用来
查找多个答词组成的字符串。这里的选项可以有:
-c 只输出匹配行的计数
-i 不区分大小写(只适用于单字符)
-h 查询多文件时不显示文件名
-H 显示文件名
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号
-s 不显示不存在或无匹配的错误信息
-v 显示不包含匹配文本的所有行
还是搞几个例子看看:
grep “test” *.sh 在所有.sh文件中找包含test的行
grep -v “test” copy.sh 在copy.sh中找不包含test的行
grep “2006:16:3[0-9]” *.log 在.log文件查找包含2006:16:30-2006:16:39间的行
grep “^[^0-9]” output.txt 找出不是以0-9开头的行
就搞这几个吧,其他的大家慢慢看,其实这些参数都不用记,用着用着就习惯了。如果文
间太长了可以用管道的加上more蛮好用。基本用来分析log文件源代码什么的都蛮好用的。
我们可以把分析的结果重定向到输出的文件。牛X的grep,如果用linux都不知道这个命令
感觉太可悲了,说不定用linux是凑热闹,现在很多人就是,什么都不会,出了问题就重
装,嘿嘿!
当然grep还有一些常用的正则的“类”封装:
[[:upper:]] 等价于 [A-Z]
[[:lower:]] 等价于 [a-z]
[[:alnum:]] 等价于 [0-9a-zA-Z]
[[:space:]] 等价于 空格或tab
[[:digit:]] 等价于 [0-9]
[[:alpha:]] 等价于 [a-zA-Z]
这里就搞个看看了:grep “[[:digit:]][[:digit:]]” my.txt在my.txt中匹配00-99的字符

4. awk这个是一个命令,也是一个编程语言,这个在文本方面老大哥的,不过我也不是很清楚,我知道的一点点,我也就懒得写出来,免得丢丑,大家还是去查点资料,现在还可以找得到很多awk语言写的脚本,我现在学python,也就懒得去弄这个。

• • •
 

七月 26, 2006

shell 程序流程控制(二)

归类于: linux bash sehll — ghostwwl @ 1:07 pm

这篇早就写好了,可惜被可耻的电信 封路由,因为我很少在家,只有放假才会在家,所以是和别人共享2MB的adsl上网,现在被封,带来好多不方便啊!郁闷! 

2. case语句
 
这个是条件里面的多选择语句,某个分支成立就执行对应的命令。看下格式:
   case 值 in
   模式1)
       命令1
       ;;
   模式2)
       命令2
       ;;
   esac
注意每次取值后必须为单词in,每个模式必须用右括号结束,当然这里的值可以是变量
也可以是常数,匹配后就执行命令直到;;结束。
   #!/bin/bash
   #casetest simple example
   echo -n “Enter a char:”
   read num
   case $num in
   a)
     echo “You enter number a!”
     ;;
   b)
     echo “You enter number b!”
     ;;
   b)
     echo “You enter number c!”
     ;;
   ”)
     echo “You enter nothing!”
     ;;
   *)
     echo “You enter $num!”
     exit
     ;;
   esac
上面的个例子大家都应该看得懂,如果实在不知道结果的 自己去运行看看 嘿嘿!

3. for循环语句,先看看他的格式
    for 变量 in 列表
    do
        命令1
        命令2
        命令3
        …
    done
这个就有点像python或者是dos中的for了,如果变量在列表里面就执行一次所有的命令,使用变量名访问列表中所有的值,这里的命令可以使shell命令或者语句,可以有多条,这个里面的in 列表 是可选的,如果没有这个for就会使用命令行的位置参数前面说过位置参数 也就是$0-$9,在列表里面可以是替换,字符串,文件名等。结尾的时候要用done 搞个例子看看。
   #!/bin/bash
   #the for test
   for item in “ghostwwl is the root of the computer!”
   do
     echo $item
   done
   echo -e “\n==========================\n”
   for i in 1 2 3
   do
     echo $i
   done
也许大家可以看出输出结果为:
   ghostwwl is the root of the computer!
  
   ==========================

   1
   2
   3
也许你会问为什么第一个for没有换行,而下面的为什么每个都换行,其实加了引号上面的那个语句被当作一个元素来看,你去掉引号,它就会每个单词占一行了。从这里就可以看出是用空格来做分割的

4. until循环,这个好像很多高级语言里也有
    until 条件
    do
       命令1
       …
    done
根for循环里一样这个命令可以是shell命令或者语句,而且until的条件是在循环末尾才去测试的,所以until循环最少要做一次,嘿嘿,看个有用的脚本
   #!/bin/bash
   #until test
   disk=”/backdisk”
   free=’df |grep $disk |awk ‘{print $5}’|sed ’s/%//g”
   echo $free
   until [ “$free” -gt “95″ ]
   do
      echo “Your $disk is nearly full” |mail ghostwwl
      free=’df |grep $disk |awk ‘{print $5}’|sed ’s/%//g’
      sleep 7200
   done
这个脚本就是用来察看我们的/backdisk这个挂载点,我一般用这个挂载点来备份文件的,free这个是用来得到磁盘使用的百分比的里面用到了3个管道,原理是先运行df命令然后通过grep “$disk”到/backdisk这个挂载点的磁盘信息,接着就是用awk输出第5列(也就是磁盘使用的百分比),用后面的sed替换掉百分号,直接输出前面的那个数字,until中就是让百分比跟95比较,如果大于或等于95那么就发信息给ghostwwl用户,告诉他磁盘快满了这个循环里面不断的得到磁盘的百分比,但是有sleep 7200表示每2小时判断一次,这样我们就可以把这个放在后台运行,其实服务器上很多小功能都可以用shell来搞定的,嘿嘿

5. while循环,这个也是很多高级语言里面都有的
格式:while 条件
      do
        命令1
        …
      done
这里的条件可以使多个命令,或语句,搞个例子看看
   #!/bin/bash
   #the while test
   echo “Enter Ctrl+D to Quit!”
   while echo -n “Enter your name:”;read name
   do
      if [ $name = “ghostwwl” ]
      then
         echo “Yeah! $name you are a superman!”
         exit
      else
         echo “hello $name you are a good boy!”
      fi      
   done
这个例子大家都看得懂吧!不停的要你输入名字,然后名字是ghostwwl(嘿嘿),它就会
显示… 然后就会退出,如果是其他的名字就会显示…
再搞个一行行读文件的看看:
   #!/bin/bash
   #the read file
   while read line
   do
      echo $line
   done

• • •
 

七月 25, 2006

shell 程序流程控制(一)

归类于: linux bash sehll — ghostwwl @ 12:20 am

已经写了这么三四天了,感觉写这个其实满无聊的,就是打字,然后就是要坚持下来,
都有点感觉不想写了,坚持下,自己也不知道能坚持到什么时候,特别是写这种基础的
好像提不起激情来,嘿嘿!

今天就介绍下shell下常用的几个基本控制语句,程序流程控制这个不管什么语言中都
有提到,什么是程序流程控制,我就不废话了,直接开整。

1. 条件控制语句

格式: if 条件1        如果条件1成立
      then            那么
           命令1      执行命令1
      elif 条件2      如果条件1不成立条件2成立
      then            那么
           命令2      执行命令2
      else            如果1,2都不成立
           命令3      那么就执行命令3
      fi              完鸟
刚开始写的时候也学最容易弄错的就是,每次完了,忘了写fi
当然如果只判断一个条件 就是:
  if …
  then …
  fi
这句话好像是多余的,能用shell编程的,应该都有其他语言的编程经验的。
搞个小例子看看:
   #!/bin/bash
   #if test shell simple
   if [ “1″ -lt “2″ ]
   then
       echo “1 xiao yu 2″
   fi
上面那个应该都看得懂 嘿嘿!注意上面那个shell程序中的空格。其实判断语句里面的
条件判断 都是通过 test 条件 这种形式来实现的关于test 这个蛮有用的 可以man下,
至于这个里面-lt和为什么中括号中的表达式要那样写 这些你都可以在test这个命令的
man中找到答案,其实linux系统以及类unix系统有什么不懂得 首先考虑 man 然后实在
找不到了 google,这些都是绝决问题的思路,嘿嘿!
   
    这里还是说一下test的一些主要参数:
       -a 表示前后两个表达式都成立时才为真(就相当于and)
       -o 表示前后两个表达式只要一个为真就为真(相当于or)
       =  用来判断2个字符串是否相等
       != 用来判断2个字符串是否不等
       -eq 用来判断前后两个整数是否相等
       -ge 用来判断前面一个数字是否大于等于后面一个数字
       -gt 前面一个整数是否大于后面一个整数
       -le 前面一个整数是否小于等于后面一个整数
       -lt 前面一个整数是否小于后面一个整数
       -ne 前后两个整数不等时为真
当然还有很多参数 关于文件的 大家就自己看man了,都有,列举上面的几个我只想说明
test的重要性,以及那个例子中为什么是 -lt ,重要的都在关于文件的里面,那参数太
多,从a,b,c一直到w我打字要类死,所以自己都man去,蛮简单的英文,我的英文已经蛮
差了,我看得懂大家应该都看得明白的。

弄几个基本例子看看:
   #!/bin/bash
   #if simple test
   echo -n “Enter Your Name:”
   read name
   if [ “$name” = “” ]
   then
     echo “You Did’t Enter You Name!”
   elif [ “$name” = “ghostwwl” ]
   then
     echo “oh you are the root!”
   else
     echo “hello $name!”
   fi
看看上面的例子,如果你直接回车 没有输入什么内容,他会执行then后面那个echo语句,
如果你输入了内容,它就会显示你的名字,呵呵!
   #!/bin/bash
   #the copy test
   if cp out.txt /home/ghostwwl/shuchu.txt
   then
      echo “The copy job over!”
   else
      echo “‘basename $0′:Error could not copy file”>&2
   fi
这个应该满明白 就是把当前目录下的out.txt拷贝到/home/ghostwwl目录下改名为
shuchu.txt如果失败就把错误重定向输出到标准错误上。

由于qq群去了 所以拖了后腿,没有写完 就介绍if好了,剩下的,慢慢补上。

• • •
 

七月 23, 2006

Shell 的输入和输出

归类于: linux bash sehll — ghostwwl @ 4:52 pm

爱–LOVE
“L”代表Listen(倾听);“O”代表Obligate(感恩);
“V”代表Valued(尊重);“E”代表Excuse(宽容).
爱就是仁慈与宽容宽恕对方的缺点与错误并给以对方悦耳的赞美!

上面的好像跑题了,嘿嘿!不过看这个解释蛮好玩!

本文档版权所有,转载请保持完整,并表明出去,因为我打这么多字,我容易吗?

    这里会介绍一些输入和输出的基本命令,当然一些简单的概念也许我就不会罗嗦了。

1. echo命令(格式:echo [option] string)
    这个命令可以显示用来显示文本行或这变量,也可以把字符串输入到文件中。
        参数 -e 解析转移字符(\c,\f,\t,\n,…)
        参数 -n 回车不换行,linux系统中默认的是回车换行。

是不是搞个例子来看看呢?嘿嘿
   #!/bin/bash
   #echo simple example
   echo -e “lao zi shu chu liang ge kong bai hang\n\n”
   echo “lou shang de shi kong bai hang”
   echo “mei you -e jiu shi \n\n”
   echo “I’m use vi editor do my work” >simple.txt
具体输出结果我就不打出来了,应该都知道 然后不知道你试试看就知道。

2. read命令(格式:read varible1 varible2 …)
    这个命令可以从键盘或文件的某一行中读入信息,并赋值给变量。但是如果你的变
量只有一个但是read输入了几个,那么它会把所有的输入赋给这一个变量直到碰到回车;
如果有多个变量,就会按顺序赋值,几个值之间用空格隔开。

也搞个例子看看:
   #!/bin/bash
   #read simple example
   echo -n “You Name:”
   read name
   echo -n “You Age:”
   read age
   echo -e “\nHello ${name}\nYou are ${age} years old!”
输出结果大家可以自己去试试看啦!

3. cat命令(格式:cat [options] filename1 filename2 …”)
    我想这个命令大家都应该蛮熟悉了,可以显示和创建文件,还有其他的一些用途。
特别要注意的是,如果用来显示文件,它会完整显示文件并不会自己分页,如果想分页
那么就只有和more,less等用管道来完成了。废话少说自己去man cat或info cat下。
    参数 -v 可以用来显示控制符(在文本分析,源代码分析中很有用)

4. 管道(command1|command2)
    说简单点就是把第一个命令的输出作为第二个命令的输入,这个竖杠杠就表示管道。
当然可以有多个管道连接多个命令。

5. tee命令(格式:tee -a file) 
    这个命令蛮牛X,它可以把输出的一个副本输出到标准输出(屏幕),另一个副本输出
到相应的文件中。一说就知道这个命令好用了,经常用在管道之后
    参数 -a file 就是指定副本输出的文件为file,有-a就是相当如打开文件的a,保持
原有文件不变,在后面追加
   
搞个例子来看一下:df -k |tee out.txt
这个就可以查看磁盘空余信息,同时在屏幕上输出,并且输出到out.txt中
如果out.txt中以前就有信息,希望保留 那就可以de -k |tee -a out.txt

6. 重定向标准输入输出标准错误 都是些简单内容
    简单并不代表没有,这里的标准输出输入还有标准错误和重定向都是很重要的东西,
里面也有很多技巧,但是基本查查资料都看得懂,我也懒得打字,所以就省了。

7. exec命令(exec command)
    command通常是一个shell的脚本,这样运行一个脚本的时候所有的现有环境他都不会
去管,它会重新启动一个shell

今天就写这么多吧,没心情写,因为中途停了一伙伙电,郁闷死了!

• • •
 

七月 22, 2006

shell的变量和运算符

归类于: linux bash sehll — ghostwwl @ 2:22 pm

版权所有 转载请保持完整,并表明出处

1.什么是变量?
   
    这个就不用废话了,shell中的变量跟其他高级语言中的变量概念是一样的。

2.shell中变量的类型?
    
    shell中的变量类型有:本地变量、环境变量、位置变量、标准变量、特殊变量。

    2.1.本地变量在shell脚本的生存周期中使用的变量(也就是登录一个shell到退出,这个shell为生存周期)设置一个本地变量格式为:变量名=变量,显示一个变量:echo ${变量名}也可以不要大括号,显示本地所有变量:set就可以,本地变量还可以设置为只读的:readonly 变量名,这时的变量就具有只读属性,如果在shell下运行命令readonly,就会显示当前环境下所有的只读变量。
   
    2.2.环境变量用于所有的用户进程(也就shell下所有的子进程),这个就有点像windows中的环境变量了(系统–>高级–>环境变量),环境变量一般保存在$HOME/.bash_profile和/etc/profile中,前者是只适用于当前用户,后者适用于所有用户设置一个环境变量用export,比喻我们这里设置一个环境变量:export pagename=”ghostwwl”这样就设置了一个叫做pagename的环境变量,我们可以通过env这个命令来查看,还有就是可以直接通过运行export来查看。

    2.3.位置变量也就相当于程序中的参数(也就相当于C中的argv),在shell中位置变量一般允许$0-$9一共10个,超过10个的,嘿嘿就必须使用其他方式了。很显然这里$0就是脚本的名字了,从$1开始就是后面的参数了。说白了也就是那个argv了。
我们这里举个小例子,比喻有shell程序aa.sh于下:
    #!/bin/bash
    #named aa
    echo “程序名为: $0″
    echo “姓名为: $1″
    echo “年龄为: $2″
    echo “所属省分为: $3″
    echo “所在城市为: $4″
    echo “第五个参数为: $5″

我们运行这个脚本 ./aa.sh ghostwwl 24 Hubei Wuhan 显示结果为:
    程序名为: ./aa.sh
    姓名为: ghostwwl
    年龄为: 24
    所属省分为: Hubei
    所在城市为: Wuhan
    第五个参数为:
可以看出因为第五个参数没有所以就为空了
当然我们可以在脚本中系统命令传递参数,比喻下面一句:
find /usr/share/realpaly -name $1 -print
这个脚本语句就可以在脚本中对文件目录/usr/share/realplay中文件名为第一个参数的文件进行查找。
说这么多他妈的就是参数,搞半天。
  
    2.4.标准变量,也就是bash环境建立的一些标准环境的标量,他会自动去解析,基本都在/etc/profile中定义了有EXINIT,HOME,IFS,LOGNAME,MAIL,MAILCHECK等。
    EXINIT 是vi编辑器初始化运行的一些参数
    HOME 这个傻子都知道,就是偶们的主目录
    IFS 一个个字段域之间用什么隔开的理论上可以任意字符,比喻/usr/bin;/usr/sbin
这里的IFS就是”;”了。
    LOGNAME 看名字就知道 是登录名可以用 echo $LOGNAME 来查看
    MAIL 表示当用户的邮箱路径
    MAILCHECK 表示每间隔多少秒检查一次收件箱
还有一堆标准变量PATH,tz,PS1,PS2,PWD等等,我这里就不全部写了,自己去找资料看,相信应该蛮好找的。

    2.5.特殊变量
$# 表示传递到脚本的参数列表
$* 以一个字符串显示所有向脚本传递的参数,跟位置变量不同的是这里参数可超过9个。
$$ 表示当前运行脚本的进程ID号
$! 表示后台运行的一个进程的ID号
$@ 与$#相同,但是使用时加引号,并在引号中返回每一个参数
$- 显示shell使用的当前选项,与set命令相同
$? 显示最后命令运行的推出状态,0表示没有错误,其他任何值表示有错误 

3.shell中的变量替换

    这里说一下变量替换这个经常用到,其实就是用变量的值替 换他的名字,显示变量的时候就是这个,可以用:
为了试验我们先定义一个变量haha=”fuck you”
     a.${变量名}来搞定(这里的大括号可要可不要,不过偶一般都加)
     b.${变量名:+变量值}这个表示如果前面的变量值不为空,则显示变量值,否则置空,比喻echo ${name:+”ghostwwl”}这样可不管你以前有没有对name赋过值都会显示这里的”ghostwwl”
     c.${变量名:?错误信息}这个表示当变量名存在,就是变量的值,不存在就显示问号后面的错误信息比喻echo ${age:+”No defined variable age”}这个因为age不存在所以它会显示错误信息age:No defined variable age
     d.${变量名:-变量值}这个表示如果如果变量名没有设置,就用这里给出变量值来代替,显然如果设置了肯定就是返回原来设置的值:比喻echo ${age:-24}因为age变量没有设置,所以它会用24去代替,如果是echo ${haha:-”hello”}这里会显示原来所赋的值”fuck you”记得不要跟b中的情况搞混。
     e.${变量名:=变量值}表示如果没有设置变量名这个变量,就设置它的值,比喻echo ${age:=24}因为没有设置age这个值,所以运行这句的时候会赋值并显示。当然这样赋值以后就可以把age当正常变量用了,也就是这时我们有haha和age这两个变量了。

    就这五种了(当然如果把第一种去掉大括号,就6种了),开始可能并不习惯,用多了就习惯了,啊哈哈!

4.清除变量(unset)
    能定义变量当然也就能删除变量了,比喻我们要删除那个haha,因为值为”fuck you”不太文明,我们可以用:unset haha 从这里就可以看出清除变量用unset 变量名。
    这里我们要注意,设置了readonly的只读变量不能取消也不能重新设置值。

我们这里再来把前面个例子改一下:
    #!/bin/bash
    #named aa
    echo “程序名为: $0″
    echo “姓名为: $1″
    echo “年龄为: $2″
    echo “所属省分为: $3″
    echo “所在城市为: $4″
    echo “参数个数为: $#”
    echo “脚本参数为: $*”
    echo “脚本进程ID为: $$”
我们再来运行这个脚本 ./aa.sh ghostwwl 24 hubei wuhan 结果为:
    程序名为: ./aa.sh
    姓名为: ghostwwl
    年龄为: 24
    所属省分为: hubei
    所在城市为: wuhan
    脚本参数个数为: 4
    脚本参数为: ghostwwl 24 hubei wuhan
    脚本进程ID为: 212

5.影响变量的一些命令
    5.1 declare 创建或显示变量
        参数-f 只显示函数名
        参数-r 创建只读变量(typeset也可以)
        参数-x 创建转出变量
        参数-i 创建整数变量
        如果参数中使用+来代替-,表示选项的含义相反。
    
    5.2 export 创建环境变量
        参数– 表明选项结束,所有后面的参数都是实参
        参数-f 表示在”变量-值”对照中的变量是一个函数名
        参数-n 表示把全局变量转换成局部变量(也就是本地变量)。
        参数-p 显示全局变量列表
 
    5.3 readonly 创建或显示只读变量
        参数– 表示选项结束
        参数-f 创建只读变量

    5.4 set 设置或者重设各种shell
    5.5 shift [n] 用来移动或调整位置变量,使$4赋给$3(也就是全都向前面移动一次),这个里面的n表示移动几位,默认是移动一位。
    5.6 typeset 这个就跟declare相同了
    5.7 unset 清除变量的定义
        参数– 表示选项结束
        参数-f 删除只读变量,但是不能sehll环境中制定的变量和函数。

6.shell的运算符
   6.1 位运算 ~,>>,<<,&,|,^ 一看就知道分别是取反,左移,右移,与,或,异或。
   6.2 $[]表示对[]中的表达式求值和$(())相等的。
   6.3 逻辑运算符 &&,||,>,<,==,!= 是人都看得懂跟C里一样的。 

   6.4 赋值运算符 =,+=,-=,*=,/=,%=,&=,|=,<<=,>>=,^= 跟其他语言差不多一看就明白的。当然表达式赋值let $a=$b+$c这种形式。

   6.5 运算符的优先级我就不想废话了,都跟其他语言差不多的,自己去找。

• • •
 

七月 20, 2006

linux shell简介:

归类于: linux bash sehll — ghostwwl @ 8:45 pm

转载请标明出处,谢谢合作! 

这里我主要介绍什么是linux shell 以及展示一个简单的linux shell的脚本。和介绍linux shell的特性。

1.什么是linux shell?
   
    linux shell其实就是核心程序(kernel)之外的一个命令解析器,它是一个程序(说白了就是基于kernel的一个进程),同时也是一种命令语言和程序设计语言。
   
    作为命令语言可以交互式的解析执行用户输入的命令;
   
    作为程序设计语言它定义了各种变量和参数,并且提供了许多在高级语言里才具有的控制结构。他虽然不是linux系统核心的一部分,但他调用了系统核心的大部分功能来执行程序、建立文件,并以并行的方式来协调各个程序运行。
   
    可以说shell对用户来讲是最重要的一个使用程序,可以说shell的使用程度
,反映用户对linux的使用程度。没看到linux的大牛都不进图形环境的,直接shell
下一切都搞定,建议linux启动级别init 3不要5,因为5如果图形界面出问题,那些
小小鸟要弄半天。

2.系统命令的执行:
   
    当我们登陆一个linux系统的时候系统初始化程序就为每一个用户运行了一
shell程序,通过这个shell来解析用户输入的命令,比喻我们输入”ls”,shell就
会解析”ls”字符为一个命令,同时向内核发送请求这个命令,内核执行这个命令
后就会把返回的结果告诉shell,shell把结果呈现给用户。
   
    shell类似于dos时代的command.com(负责解析dos下输入的命令),不同的是
在dos下面command.com只有一个,而在linux下面这样的解析器可以有很多个。
   
    可以通过察看/etc/shells这个文件来察看所登陆的系统中有哪些shell:
       cat /etc/shell
    怎样会的当前运行的是哪一个shlle,可以运行命令 echo $SHELL.
其实我们可以在一个shell下面运行另外一个shell,比喻我现在运行bash我可以
/bin/sh这样来运行sh,要退出就输入exit
3.bash shell简介:
   
    现在这个使用得比较多的shell,它有哪些好优点呢?
    3.1.它有类似dos下的doskey的功能,可以按上下箭头来找到以前用过的命令
    3.2.还有就是可以查找命令,比喻我们要输入cat,但是不记得cat只知道是以ca开
头,我们就可以输入ca然后按两次Tab键他就会返回以ca开头的命令。这样我们就不用
大量记忆命令。(这个功能还有很多很多的小小鸟不晓得)
    3.3.就是帮助功能,输入help就会返回bash下内置的40几个常用非常重要命令。

如果要查询某个命令怎么用,比喻要查询cat,我们可以 man cat或者info cat查看
帮助信息,要退出察看的信息按键q, 很久很久以前我就不知道怎么退出,结果被我瞎
按按到了q,啊哈哈!终于出来了。

至于其他的几个shell环境的介绍,我这里就不多说了,打字是力气活,如果你想知道自己
去查资料,我认为把常用的弄清了就可以了,反正都差不多的东西,除非你精力没法发泄。
3.shell脚本
 
   3.1.shell脚本的基本组成
        #!/bin/bash  (这是第一行这里是bash为主)
        #            (除了第一行,其它的以#开头的行都为注释)
        变量什么的
        流程控制
   3.2.一个简单的脚本例子
        废话就少说了 这里就来个传说中的hello world了。保存为hello.sh

        #!/bin/bash
        #This my hello world shell program
        heihei=”hello world”
        echo $heihei
   
这里注意上面的脚本你必须保证有可执行权限,也就是chmod u+x hello.sh
4.关于shell下的别名
    比喻我们想让ls显示文件时带上颜色,我们可以自己定一个命令
        alias dir=’ls –color’
    这样我们用dir来查看文件就相当于执行了ls –color,嘿嘿有颜色是不是看
起来爽多了。一般别名命令都放在 $HOME/.bashrc文件里面。

至于变量啊,重定向,管道那些我就不讲了,都是些太基础的,少打点字

• • •
 
下一页 »