Shell是各大UNIX系统之间通用的功能,具有简单,可移植。开发容易等突出特点,本文列举出shell编程常见的操作,让初学者有个大概的Linux
1).简单输出
[gz_field@gim ~]$ type echo
echo is a shell builtin
[gz_field@gim ~]$ echo -e "the year is2013.\ntoday is 26"
the year is2013.
today is 26
[gz_field@gim ~]$ type printf
printf is a shell builtin
[gz_field@gim ~]$ printf "the year is2013.\ntoday is26\n"
the year is2013.
today is26
2).一个简易的脚本
[gz_field@gim ~]$ who
root tty1 2012-04-18 10:09
gz_field pts/1 2016-02-25 16:36 (172.23.33.204)
[gz_field@gim ~]$ who | wc -l #计算用户个数
2
[gz_field@gim ~]$ cat > test
who | wc -l
[gz_field@gim~]$ chmod +x test
[gz_field@gim ~]$ ./test
2
3).重定向与管道
tr -d '\r' < dos-file.txt > UNIX-file.txt
#先用tr讲文件里的回车删除,再将转换完成的数据输出到目的文件
for f in dos-file.txt
do
tr -d '\r' < $f >> big-UNIX-file.txt
done
#若文件不存在则创建,存在则追加输出
tr -d '\r' < dos-file.txt | sort > UNIX-file.txt
#先用tr讲文件里的回车删除,排序之后,再将转换完成的数据输出到目的文件
[gz_field@gim ~]$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/jdk/bin:/home/gz_field/bin
4).准备自己的bin存放脚本
cd #切换到home目录
mkdir bin #建立个人bin目录
mv nusers bin #将个人脚本置入该目录
PATH=$PATH:HOME/bin #将个人的bin目录附加到PATH
nusers #查看shell是否找到并执行
修改永久有效:在.pro
vi /etc/profile #编辑pro
PATH=$PATH:HOME/bin #加入PATH路径
source /etc/profile #使修改生效
5).访问shell脚本的参数,查看用户使用的终端
[gz_field@gim ~]$ who
root tty1 2012-04-18 10:09
gz_jonesyan pts/1 2016-03-01 08:19 (172.23.33.209)
gz_jonesyan pts/2 2016-03-01 08:19 (172.23.33.209)
gz_field pts/3 2016-03-01 16:27 (172.23.33.204)
[gz_field@gim ~]$ who | grep gz_field
gz_field pts/3 2016-03-01 16:27 (172.23.33.204)
[gz_field@gim ~]$ cat > text #建立新文件
#!/bin/sh
#finduser ---查看第一个参数所指定的用户是否登录
who | grep $1 #Ctrl+D结束
[gz_field@gim ~]$ chmod +x text #添加执行权限
[gz_field@gim ~]$ ./text gz_jonesyan
gz_jonesyan pts/1 2016-03-01 08:19 (172.23.33.209)
gz_jonesyan pts/2 2016-03-01 08:19 (172.23.33.209)
[gz_field@gim ~]$ ./text gz_field #测试
gz_field pts/3 2016-03-01 16:27 (172.23.33.204)
[gz_field@gim ~]$ mv text $HOME/bin #将该文件存入自己的bin目录
6).简单的执行跟踪
[gz_field@gim ~]$ cat > trace.sh #建立脚本
#!/bin/bash
set -x #打开跟踪功能 ,不会被跟踪,该命令执行后才开启跟踪功能
echo 1st echo #测试
who | grep gz_field
set +x #关闭跟踪功能,被跟踪,该命令执行后才关闭跟踪功能
echo 2nd echo
who | grep gz_jonesyan
[gz_field@gim ~]$ chmod +x trace.sh
[gz_field@gim ~]$ ./trace.sh
+ echo 1st echo
1st echo
+ who
+ grep gz_field
gz_field pts/3 2016-03-01 17:22 (172.23.33.204)
+ set +x
2nd echo
gz_jonesyan pts/1 2016-03-01 08:19 (172.23.33.209)
gz_jonesyan pts/2 2016-03-01 08:19 (172.23.33.209)
7).特殊文件:/dev/null与/dev/tty
/dev/null :
在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF。在程序员行话,尤其是Unix行话中,/dev/null 被称为位桶(bit bucket)或者黑洞(black hole)。空设备通常被用于丢弃不需要的输出流,或作为用于输入流的空文件。这些操作通常由重定向完成。
/dev/zero :
在类UNIX 操作系统中, /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。其中的一个典型用法是用它提供的字符流来覆盖信息,另一个常见用法是产生一个特定大小的空白文件。BSD就是通过mmap把/dev/zero映射到虚地址空间实现共享内存的。可以使用mmap将/dev/zero映射到一个虚拟的内存空间,这个操作的效果等同于使用一段匿名的内存(没有和任何文件相关)。
/dev/tty:
设备包括虚拟控制台,串口以及伪终端设备。 /dev/tty代表当前tty设备[tty命令],\在当前的终端中输入 echo “hello” > /dev/tty ,都会直接显示在当前的终端中。
控制终端(/dev/tty):
如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”可以查看它 具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。
/dev/console:
即控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。
目前只有在单用户模式下,才允许用户登录控制台
/dev/pty*:
即伪终端,所谓伪终端是逻辑上的终端设备,多用于模拟终端程序。例如,我们在X Window下打开的终端,以及我们在Windows使用telnet 或ssh等方式登录Linux主机,此时均在使用pty设备(准确的说应该pty从设备)。
/dev/tty0:
代表当前虚拟控制台,而/dev/tty1等代表第一个虚拟控制台,例如当使用ALT+F2进行切换时,系统的虚拟控制台为/dev/tty2 ,当前的控制台则指向/dev/tty2