Shell编程基础

声明:这篇文章中的大多数内容是从精通Unix Shell脚本编程一书的第一章总结出来的,目的是方便查阅参考,每一点内容都很粗,具体还需要参考帮助文档。

1.区分大小写

Shell脚本是区分大小写的。

2.特殊字符

脚本中有些字符是有其特殊含义的,如果要表达其本身的含义则必须使用反斜杠进行转义。特殊字符有\( ; # ? $ & ( ) [ ] { } ` ' “ +

3.注释

shell脚本中,以#开头的是注释。在实际编写脚本中我们应该要注意使用清晰的注释,以便于后期的维护。

4.控制结构

控制结构太简单了,这里不再列举,语法规则类似于C语言,很好理解。

5.符号命令

shell中有一些很常见的符号命令,它们的意义如下:

  • ():在一个子shell中运行括号扩起来的命令

  • (()):在某个shell中对变量进行求值和赋值并进行数学运算

  • $(()):对扩起来的表达式进行求值

  • []:与test命令相同

  • $():命令替换

  • `command`:命令替换

6.shell字符串

shell中其实只有两种数据类型(字符串和数字,其实数字也是字符串),可见字符串的重要性。字符串可以使用单引号、双引号,也可以不使用引号。

单引号有这些限制:1.单引号中的字符串会原样输出,单引号中引用变量是无效的。单引号字符串中不能出现单引号,转义后也不可以。

双引号中可以引用变量,也可以使用转义字符。

拼接字符串的方法是将两个字符串写到一起就可以了。

获取字符串长度的方法是${#str_name}

7.变量替换

shell中的变量替换可以根据变量的状态(是否为空,是否定义等)改变它原来的值。可以使用的替换形式如下表。

    

${var}

变量本来的值

${var:-word}

如果变量 var为空或已被删除(unset),那么返回word,但不改变var的值。

${var:=word}

如果变量 var为空或已被删除(unset),那么返回word,并将var的值设置为 word

${var:?message}

如果变量 var为空或已被删除(unset),那么将消息message送到标准错误输出,可以用来检测变量var是否可以被正常赋值。
若此替换出现在Shell脚本中,那么脚本将停止运行。

${var:+word}

如果变量 var被定义,那么返回 word,但不改变var的值。

8.命令行参数

脚本中可以使用$0,$1,$2...$9这些变量来表示传入脚本的参数,其中$0表示的是脚本或函数的名字,$1,$2...$9这些变量叫做位置参数。注意这些变量在脚本和函数中的意义是不同的。

9.shift命令

shift命令用来将命令参数向左移动,例如,shift命令使得$2变为$1;我们还可一为shift命令添加一个数字参数用来说明移动多少个位置,例如shift3会将$3移动到$0

10.特殊参数$*$@

$*$@允许我们一次访问所有的命令行参数,除非用双引号将二者扩起来,否则二者意义相同。$*$@都是表示所有的命令行参数;''$*''将整个参数列表作为一个参数来获取,''$@''获取整个参数列表,并将它们分隔成多个参数。

11.双引号''、单引号'和符号`

这三个符号很容易使人困惑。区分如下:当我们允许命令替换和字符替换的语句中可以使用双引号;当我们不允许命令替换和字符替换的语句中可以使用单引号,使用它表示语句中的所有特殊字符(单引号本身除外)的含义都没有了,只表示自身的意思;当我们希望执行某个命令并替换其输出结果时可以使用`符号,这是命令替换的一种,与$(command )的含义相同。

12.数学运算

脚本编程中,通常使用let命令或((expr))来进行整数运算,使用bc函数进行浮点数运算。

13.文件权限、suidsgid程序

脚本编写完成后,需要使用chmod命令为脚本设置文件权限使其可执行。

14.设置陷阱

有时,程序在执行过程中会碰到意外情况而异常终止,这时候,我们可能需要捕获这种情况,然后做一些清理工作。trap命令给我们提供了这样的能力。它允许我们的程序在收到信号、执行每条命令之前(调试模式)或者函数返回前都能够有机会执行我们自己定义的任务(比如清理工作或统计工作)。具体使用方法可以通过helptrap查看。

15.用户信息命令

有时我们需要向系统查询有关系统用户的某些信息。who命令允许我们查询系统当前登录的用户的信息,包括登录时间和登录地点等。w命令是扩展的who命令,它提供了有关用户更完整的信息,它非常重要的一点是可以查看用户在执行w命令时正在干什么。具体详细信息可以查看manwho manwlast命令可以跟踪有什么人登录到过系统,这些信息来自wtmp文件。

16.ps命令

ps命令可以查看当前系统中的进程信息。该命令有非常复杂的选项和参数,但大多数我们并不常用,下面列举一些我们常用的。

  • ps:列举当前用户的进程信息

  • ps-f:列举当前用户的进程的完整信息

  • ps-ef:列举除内核进程外所有进程的完整信息

  • ps-A:列举所有进程,包括内核进程信息

  • psauxw:根据CPU的使用时间%CPU排序后显示的进程列表

    17.与用户通信

有时候,我们可能需要和当前登录到系统中的用户进行通信。其中一个方法是使用/etc/motd文件,它保存了每次用户登录到系统时会看到的信息。但是如果一个用户一整天都保持登录状态,那么它将不会看到该信息。为了用户之间可以实时通信,我们可以使用如下工具:

  • wall:在本地主机上的所有用户屏幕上显示一条消息

  • rwall:在远程主机上的所有用户屏幕上显示一条信息

  • write:显示一条消息给某个单独的用户,该用户必须时登录用户

  • talk:使用它可以实现用户之间的聊天

    18.大写或小写化文本

我们经常会碰到需要比较文件名、变量等字符串的情况,为了方便比较,我们通常需要先将其转化为大写或小写的形式,trdeclear(本身是用来修改变量属性的)可以完成这一功能。具体参考mantr或者helpdeclear

  • 19.检查返回代码

当系统执行完一条命令后会返回该命令的的响应,称之为返回代码。如果命令被成功执行,那么返回代码为0,否则返回除0以外的其它值。为检查返回代码,可以测试Shell变量$?

  • 20.基于时间运行的脚本

有时我们需要编写定时运行或者在某个特定时间运行的脚本。cron表是一个系统文件,系统每分钟读取它一次,而且执行已安排在该时间段内的任何任务。默认情况下,任何用户都可以执行使用crontab命令来创建一个cron表,但是系统管理员可以使用cron.allowcron.deny文件来控制哪些用户可以创建cron表,哪些用户不可以。当某个用户创建自己的cron表时,其中的命令、程序或者脚本将在用户的环境中执行。at命令也可以完成类似的工作。具体细节查看mancrontabmanat

  • 21.getopts解析命令行参数

使用getopts命令可以解析命令行参数。Helpgetopts可以获取更详细的内容。

  • 22.输入输出重定向

通常情况下,每个命令在运行时默认都会同时打开三个文件,标准输入(文件描述符0)、标准输出(文件描述符1)、标准错误(文件描述符2)。默认情况下,标准输入指向键盘,标注输出和标准错误指向显示器。我们可以使用重定向来该表默认行为。下面是所有可用的重定向命令


command> file

将输出重定向到 file

command< file

将输入重定向到 file

command>> file

将输出以追加的方式重定向到 file

n> file

将文件描述符为 n的文件重定向到 file

n>> file

将文件描述符为 n的文件以追加的方式重定向到file

n>& m

将输出文件 m n合并。

n<& m

将输入文件 m n合并。

<<tag

将开始标记 tag和结束标记 tag之间的内容作为输入。

  • 23.HereDocument

这是一种特殊的重定向方式,它的基本形式是:

command<< delimiter

content

delimiter

它的作用是将两个delimiter之间的内容作为输入传递给command。注意结尾的delimiter一定要顶格写,前面不能有任何字符,后面也不能有任何字符。

  • 24.创建伪随机数

Shell提供一个$RANDOM变量,它本身提供了从0到最大最大整数之间的随机数,我们可以利用它,经简单处理后来获取任意范围的随机数。

  • 25.数基转换

需要将数字在不同基数之间转换可以使用printf命令,顾名思义,它是Cprintf函数的命令行版本,它们的参数也基本相同。

  • 26.创建菜单项

在交互式脚本中,需要让用户从一个列表中选择某一项时可以使用select命令,具体使用参考helpselect

  • 27.删除重复行

当需要删除或者统计一个文件中的重复时,可以使用uniq命令,具体更多细节可以参考manuniq

  • 28.数组

bash只支持一维数组。数组元素的下标从0开始,下标的范围没有上限。Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:array_name=(value1... valuen)

也可以分开单个进行赋值,而且赋值时下标没有必要连续。

读取数组中元素的方法为${array_name[index]}使用@*代替index可以获取数组中的所有元素。

获取数组长度的方法为${#array_name[*@]}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值