shell 函数的使用 (md中, 列表本身是有格式的, 他要产生缩进, 其次,列表项和列表项之间, 可以留有一个空行, 是合法的, 允许的)

  1. shell函数,就是 就相当于一个命令来看待和处理的, 这有助于shell解释器的写法. 在调用方法上, 跟 命令的方式是一样的, 也是 函数名 arg1 arg2 ... 函数名就相当于命令名. 对于一个命令来说, 格式是: ls /etc 命令名 [options] arg... 所以函数也是一样 funcName arg1 arg2 ... , 这里的函数名称后面, 不要加括号.

    函数的定义上, 可以加function关键字, 也可以不加. 括号中也不用写形参, 因为在调用函数的时候, 传递的参数就直接 默认的作为函数定义中的第一个形参, 第二个形参... 所以函数定义的时候, 在函数体中, 可以直接使用$1, $2, ..., 还有$0, $#, $*, $@ 等特殊变量.

  2. 相对来说, 定义函数的语法还是比较宽松的, 只是 大括号前后 应该和其他单词 有一个空格.



    在shell编程中,避免出错的秘诀就是, 一是, 不能像 C /java等高级语言中, 符号之间没有严格的分隔. 要避免shell脚本出错, 最好是 每个单词("每个语义上的单词") 之间 用空格隔开, 便于shell解释器 解析; 二是, 要时常有这样的思想: 假设你是shell的解释器, 你会怎样来解释. 要知道shell解析一条语句的方式, 如果没有检测到builtin命令或外部命令的时候,总是企图把她解析为 一个命令. 或者, 如果解析到了builtin或外部命令, 后面的内容如果不用空格分隔, 就会解析成一个 整的字符串!

  3. 关于函数和各种结构语句的写法

    结构语句可以分成多行来写, 也可以放在一行来写, 如果一行来写, 就要使用** C 语言的语法**, 每条语句后面都必须跟一个分号. 包括最后一个done语句

    变量$的扩展,必须放在双引号中, 如果是单引号, 不会扩展$, 只会当作一个普通字符来对待, 所以在表示变量的值的场合, 如 case "$read" in中, 要用双引号.

  4. 关于选择结构(分支结构)的使用

shell只的选择结构使用的是 case语句, 而不是C 语言只的switch .. case. 它直接就是case语句,没有switch.

表示分支的,用 "一个)" 来表示, 注意不是两个)), 是用两个分号;; 来代替C 语言中的break.

case 的结束符号是 esac: [i's2k]

case每一种情况中, 支持"分组 和 多选一" : 分组 只能用 | 表示, 多选一, 只能用中括号表示, 这两种不能混用, 即多选一中不能用分组, 分组也不能使用小括号.

  1. 在if for while until case 语句中, 哪些部分表示一个语句/分句?

    if: if...; then ...; fi; 由3个分句组成, then后面的内容是一个分句, 不要加分号

    for,while等: for...; do ...; done; 由3个分句组成, do后面的内容是一个分句, 不要加分号

    case: case "$read" in 1) ...;; 2)...;; *)...;; esac; 在第一种情况前都是第一个分句, 即in前后都是一个分句, 不要加分号


对于字符串变量, 建议要加上双引号, 其实加不加双引号都无所谓, 因为shell中的变量默认都是字符串, 除非你用let, expr命令, 才能进行四则运算

let可以执行多个表达式( 1+1可以是表达式, 赋值也是表达式如a=1+2) 多个表达式之间用空格 隔开, 注意不是用逗号隔开. 如: let 1+1 0+0 是正确的命令

let 计算表达式的值, 如果你不把表达式的值付给 变量, 这个值将会被丢弃.

**let有返回值, 它返回的是 最后一个表达式的值, 如: let 1+1 0+0 将返回0, 而let 0+0 1+1 则返回的是非0 **

let会自动检查是否是整数, 否则会出错.

特别注意的是, 在所有的..赋值表达式中, 等号左边的符号都应该是一个变量, 不能是$var, 因为$var会替换, 它是一个具体的数值. 给数值赋值, 会报错: assign a non-variable .

同时, 在任意一门编程语言中, 都可以用&& || 来代替简单的 if else fi.

单括号和双括号的区别?

单括号可以代替 [ 命令, 来执行判断;

双括号则可以代替 let命令来进行整数运算. 当然双括号可以横扫一切的判断和循环语句中的条件表达式

  1. trap <command> exit: trap的格式: trap "commands" signal-list

    是提供进程间的通信机制. 一个进程是当前进程, 当前执行trap命令的这个进程; 另外的进程, 是发送 signal-list中的进程或操作/终端等.

    trap提供应用程序提供一种异步的软件中断, 使应用程序有机会接受其他程序和 终端2发送的命令(即信号). 应用程序收到信号后, 有三种处理方式: SIG_IGN, 忽略该信号; SIG_DFT采取系统默认的处理方式, 通常是终止进程或忽略; 如果给该信号指定了一个处理函数(捕捉), 则会中断当前进程正在执行的任务, 转而去执行该信号的处理函数, 返回后再继续执行被中断的任务.

trap "commands" SIGNALS trap意思是捕捉, 就是说 cpu(系统) 去捕捉后面的signal-list中的信号, 一旦捕捉到了之后, 就会暂时中断当前的事(放下...), 去执行 commands... 执行完了之后, 返回当前进程(通常是shell) , 然后再去执行 当前被中断的事情.

信号有: HUP(hang up挂起), INT(interrupt中断), QUIT(退出)等.

#!/bin/bash

times=1

while [ 1 ]
do
echo "this time is $times "
trap "exit" INT // 按ctrl-c中断信号, 执行exit. let times++ done unset times
~
~
~
~

在shell语句中, 独立的单词与单词 之间, 分号与单词之间, 他们中间的空格是可以任意多个的. 但是除此之外, **凡是符号/括号, 包括单双大中小 括号, 与其中的 内容, 中间的空格是 严格要求的: 有的空格是必须的, 如 [, 而有的空格又是不能要的 , 如: 大括号中的数字范围 {1..10}

for的结构类型包括

第一. for 后面是一个列表, 是多个离散的数字值时

  • for i in 1 2 3 ; do echo $i; done // 一般后面的项比较少时, 可以这样列举

  • for i in {1..10}; do echo $i; done // 这里注意两个问题, 一是表示 "到, 范围的符号是 .., 而不是冒号", 另外, 使用的是大括号, 而不是双小括号, 并且大括号和数字之间不能有空格.

  • 使用seq命令: seq是按照steps [INCREMENT] 产生一些列数字

    注意的是, /usr/bin/seq 命令中的 increment 是放在 first 和 last之间的, 不是放在最后的! 同时, 由于seq 是命令, 因此, 在 for后面要 用 反引号或 小括号 括起来.

  • 使用双括号括起来, 类似c语言的语法:

    for ((i=0; i<10; i++)) ; do echo $i ; done

第二. for 后面循环的 是文件时. 通常有两种命令, 一是 ls , 二是 find命令:

    for file in `ls *.sh` ; do echo

第三, for 打印basename文件名:

首先注意, basename是一个 shell的命令, 不是函数:



其次, basenanme的suffix是可以自己随意指定的, 不一定就是点号后面的部分



然后, suffix可以放在最后, 也可以用-s(--suffix)放在basename后面, 作为options看待.

until循环

until很简单,只要记住它与while正好相反即可,即条件为假继续执行,条件为真,就跳出循环。

注意for循环和shift.

shift: 一句话, 删除$@ 或$*队列中的第一个参数. 这样, $#总数减少一, 同时原来的参数$i 依次就等于其后面的 $i+1, 即: $1=$2, $2=$3等等.

shell编程中的 三种结构: 条件if/选择结构case/循环for/while/until等结构 和 函数的用法的更多相关文章

  1. Android编程中的5种数据存储方式

    Android编程中的5种数据存储方式 作者:牛奶.不加糖 字体:[增加 减小] 类型:转载 时间:2015-12-03我要评论 这篇文章主要介绍了Android编程中的5种数据存储方式,结合实例形式 ...

  2. Shell编程中while与for的区别及用法详解【转】

    在shell编程中经常用到循环,常用的循环有for和while循环两种.while循环默认以行读取文件,而for循环以空格读取文件切分文件,本篇就结合现网的一些使用示例说说二者的用法和区别. 一.常用 ...

  3. Netty中的三种Reactor(反应堆)

    目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...

  4. shell编程中的单/双 小括号, 中括号, 大括号

    linux shell中的变量类型?分字符串或者数字或者bool类型吗? 参考: http://www.cnblogs.com/nufangrensheng/p/3477281.html 不分! sh ...

  5. SQL Server中的三种Join方式

      1.测试数据准备 参考:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek 这篇博客中的实验数据准备.这两篇博客使用了相同的实验数据. 2.SQ ...

  6. Java三大框架之——Hibernate中的三种数据持久状态和缓存机制

    Hibernate中的三种状态   瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...

  7. 基于Keil C的覆盖分析,总结出编程中可能出现的几种不可预知的BUG

    基于Keil C的覆盖分析,总结出编程中可能出现的几种不可预知的BUG,供各位网友参考 1.编译时出现递归警告,我看到很多网友都采用再入属性解决,对于再入函数,Keil C不对它进行覆盖分析,采用模拟 ...

  8. 研究分析JS中的三种逻辑语句

    JS中的三种逻辑语句:顺序.分支和循环语句. 一.顺序语句 代码规范如下:1. <script type="text/javascript"> var a = 10;  ...

  9. shell编程—变量(三)

    在shell脚本中,变量分两种,系统变量和自定义变量. 系统默认变量是系统自带的一些变量,如path为路径变量 用户自定义变量为在编写吧脚本的时候自己定义的一些变量 变量名命名规则 首个字符必须为字母 ...

随机推荐

  1. sql 存储过程命名规范

    规范的命名可以提高开发和维护的效率,如果你正在创建一个新的存储过程,请参考如下的命名规范. 句法: 存储过程的命名有这个的语法:[proc] [MainTableName] By [FieldName ...

  2. Robot Framework 遇到过的错误 1. Chrome打开无法数据网址,地址栏只显示data:,

    问题描述:用RF打开网页时未跳转到指定网址,而是显示data:, *** Settings ***Library SeleniumLibrary *** Test Cases ***Login_Tes ...

  3. Java多线程-----理解CountDownLatch

       CountDownLatch简介  CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier.Semaphore.ConcurrentHa ...

  4. VIM For Windows 1

    some tips for using vim in windows. 1,download the software vim and install it, you can go to the Of ...

  5. C# foreach 中获取索引index的方法[转]

    在C# 开发中往往使用foreach 循环语句 来代替for循环语句.foreach 比 for 更加简洁高效.           foreach :                 foreach ...

  6. linux常用命令:mkdir 命令

    linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 1.命令格式: mkdir [选项] 目录... 2.命令 ...

  7. 那些年 Qzone

    那些年转在Qzone里的: 不喊痛,不一定没感觉.不要求,不一定没期待.不落泪,不一定没伤痕.不说话,不一定没心声.沉默,不代表自己没话说.离开,不代表自己很潇洒.快乐,不代表自己没伤心.幸福,不代表 ...

  8. How to install john deere service advisor 4.2.005 on win 10 64bit

    How to install john deere service advisor 4.2.005 with the February 2016 data base disks on a machin ...

  9. css 初级进阶

    摘自:https://www.jianshu.com/p/dcc40ccc9841 CSS中级 Class和ID选择器 CSS初级教程中我们可以使用HTML标签选择器定义样式. 同样你也可以使用Cla ...

  10. The Little Prince-12/04

    The Little Prince-12/04 The wheat fields have nothing to say to me. And that is sad. But you have ha ...