编写LinuxShell程序1

    技术2026-05-08  1

    #!bash 井号是起注释作用的

    rm -f xxx f是强制删除的意思ps 是显示当前前台进程状态ps -e 是显示当前所有进程状态(前台和后台全部都在)ls -l 是显示当前目录下所有文件的读写权限刚刚创立的shell脚本是不能执行的,有两种方式可以执行,1. 使用shell工具进行解析

    sh xxx.sh 

     

    2. 修改脚本的权限,一般使用755比较多

    chmod 755 xxx.sh 

    cat命令也用的比较多,用来在终端显示文件的内容,对于比较短的脚本比较适合。简单的脚本

    while true #循环判断,在目前状态下是没有终止条件的,相当于是一个死循环 do date; #查询当前日期 sleep 1; #让计算机休眠一秒 done 

     

    变量

    shell有两种变量,环境变量和临时变量。环境变量是永久性变量,其值不会随着shell执行过程的结束而结束,会以最近更新的值保存下来。而临时变量是shell内部程序定义的,它的使用范围仅限于定义它的程序,出了本程序就不能再使用了。

    工具:echo命令,用来回显后面的字符串

    环境变量:

     

     

    echo $PATH echo $HOME echo $HOSTNAME echo $LOGNAME 

     

    1. PATH,路径的环境变量,指的是当前系统提供的程序执行的路径。会显示程序的执行路径。2. HOME,显示当前用户所属的家路径。3. HOSTNAME(显示当前的主机名)4. LOGNAME,显示当前shell终端的用户登录名

    如何修改环境变量呢我们使用export命令来对环境变量进行添加和充实

     

    pandachow@pandachow:~$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games pandachow@pandachow:~$ export PATH=/home/pandachow:$PATH pandachow@pandachow:~$ echo $PATH /home/pandachow:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

    注意几点,此处添加的路径为/home/pandachow,需要在后面添加冒号,意思为将添加的路径加原来的PATH变量的中,再一起赋给PATH。我们使用echo可以看到PATH变量已经成功修改了。下面是临时变量,也就是用户自定义的变量,这种变量的一般命名和赋值的形式是:变量名=字符串

     

    pandachow@pandachow:~/workspace/test$ myfile=/home/pandachow/workspace/test/matrix.cpp pandachow@pandachow:~/workspace/test$ echo $myfile /home/pandachow/workspace/test/matrix.cpp  

    上面的例子中,可以看到,开始将/home/.../matrix.cpp这个字符串(也就是路径)赋给了myfile这个变量名,当然是我们的自定义变量。然后再echo $myfile的时候,就看到了该文件的路径名。

    在shell中的输入/输出可以使用read命令来由标准输入读取数据,然后赋给指定变量。一般格式为:read 变量1 [变量2].......

    shell中的特殊字符,shell里除使用普通字符意外,还会使用一些特殊字符,他们都有一些特殊的含义,在使用的时候需要注意他们表示的意义和作用范围。1. 通配符,通配符主要用于模式匹配。例如文件名匹配,路径名搜索,字符串查找等等。2. 引号,引号分为单引号和双引号。双引号里面除了$, / 和倒引号仍然保留其特殊用途 ,其余字符均视为普通字符串。单引号里面所有的字符都视作普通字符串。

     

    输入输出重定向1. 输入重定向,输入重定向(<) 是指将文件的内容输出到电脑屏幕上,也就是显示在终端里。2. 输出重定向,输出重定向( >) 是指将一个命令(或可执行程序)的标准输出重定向到指定文件。这样改命令的输出结果就不在屏幕上显示,而是写入指定的文件中。上面的例子中,可以看到,开始将/home/.../matrix.cpp这个字符串(也就是路径)赋给了myfile这个变量名,当然是我们的自定义变量。然后再echo $myfile的时候,就看到了该文件的路径名。

     

     

    pandachow@pandachow:~/workspace/test$ who >abc pandachow@pandachow:~/workspace/test$ ls pandachow@pandachow:~/workspace/test$ cat abc pandachow tty7 2011-02-18 02:19 (:0) pandachow pts/0 2011-02-18 03:16 (:0.0)

    在上面的例子中,可以看到,命令who的结果并没有显示在终端里,而是被写入一个abc文件(这个文件可以事先不存在,执行输出重定向的时候系统自动创建),cat这个abc文件之后,可以看到who的结果已经被写入了abc这个文件当中。

    注释,管道和后台命令1. 注释。如前面所介绍的,shell程序中的注释使用#号。2. 管道线。在Linux中,管道是用竖杠(|)来隔开若干个命令组成的序列,例如

     

    pandachow@pandachow:~$ ls a.sh Desktop Downloads Music Public Selection_001.png Templates Videos writing Azureus Downloads Documents examples.desktop Pictures robocup simspark texmf workspace pandachow@pandachow:~$ ls -l total 156 -rw-r--r-- 1 root root 43 2011-02-18 13:09 a.sh drwxr-xr-x 3 pandachow pandachow 4096 2011-02-10 17:11 Azureus Downloads drwxr-xr-x 2 pandachow pandachow 4096 2011-02-16 01:03 Desktop drwxr-xr-x 6 pandachow pandachow 4096 2011-02-11 17:10 Documents drwxr-xr-x 14 pandachow pandachow 4096 2011-02-18 13:16 Downloads -rw-r--r-- 1 pandachow pandachow 179 2010-12-03 15:26 examples.desktop drwxr-xr-x 2 pandachow pandachow 4096 2010-12-03 17:45 Music drwxr-xr-x 3 pandachow pandachow 4096 2011-02-18 13:15 Pictures drwxr-xr-x 2 pandachow pandachow 4096 2010-12-03 17:45 Public drwx------ 14 pandachow root 4096 2011-02-16 20:15 robocup -rw-r--r-- 1 pandachow pandachow 92986 2011-02-18 14:37 Selection_001.png drwxr-xr-x 6 root root 4096 2010-12-31 12:25 simspark drwxr-xr-x 2 pandachow pandachow 4096 2010-12-03 17:45 Templates drwxr-xr-x 4 pandachow pandachow 4096 2011-01-19 00:44 texmf drwxr-xr-x 6 pandachow pandachow 4096 2011-02-10 17:58 Videos drwxr-xr-x 5 pandachow pandachow 4096 2011-01-11 17:48 workspace -rw-r--r-- 1 pandachow pandachow 39 2011-02-15 21:57 writing pandachow@pandachow:~$ ls $HOME |wc -l 17 pandachow@pandachow:~$ ls -l $HOME |wc -l 18

    前面是ls -l $HOME,等同于:ls -l /home/pandachow,因此是列出/home/pandachow/这个目录下的所有文件名,并显示他们的权限,管道线后面跟着的是wc -l,这个是显示文本行数,在列出文件名之后使用这个命令就是列出当前目录下文件的数目+1,这里显示18个是已经包括了一个前面统计的total 156这一行。

    再举一个例子例如我想查看现在进程中有没有播放器开启的,假设播放器都叫XXplayer,或者说名字里都带有player这个关键词。

     

    pandachow@pandachow:~$ ps -e | grep player 28071 ? 00:02:05 smplayer 28074 ? 00:06:05 mplayer

    我们使用ps -e来显示当前所有的进程名(ps -f, 能显示进程的调用路径),管道线之后是用grep命令来进行名称过滤,只提取出名字里含有player的。前面会显示它的pid进程号,如果我们想关闭某个命令,可以在终端输入kill+进程号,例如:kill 28071即可关闭刚才的smplayer进程。

    管道命令中,有一类又叫做过滤器,好比从前一个命令中得到输入,使用这个命令之后再输出结果,类似过滤的效果。这样的命令常用的有:grep,tail,sort和wc等。

    一个管道线也会有多个命令

     

    ls | grep m?.cpp | wc -l #这条管道命令来显示当前目录下所有2个字母,而且第一个字母是m,后缀是cpp的文件的数目,特别注意,这里?只能代表一个字符,如果是多个字符,要是用*来通配 ls | grep m*.cpp | wc -l

    后台命令有时候,我们不希望在前台看到命令的执行过程,可以在一条命令的末尾加上&符号,可以实现命令后台运行。

    //=====================前台模式===================== pandachow@pandachow:~$ while true; do date; sleep 1; done Fri Feb 18 16:27:49 CST 2011 Fri Feb 18 16:27:50 CST 2011 Fri Feb 18 16:27:51 CST 2011 ^C //======================下面是后台=================== pandachow@pandachow:~$ while true; do date; sleep 1; done& [1] 31813 pandachow@pandachow:~$ Fri Feb 18 16:28:42 CST 2011 Fri Feb 18 16:28:43 CST 2011 Fri Feb 18 16:28:44 CST 2011  

    前台模式中,虽然程序在运行,但是这时候我们并不是执行其他命令,只能用强制结束它之后才能继续使用。

    后台模式中,程序在后台运行,因此系统在执行创建进程的时候,在终端上显示这个这个进程的PID,方便我们控制。因此类似这样的一个没有自带终止条件的程序是很危险的,因为他会在后台运行,但是我们却又不能直接控制它,此时,仍然可以在终端里输入其他命令,只不过会被这个后台的输出打断。因此我们使用kill+进程号来终止这个进程。

     

     

     

     

    最新回复(0)