2012年1月

Shell变量

变量设置


Variable-name=value : 设置实际值到 variable-name
Variable-name+value : 如果设置了 variable-name,则重设其值
Variable-name:?value : 如果未设置 variable-name,显示未定义用户错误信息
Variable-name?value : 如果未设置 variable-name,显示系统错误信息
Variable-name:=value : 如果未设置 variable-name,设置其值
Variable-name:-value : 同上,但是取值并不设置到 variable-name,可以被替换

- 阅读剩余部分 -

shell中位置变量参数

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


#!/bin/sh #param.sh # $0:文件完整路径名 echo "path of script : $0" # 利用basename命令文件路径获取文件名 echo "name of script : $(basename $0)" # $1:参数1 echo "parameter 1 : $1" # $2:参数2 echo "parameter 2 : $2" # $3:参数3 echo "parameter 3 : $3" # $4:参数4 echo "parameter 4 : $4" # $5:参数5 echo "parameter 5 : $5" # $#:传递到脚本的参数个数 echo "The number of arguments passed : $#" # $*:显示所有参数内容i echo "Show all arguments : $*" # $$:脚本当前运行的ID号 echo "Process ID : $$" # $?:回传码 echo "errors : $?"
输入./param.sh hello world

[firefox@fire Shell]$ ./param.sh hello world
path of script : ./param.sh
name of script : param.sh
parameter 1 : hello
parameter 2 : world
parameter 3 :
parameter 4 :
parameter 5 :
The number of arguments passed : 2
Show all arguments : hello world
Process ID : 5181
errors : 0

目录拷贝--bash实现

刚开始看shell,写了一个bash的小程序,功能是将原目录下的所有子目录都复制到目的目录,但是不复制里面的文件。能够用于某些场合:比如需要原来的文件目录结构,但是里面的内容却是需要更新的。下面的代码都是在我自己的电脑上测试的,路径稍微改动下就OK!

- 阅读剩余部分 -

alias系统配置

今天不小心写一个shell的时候把我很多资料都删除了,就是因为脚本里面用到了rm,具体的错误也不是很清楚,因为运行的时候把源文件都删除了。诶,真是很伤心的~~~

于是我就修改了alias的系统文件配置,想在以后删除文件的时候有提示。

[firefox@fire ~]$ vim ~/.bashrc


然后在文本最后加入

alias rm='rm -i'


默认bash是要在下次启动的时候才生效的,不过可以输入

[firefox@fire ~]$ source ~./bashrc


就可以在立即生效!

sed变量替换问题

下午在写一段shell脚本的时候,遇到了一个问题,就是在sed里面的变量替换不了。

sed   's/^$srcdir/test/g'   /tmp/src_temp_dir.txt  >  /tmp/des.txt


上面srcdir变量里面存的是一个文件的完整路径,文件里面也是一些路径的字符串。我想把原来文件里的路径都换了。结果就是换不了,弄了很久才怀疑是$srcdir没有解释出来,结果去网上搜了下,因为刚开始看shell和正则,所以不是很懂。到后来才发现换成下面的就OK了:

sed  "s,^${srcdir},temp,g"   /tmp/src_temp_dir.txt  >  /tmp/des.txt


具体原因不是很懂。。。

Linux系统--job control

工作管理(job control)是在bash环境下进行的,能在一个终端机下面进行多个工作管理。但是这些工作都是bash的子进程。这样就能让用户把一些工作放在后台处理,而前台继续其他工作,就像开启多线程一样,不过这里的单位都是线程。

直接将命令丢到后台“执行” : &


[firefox@fire ShellProgram]$ vim Pra1.sh &

把目前的工作丢到后台并且“暂停” : [ctrl] + [z]


[firefox@fire  ShellProgram]$ vim Pra1.sh  //按下[ctrl] + [z],这个命令就暂停到了后台

查询目前的后台工作状态:jobs —[lsr]


[firefox@fire  ShellProgram]$ jobs -l

把后台的工作拿到前台处理:fg %[number]


[firefox@fire  ShellProgram]$ fg %1   //拿出后台[1]的job到前台

让后台的工作状态变得运行:bg


[firefox@fire  ShellProgram]$ bg %1  //让后台的[1]进行工作

 

双栈

双栈意思就是双向栈,基本思想就是在一段内存里面,栈从两边分别向中间生长,这样可以提高内存的利用率。下面是C的实现代码,仅仅是基本的功能,重在于思想。

- 阅读剩余部分 -

Linux系统启动--虚拟文件系统

前面一篇讲到了OS启动过程中MBR的相关属性,这里再简单介绍下Linux系统启动过程中虚拟文件系统的作用。

我们按下电源键,计算机第一个执行的程序就是MBR上面的BootLoader,同时,BIOS还会完成一些硬件的初始化等,接下来呢BootLoader就要去加载内核文件到内存,然后将内核文件解压,完成内核文件的加载,从这里开始BIOS的功成身退,以后的任务就交给内核来完成了。内核文件在哪里呢?

- 阅读剩余部分 -

链表逆置

上次用堆栈实现对链表的逆置,比较麻烦。这次换了个算法,下面主要有两种实现算法。

算法一


首先想到的肯定是创建一个新的空链表,然后把旧的链表中的元素通过指针p从头到尾遍历,每遍历一个,就把该元素从链表中脱离,添加到新的链表的头部,新建空链表的时候可以初始化一个空的无用节点(仅仅是为了操作方便)。

算法二


不通过新建一个新链表,具体是让第一个节点的指针域为NULL,第二个指针域指向第一个节点,第三个指向第二个~~~~~~L指向最后一个节点。

- 阅读剩余部分 -

栈溢出

不久前醒哥发给我一些代码,说是讲栈溢出的危害,代码如下:

[code]
#include <stdio.h>

int cp (char *p)
{
int a;
char b[8];
a=strcmp(p,"1234567");
strcpy(b,p);
return a;
}

int main()
{
int v=0;
char p[1024];
while(1)
{
printf("please input password: ");
scanf("%s",p);
v = cp(p);
if(v)
{
printf("incorrect password!\n\n");
}
else
{
printf("Congralations \n\n");
break;
}
}
return 0;
}

[/code]

- 阅读剩余部分 -

进程快照获取

进程快照主要存在于PROCESSENTRY32这个结构体中,下面是这个结构体的信息。

typedef struct tagPROCESSENTRY32 {
DWORD dwSize; //结构体大小
DWORD cntUsage; //0
DWORD th32ProcessID; //进程ID:PID
ULONG_PTR th32DefaultHeapID; //0
DWORD th32ModuleID; //0
DWORD cntThreads; //进程计数
DWORD th32ParentProcessID; //父进程ID
LONG pcPriClassBase; //线程优先权
DWORD dwFlags; //0
TCHAR szExeFile[MAX_PATH]; //进程的可执行文件名称
} PROCESSENTRY32, *PPROCESSENTRY32;

- 阅读剩余部分 -

操作系统加载简介

不久前协会一个同学装了win7+fedora16,结果那哥们又把win7重装了,这下好了,只能进win7了。。。

自己安装linux和windows双系统曾经一路碰到挫折,linux确实是对分区要求很高的系统,最近看了下鸟哥的书,了解了些linux系统。

- 阅读剩余部分 -

Linux文件压缩和打包

*.Z   Compress程序压缩的文件


*.gz  gzip程序压缩的文件


*.bz2  bzip2程序压缩的文件


*.tar   tar程序打包的数据,没有经过压缩


*.tar.gz  tar程序打包的数据,经过了gzip压缩


*.tar.bz2  tar程序打包的数据,经过了bzip2压缩

- 阅读剩余部分 -

Linux磁盘管理

磁盘和目录容量


df [-ahik] [目录或者文件名]


参数:

-k : 以KB容量显示各文件系统

-m :以MB容量显示各文件系统

-h: 以KB,MB,GB等比较智能化的格式显示文件系统容量

-i : 以inode的数量来显示

- 阅读剩余部分 -