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

《shell脚本学习指南》自学笔记——入门

2014年11月22日 ⁄ 综合 ⁄ 共 2182字 ⁄ 字号 评论关闭

#这个是我自己自学的一点笔记和心得,如果有什么错误请大家指出,谢谢。

(1)一个简单的脚本


who
#列出登录的用户,下面利用管道
who | wc -l
#将列出登录的用户数量。who的输出,成了wc的输入。

下一步,将管道转变为独立的命令
建立管道文件,用cat复制终端的输入: cat > nusers
然后写入内容: who | wc -l
以 ^D 作为文件结束符
接着改掉此管道文件的权限,让文件可执行:chmod +x nurses
最后便可以直接进行测试了: ./nurses 

注意:
(1)写入管道文件时不要输入错误,否则就算用delete或backspace也不管用了,只能将此文件rm掉再重写了。
(2)我们的nusers shell脚本并不是编译型程序,内核是无法执行这种格式的,所以shell会启动一个新的/bim/sh(标准shell)副本来执行该程序。这种方法并不适用于拥有多个shell的系统,所以我们需要一种方式来告知内核应该以什么shell来执行所指定设立了脚本,方法是:在脚本文件的第一行的开头处使用#!这两个字符。

(2)#!


shell脚本通常一开始都是#!/bin/sh。

学习中的一些陷阱:#!这一行的长度在不同的系统中是有不同的限制的;不能在选项最后有任何空白,这些空白也会跟着选项一起传递;最好写上完整路径名称。

下面是一个修订过的nurse程序:

#!/bin/sh -
who | wc -l

其中,选项 表示没有选项,这样可以避免一些欺骗式攻击。

(3)命令与参数


shell会沿着$PATH来寻找命令

命令书写规则:
(1)空白隔开命令行中各个组成部分
(2)命令名称是命令行的第一个项目,其后跟着选项
(3)选项开头为一个减号,然后跟着字母,字母可以为多个
(4)最后,分号用来分隔同一行里的多条命令,shell会依次执行这些命令,。如果用的是&符号,shell就将在后台执行其前面的命令,这就意味着shell不需要等到该命令完成,就可以继续执行下一个命令。

(4)变量


shell变量无长度限制,赋值时不允许加入空格,即是:变量名,紧接着=字符,最后是新值,当赋予的值有空格时,需加上引号
要取出变量的值时,在变量名前加上$字符
例:Full_Name="fengxiaoke neu"
   Copy_Name=$Full_Name(此处加不加双引号都没关系)
注意:当将几个变量连接起来时,就必须使用双引号了:Full_Name="$First $Second $Final"

echo可将变量的值输出,如:echo $Full_Name;echo "Enter the name:"。echo会提供换行符,echo里面有一些转义字符,可以谷歌一下。

对于比较复杂的输出,我们可以使用printf。

printf命令模仿了C library里的printf(),它几乎复制了其所有的功能。
例:printf "%s,%s,I'm happy to help you\n" Hello world
输出:Hello,world,I'm happy to help you

(5)I/O重定向


<  改变标准输入:program < file可将program的标准输入改为file
>  改变标准输出:program > file可将program的标准输出改为file,在file不存在时会新建一个file,如果已存在,则会覆盖原有的数据。
>>  附加到文件:program >> file可将program的标准输出附加到file的结尾处,其处理file的存在与否的方式只有在已存在时不同,file已存在时,不会覆盖数据,而是附加到结尾。
|  建立管道:program1 | program2可将program1的标准输出修改为program2的标准输入,这样管道可以使得执行速度比使用临时文件的程序快上十倍。

#< 和 > 可以被想象成漏斗,数据会从大的一端进入,由小的一端出来。

(6)/dev/null和/dev/tty


/dev/null是位桶,传送到此文件的数据都会被系统丢掉。当数据写入到这个文件时,程序会认为它已成功完成写入操作,其实什么事情都没有发生过;相反的,如果读取这个文件则会立即返回EOF。
/dev/tty被打开时,系统会自动将其重定向到一个终端。

(7)看看下面的命令做了什么


$ cd
$ mkdir bin
$ mv nusers bin
$ PATH=$PATH:$HOME/bin
$ nusers

(8)继续看看下面的命令又做了什么


$cat > Find_User
#!/bin/sh
#find a user
who | grep $1
^D

$sudo chmod +x Find_User
$./Find_User fengxiaoke
$mv Find_User $HOME/bin
(此程序还不完美,我们需要给它加上测试命令行参数数目的功能)

(9)初学执行跟踪


set -x  将执行跟踪功能打开

set +x  将执行跟踪功能关闭

一个简单的例子:
$car > Set_Test.sh
#!/bin/sh
set -x  #打开跟踪功能
echo 1st echo  #执行一些操作

set +x  #关闭跟踪功能
echo 2nd echo  #执行一些操作
^D

$sudo chmod +x Set_Test.sh

$./Set_Test.sh

+ echo 1st echo 被跟踪的第一行
1st echo  命令的输出
+ set +x  被跟踪的下一行
2nd echo  下一个命令的输出

抱歉!评论已关闭.