《shell脚本学习指南》学习笔记之入门 一

这个博客是我结合书上所看以及网站大神总结所得,写到自己博客上,只是为了加深的印象,更加方便的学习。

为什么要使用shell脚本?

shell脚本能够轻易处理文件与目录之类的对象,而且是各UNIX系统之间经过POSIX标准化的通用的功能,因此Shell脚本只要“用心写”一次,即可应用到很多系统上,因此之所以要使用Shell脚本是基于:

简单性:Shell是一个高级语言,通过它,你可以简洁地表达发杂的操作;
可移植性:使用POSIX所定义的功能,可以做到脚本无须修改就可以在不同的系统上执行;
开发容易:可以在短时间内完成一个功能强大又好用的脚本;

第一个shell脚本

cat > testshell                    建立文件,使用cat复制终端输入
who | wc -l                程序内容
^D                     Ctrl-D表示end-of-file
$ chmod +x testshell               让文件拥有执行权限
$ ./testshell                  执行测试
//who 现在有谁登陆
//wc 字数计算程序 可以算出line ,字数 word 与 字符数 (character)。wc -l 计算出行数

当Shell执行一个程序时,会要求UNIX内核启动一个新的进程(process),以便在该进程里执行所制定的程序。当Shell要求内核执行它时,内核无法做这件事,因为它不是编译型程序,于是回应“not executable format file”(不是可执行的格式文件)错误信息。Shell收到此错误信息时,就会认为“既然不是编译型程序,那就一定是Shell脚本”,于是会启动一个新的/bin/sh(标准Shell)副本来执行该程序。

如上述当系统只有一个Shell(/bin/sh)时还行,但现行的UNIX系统都会拥有好几个Shell,那么我们就需要一种方式来告诉UNIX内核该启用那个Shell来执行,这种方式就是:在第一行的开头除使用#!这两个字符,其后跟Shell的具体路径。如:

#! /bin/sh
who | wc -l
//#!后的Shell还可以被传参数。

Shell识别三种基本命令:内建命令、Shell函数以及外部命令:

1.内建命令就是由Shell本身所执行的命令。
有些命令是由于其必要性才内建的,例如cd用来改变目录、 read会将来自用户(或文件)的输入数据传给Shell变量;
另一种内建命令存在则是为了效率,其中最典型的就是test命令,编写脚本时经常用到它;
还有I/O命令,如echo和printf;

2.Shell函数是功能健全的一些程序代码,以Shell语言写成,他们可以像命令那样引用。

3.外部命令就是由Shell的副本(新的进程)所执行的命令,基本过程如下:
建立一个新的进程,此进程即为Shell的一个副本;
在新的进程里,在PATH变量内所列出的目录中,寻找特定的命令。/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin为PATH变量典型的默认值。当命令名称含有斜杠(/)符号时,将略过路径查找步骤;
在新的进程里,以所找到的新程序取代执行中的Shell程序并执行;
程序完成后,最初的Shell会接着从终端读取下一条命令,或执行脚本里的下一条命令,如下图
这里写图片描述

变量

Shell变量名称的开头是一个字母或下划线符号,后面可以接字母、数字或下划线符号。变量赋值:

变量名=变量值
=号左右没有空格,当使用变量时,只需要在变量名前加上”$“符号.如:

#! /bin/sh
website=oseye.net
echo $website

#单行可以进行多次赋值
name=kevin age=22 sex=f
#值中包含空格时使用引号
address="guandong china"
#变量赋给别的变量
address2=$address
#当几个变量组合赋给变量可以使用双引号
info="$name $age $address"

echo $info

个人练习:

这里写图片描述
#! /bin/sh
website= /root/popo/
当我这样写是路径echo $website 没有输出
原因是:=后面我留有一个空格,值中包含空格时使用引号。

这里写图片描述

printf

由于echo有版本上的差异,会导致在UNIX版本间很难移植,因此我们一般使用最简单的echo形式,而我们常用的是prinf命令,它别echo更灵活和强大。printf命令模仿C程序库里的printf,它几乎复制了该函数的所有功能,可也查看man手册。

I/O重定向

标准输入/输出是软件设计原则里非常重要的概念:程序应该有数据的来源端、数据的目的端以及报告问题的地方,他们粉笔被称为标准输入(standard input)、标准输出(standard output)以及标准错误输出(standard error).

Shell提供了数种语法标记,可用来改变默认I/O的来源端和目的端,如<改变标准输入、>改变标准输出、>>附加到文件、|建立管道。
补充:>改变标准输出、>>附加到文件,>和>>都会在文件不存在的时候创建,>>当文件存在时会补充到文件后面。

特殊文件:/dev/null和/dev/tty

这是UNIX系统提供了两个对Shell编程特别有用的两个特殊文件:

/dev/null是大家所熟知的位桶(bit bucket),传送到此文件的数据会被操作系统丢掉,相对地,读取它则会立即返回文件结束符号。
/dev/tty是当前进程的控制终端文件,当程序打开此文件时,UNIX会自动将它重定向到一个终端,在程序必须读取人工输入时特别有用,用它产生错误信息也很不错,只是很少有人这样用
关于/dev/tty/的详解我觉得这篇博客很不错
http://blog.csdn.net/wocao1226/article/details/21749143

命令查找:

也是在$PATH路径中查找,但Linux的PATH与Windows的PATH不同是用“:”分隔,而不是“;”,可与修改.profile来永久生效PATH.

脚本参数:

可与在执行脚本的时候对它传参,各参数都是通过整数来命名,基于历史的原因,当它超过9个就要大括号把数字括起来,如:

#! /bin/sh
echo $1
echo ${10}

执行跟踪

为了调试Shell可打开跟踪(execution tracing)功能,有两种方式:向sh传递参数和shell通过set来设置。

sh -x testshell #可与通过man sh查看sh的参数帮助
#! /bin/sh
set -x  #打开跟踪功能
echo a
echo b
set +x  #关闭跟踪功能
echo c

这里写图片描述

参考博客:http://www.cnblogs.com/zhaiqianfeng/p/4621293.html
http://blog.csdn.net/wocao1226/article/details/21749143

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值