现在的位置: 首页 > 综合 > 正文

SHELL初级(三)+ 文件操作

2013年08月09日 ⁄ 综合 ⁄ 共 2557字 ⁄ 字号 评论关闭

2.6.6 命令的执行

1 $(command):捕获一条命令的执行结果并把他用在shell脚本程序
echo The date is $(date)   //其结果就是命令的输出,是字符串形式的输出结果
set $(date)
echo The month is $2  //通过位置参数来输出$(date)中的字符串

2 算术扩展  $((...))
x=$(($x+1)) //比起expr要快

3 参数扩展
unset foo
echo ${foo:-bar} :当foo为空,就设置为bar的值   //bar
foo=fud
echo ${foo:-bar}                           //fud
foo=/usr/bin/X11/startx
echo ${foo#*/}                             //  usr/bin/X11/startx
echo ${foo#*}                              //  /usr/bin/X11/startx
${param#word}  //从param的头部开始删除与word匹配的最小部分,然后返回剩余部分,最多不含/
echo ${foo##*/}  //startx    从param的头部开始删除与word匹配的最大部分,然后返回剩余部分,最少不含/
bar=/usr/local/etc/local/networks
echo ${bar%local*}                        ///usr/local/etc/
${param%word}  从param的尾部开始删除与word匹配的最小部分,然后返回
echo ${bar%%local*}                      ///usr/
echo ${#bar}                             //29  param的长度

echo ${foo:=bar}   //如果foo为空,就把bar赋给foo   bar
echo ${foo:?bar}

2.6.7 here文档
在shell脚本程序中向一条命令传递输入的一种特殊方式
cat << !FUNKY!  //<<为here文档开始标志 !FUNKY!并以之为结束符
hello
this is a here
document
!FUNKY!

3 文件操作
3.1 LINUX文件结构
文件结构为OS服务和设备提供了一个简单而统一的接口。在LINUX中一切都是文件,甚至硬件设备在LINUX中也通常被映射为文件
3.1.2 文件和设备
1 /dev/console :系统控制台,错误信息和诊断信息被发送到这个设备
2 /dev/tty :如果一个进程有控制中断的话,这/dev/tty就是这个控制终端(键盘,显示器)的别名
3 /dev/null :所有写向这个设备的输出都将被丢弃。读这个文件会返回一个文件爱你尾标志,将不需要的输出重定向到/dev/null
设备分为字符设备和块设备(支持随即文件系统存取的设别,硬盘):区别在于访问设别时是否需要一次读写一整块。

3.2 系统调用和设备驱动程序
可以对文件和设备进行访问和控制的函数是系统调用,由LINUX直接提供,是通向OS本身的接口
用来访问设备驱动程序的底层函数(系统调用)包括:
open  :打开文件活设备
read  :
write
close
ioctl :把控制信息传递给设备驱动程序
标准函数库为设备和磁盘文件提供更高层的接口。
3.4 底层文件访问
3.4.1 write

#include <unistd.h>
size_t write(int fildes,const void *buf,size_t nbytes);
把缓存区buf的前nbytes个字节写入于文件描述符fildes关联的文件中,返回实际写入的字节数。 0 表示未写出任何数据;-1 在write中出现了错误

if ((write(1,"Here is some data/n",18))!=20)
write(2,"A write error has occurred on file descripter./n",46);

其执行结果为:
$ gcc -o sim simple_write.c
$ ./sim
Here is some data
A write error has occurred on file descripter.
3.4.2 read系统调用
#include <unistd.h>
size_t read(int fildes,void *buf,size_t nbytes)
//将从fildes相关联的文件中读入nbytes个字节到buf数据区中
返回实际读入的字节数
0:到达文件尾
-1:read调用出错

read(0,...):从键盘是输入
write(1,...):输出到显示器上

有趣的是,你不仅可以从键盘上标准输入,还可以用文件重定向输入,然后程序执行那个write(1,...)将文本输出
但是./rd < simple_read.c可以,而gdb ./rd < simple_read.c和gdb rd < simple_read.c都不行呀

3.4.3 open系统调用
#include<fcntl.h>
int open(const char *path,int oflags);
int open(const char *path,int oflage,mode_t mode)

open建立一条到文件活设别的访问路径。操作成功,则将返回一个文件描述符,read和write调用该描述符就可以打开文件进行操作。即便是两个程序打开同一个文件,也会得到不同的文件描述符。如果都对文件进行写操作,就各写各的,分别接着上次离开的位置继续往下写,彼此互相覆盖。
文件访问模式:必选
O_RDONLY
O_WRONLY
O_RDWR
可选:
O_APPEND :追加到文件尾部
O_TRUNC: 文件长度设为0,丢弃已有内容
O_CREAT:按照mode给出的访问模式创建文件
O_EXCL:与O_CREATE同时使用
open失败返回-1,用errno指明错误原因

open("myfile",O_CREAT,S_IRUSR|S_IXOTH)

$ ls -ls myfile
0 -r-------x 1 yaozhangjun yaozhangjun 0 2009-10-22 23:03 myfile
但是open的文件描述符好像是0呀

抱歉!评论已关闭.