shell编程笔记

以前做linux开发时学过一些shell 编程,时间久了没接触现在竟然忘干净了,后来又开始写其他脚本语言,有点混了,写得时候一脸懵逼,于是现在记下来。部分内容摘录字其他博客,文中已作标注,表示感谢!


1. sh/bash/dash/csh/Tcsh/ksh/pdksh
  • sh:全称是Bourne Shell,是Unix最初使用的shell,在所有Unix上均可以使用,但是在处理和用户交互上做得没有其他几种好
  • bash:全称是Bourne Again Shell,是原本linux系统默认的,是sh的扩展,和sh完全兼容,并且在sh的基础上增加了许多特性,可以提供命令补全,命令编辑和命令历史等功能。很多的linux系统的sh是指向bash的符号链接
  • dash:有人认为bash过于复杂,为了获取更快的脚本执行速度,dash应运而生,dash不是为了交互,其速度更快,但是功能也少很多,语法严格遵守POSIX标准。在ubuntu中sh已经指向了dash
  • csh:全称C shell,是sh的变种,语法和C语言很类似
  • Tcsh是LInux提供的csh的一个扩展,Tcsh包括命令行编辑,可编程单词补全,拼写校正,历史命令替换,作业控制和类似C语言的语法,他不仅和Bash Shell提示符兼容,而且还提供比Bash Shell更多的提示符参数。
  • ksh;全称Korn Shell,集合了C Shell和Bourne Shell的优点并且和Bourne Shell完全兼容
  • pdksh,是linux系统提供的ksh的扩展,支持人物控制,可以在命令行上挂起,后台执行,唤醒或终止程序

在脚本的首行加上#!/bin/bash,脚本会调用bash执行,同样地,对于php脚本来说,在首行加上#!/usr/bin/php 脚本会解析称php脚本执行,不过注意给脚本加上可执行权限chmod +x test.php

2. 变量

shell脚本中变量默认是字符串变量,如果要定义整型要使用declare -i aa,不过常用的还是字符串,即使是数值加法也可以使用字符串变量,如

a=1
b=$((a+2))
echo $b
结果是 3

shell脚本中的$符号是取变量的值的意思,取值的时候如果不发生歧义可以不加{},但是有歧义时必须加,比如
echo "dsadsadsa$abcdssa", 这个时候不加括号的话就不知道$的作用范围是多少了。
注意等号两边不能有空格,在shell脚本中,空格是命令/参数之间的分割符。

3. 字符串
  • 字符串拼接, 把两个变量直接连起来写就行了,注意中间不能有空格

a="abc";b="dfg"; c=$a$b;echo $c
结果是abcdfg

- 单引号和双引号:单引号内不可以在添加变量,输出时会原样输出,而双引号可以
- 获取字符串长度:#。如${#string}, 注意必须要有大括号,因为$# 结合优先级高,而$# 代表的则是传入shell脚本的参数总个数(相应地,$1~$n 分别代表各参数值)
- 提取字符串:如str="abcd";echo ${string:1:2} , 结果是bc, 索引从0开始
- 查找子字符串位置:如str="abcdefg"; echo `expr index "$str" bc`, 结果是2,其中expr用于执行整数运算(包括加减乘除等),反引号代表的是叫将反引号内部的内容按照shell命令来执行。

4. 特殊符号
  • $? 返回上一条命令的退出状态(返回值) (refer2)
    shell编程笔记_第1张图片
  • \, 转义,含义同c语言
  • `, 反引号,命令替换
  • 通配符(虽然看起来像是正则表达式,但是是不同的,注意别混淆)(来源refer1):
    shell编程笔记_第2张图片

  • ; shell脚本中分号是分隔符,当一行中只有一条命令时不需用分号,多条命令时需要用分号隔开。行尾都不需要分号。 使用双分号(;;)可以终止case选项


    • 空命令: 等价于“NOP”(no op,一个什么也不干的命令)。也可以被认为与shell的内建命令true作用相同。:命令是一个bash的内建命令,它的退出码(exit status)是(0)
      while :
      do
      something
      done
    • 变量扩展/子串替换:在与>重定向操作符结合使用时,将会把一个文件清空,但是并不会修改这个文件的权限。如果之前这个文件并不存在,那么就创建这个文件。
      : > test.sh # 文件“test.sh”现在被清空了
      # 与 cat /dev/null > test.sh 的作用相同
      # 然而,这并不会产生一个新的进程, 因为“:”是一个内建命令
    • 环境变量中,用作分隔符
  • >>>, 用于文件时,前者会覆盖员原文件,后者会在原文件后面追加
  • , 除了上面说到的可以做通配符外,还可以用于三元操作符
    ((x=5<10?1:0))
    echo $x
  • ()[], {}, (refer 3)
    shell编程笔记_第3张图片
    shell编程笔记_第4张图片
    shell编程笔记_第5张图片
    shell编程笔记_第6张图片
5. if语句

如(refer 4)
shell编程笔记_第7张图片
if, elif 后面都要有空格,等号两边要有空格,[] 两边要有空格,当else没有对应的statement时,else应省略不写

6. while

shell编程笔记_第8张图片

7. for

shell编程笔记_第9张图片


<未完待续>


refer:
1. http://www.cnblogs.com/chengmo/archive/2010/10/17/1853344.html
2. http://blog.csdn.net/yixianfeng41/article/details/56313899
3. http://blog.csdn.net/tttyd/article/details/11742241
4. http://151wqooo.blog.51cto.com/2610898/1173381
5. while: http://lovelace.blog.51cto.com/1028430/1211927

你可能感兴趣的:(linux,工具,语言,shell,编程,linux,unix,脚本语言)