转自:http://blog.csdn.net/gexiaobaohelloworld/article/details/7973846

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[-]

  1. Shell环境设置
    1. 1 登陆欢迎信息
    2. 2 bash环境配置文件
    3. 3 常见的环境变量
      1. 31 环境变量
      2. 32 设置方法
    4. 4 bash中的通配符和特殊符号和组合按键
      1. 41 通配符
      2. 42 特殊字符
      3. 43 组合按键
    5. 4 数据流重定向
    6. 5 命令执行的判断依据
    7. 5 shell脚本调试
  2. 语法基本介绍
    1. 1 开头
    2. 2 注释
    3. 3 变量
      1. 34 参数扩展正则表达式
    4. 4 declare
    5. 5 数值计算
      1. 方法1declare -i
      2. 方法2var expression
    6. 6 数组
    7. 7 语句块
    8. 7 特殊变量
    9. 8 输入与输出
    10. 9 Here Document说明文字
    11. 10 退出状态
    12. 11 测试结构与操作符
  3. shell命令与流程控制
    1. 1 Unix 命令
    2. 3 流程控制
      1. 31if语句
      2. 32case
      3. 33 selsect
      4. 34while
      5. 35 until
      6. 36for
      7. 37 beak
      8. 38 continue
    3. 4 source命令和dot命令
    4. 5 export命令
    5. 6 exec命令
    6. 7 shift命令
    7. 8 trap命令
    8. 9 多进程控制
  4. 函数
    1. 1 函数定义语法
    2. 2 函数返回值的两种办法
    3. 3 实例分析
  5. 我的脚本模板
  6. 实例

http://www.blogjava.net/liubowu/archive/2007/06/25/99317.html

1 Shell环境设置

1.1 登陆欢迎信息

终端机接口 (tty1 ~ tty6) 登陆的时候,会有几行提示的字符串,在
  1. #source ~/.bashrc
  2. #.  ~/.bashrc
用info bash builtin命令可以列出所有的bash内置命令。

File: bash.info,  Node: Builtin Index,  Next: Reserved Word Index,  Prev: Copying This Manual,  Up: Top

Index of Shell Builtin Commands
*******************************

* Menu:

* .:                                     Bourne Shell Builtins.
                                                              (line  16)
* ::                                     Bourne Shell Builtins.
                                                              (line  11)
* [:                                     Bourne Shell Builtins.
                                                              (line 212)
* alias:                                 Bash Builtins.       (line  11)
* bg:                                    Job Control Builtins.
                                                              (line   7)
* bind:                                  Bash Builtins.       (line  21)
* break:                                 Bourne Shell Builtins.
                                                              (line  29)
* builtin:                               Bash Builtins.       (line  92)
* caller:                                Bash Builtins.       (line 100)
* cd:                                    Bourne Shell Builtins.
                                                              (line  36)
* command:                               Bash Builtins.       (line 117)
* compgen:                               Programmable Completion Builtins.
                                                              (line  10)
* complete:                              Programmable Completion Builtins.
                                                              (line  28)
* continue:                              Bourne Shell Builtins.
                                                              (line  55)
* declare:                               Bash Builtins.       (line 136)
* dirs:                                  Directory Stack Builtins.
                                                              (line   7)
* disown:                                Job Control Builtins.
                                                              (line  83)
* echo:                                  Bash Builtins.       (line 191)
* enable:                                Bash Builtins.       (line 243)
* eval:                                  Bourne Shell Builtins.
                                                              (line  63)
* exec:                                  Bourne Shell Builtins.
                                                              (line  70)
* exit:                                  Bourne Shell Builtins.
                                                              (line  82)
* export:                                Bourne Shell Builtins.
                                                              (line  88)
* fc:                                    Bash History Builtins.
                                                              (line  10)
* fg:                                    Job Control Builtins.
                                                              (line  16)
* getopts:                               Bourne Shell Builtins.
                                                              (line 103)
* hash:                                  Bourne Shell Builtins.
                                                              (line 145)
* help:                                  Bash Builtins.       (line 271)
* history:                               Bash History Builtins.
                                                              (line  39)
* jobs:                                  Job Control Builtins.
 * kill:                                  Job Control Builtins.
                                                              (line  57)
* let:                                   Bash Builtins.       (line 280)
* local:                                 Bash Builtins.       (line 287)
* logout:                                Bash Builtins.       (line 297)
* popd:                                  Directory Stack Builtins.
                                                              (line  37)
* printf:                                Bash Builtins.       (line 301)
* pushd:                                 Directory Stack Builtins.
                                                              (line  58)
* pwd:                                   Bourne Shell Builtins.
                                                              (line 163)
* read:                                  Bash Builtins.       (line 326)
* readonly:                              Bourne Shell Builtins.
                                                              (line 172)
* return:                                Bourne Shell Builtins.
                                                              (line 187)
* set:                                   The Set Builtin.     (line   9)
* shift:                                 Bourne Shell Builtins.
                                                              (line 200)
  * shopt:                                 Bash Builtins.       (line 387)
* source:                                Bash Builtins.       (line 618)
* suspend:                               Job Control Builtins.
                                                              (line  94)
* test:                                  Bourne Shell Builtins.
                                                              (line 212)
* times:                                 Bourne Shell Builtins.
                                                              (line 278)
* trap:                                  Bourne Shell Builtins.
                                                              (line 283)
* type:                                  Bash Builtins.       (line 622)
* typeset:                               Bash Builtins.       (line 653)
* ulimit:                                Bash Builtins.       (line 659)
* umask:                                 Bourne Shell Builtins.
                                                              (line 324)
* unalias:                               Bash Builtins.       (line 737)
* unset:                                 Bourne Shell Builtins.
                                                              (line 341)
* wait:                                  Job Control Builtins.
                                                              (line  73)
                                                           (line  25)

可以通过使用命令info builtin查看所有命令的详细用法

转载:http://blog.chinaunix.net/u2/71769/showart_2226369.html

1.3 常见的环境变量

1.3.1 环境变量

存储在文件/etc/profile中

$PATH:决定了shell将到哪些目录中寻找命令或程序。
$HOME:当前用户主目录。
$MAIL:是指当前用户的邮件存放目录。
$SHELL:是指当前用户用的是哪种Shell。
$HISTSIZE:是指保存历史命令记录的条数。
$LOGNAME:是指当前用户的登录名。
$HOSTNAME:是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。
$LANG/LANGUGE:是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。
$PS1:是基本提示符,对于root用户是#,对于普通用户是$,也可以使用一些更复杂的值。
$PS2:是附属提示符,默认是“>”。
$IFS:输入域分隔符。当shell读取输入时,用来分隔单词的一组字符,它们通常是空格、制表符和换行符。
$0:shell脚本的名字。
$#:传递给脚本的参数个数。
$$:shell脚本的进程号,脚本程序通常会用它生成一个唯一的临时文件,如/tmp/tmfile_$

1.3.2 设置方法

echo:显示指定环境变量。
export:设置新的环境变量。
env:显示所有环境变量。
set:显示所有本地定义的shell变量。
unset:清除环境变量。

将一个路径加入到PATH变量中:

如在PATH 这个变量当中“累加”一个新目录 这个目录

  1. #1,控制台中:
  2. $ PATH="$PATH":/my_new_path"
  3. #2,修改profile文件:
  4. $ vi /etc/profile
  5. 在里面加入:
  6. export PATH="$PATH:/my_new_path"
  7. #3,修改.bashrc文件:
  8. $ vi /root/.bashrc
  9. 在里面加入:
  10. export PATH="$PATH:/my_new_path"
  11. #后两种方法一般需要重新注销系统才能生效,最后可以通过echo命令测试一

1.4 bash中的通配符和特殊符号和组合按键

注意,这里的通配符虽然和正则表达式相似,但是是基于bash解释器解析的,而正则表达式由正则引擎的软件(如awk,grep,sed等)解析,二者完全不同。

  1. [root@linux ~]# ls test*     #那个 * 代表后面不论接几个字符都予以接受
  2. [root@linux ~]# ls test?     #那个 ? 代表后面"一定"要接"一个"字符
  3. [root@linux ~]# ls test???   #那个 ??? 代表"一定要接三个"字符!
  4. [root@linux ~]# cp test[1-5] /tmp  # 将 test1, test2, test3, test4, test5 若存在的话,就拷贝到 /tmp
  5. [root@linux ~]# cp test[!1-5] /tmp # 只要不是 test1, test2, test3, test4, test5 之外的其它 test?拷贝到 /tmp
  6. [root@linux ~]# cd /lib/modules/`uname -r`/kernel/drivers  # 系统先执行 uname -r 找出输出结果;将结果累加在目录上面,来执行 cd 的功能!
  7. = cd /lib/modules/$(uname -r)/kernel  #另外,这个 quot (`) 的功能,也可以利用 $() 来取代喔!
  8. [root@linux ~]# cp *[A-Z]* /tmp   #表示文件中包含大写字母
  9. [root@linux ~]# ls -lda /etc/*[35]* #表示文件中包含数字3或者5.

1.4.2 特殊字符

# 注释
\ 转义字符
| 管道(pipe)
; 连续命令
~ 用户主文件夹
$ 变量前导符
& 作业控制的后台运行
! 逻辑非
/ 目录分隔符
>,>> 数据流重定向,输出导向,分别是“替换“和”增加“
<,<< 数据流重定向,输入导向
' ‘ 单引号,不具有变量置换功能
” “ 双引号,具有变量置换功能
` ` ` `中内容可以先执行的命令,也可以用$( )来替换
( ) 在中间为子shell的起始与结束
{ } 在中间为命令块的组合

1.4.3 组合按键

Ctrl + C 终止目前的命令
Ctrl + D 输入结束(EOF),例如邮件结束的时候;
Ctrl + M 就是 Enter 啦!
Ctrl + S 暂停屏幕的输出
Ctrl + Q 恢复屏幕的输出
Ctrl + U 在提示字符下,将整列命令删除
Ctrl + Z 暂停目前的命令

1.4 数据流重定向

linux的文件描述符FD,通常为10个:FD0~FD9。可以理解为linux跟踪打开文件,分配的一个数字,linux启动后会默认打开三个文件描述符:
0 标准输入 standard input
1 标准输出standard output
2 错误输出error output 

示例1:

  1. ls -al >   newtxt  #本来ls -al 命令预设输出到屏幕,现在被重新导出到newtxt文档。
  2. ls -al >>  newtxt  #现将ls -al 命令输出结果“增加”到文件newtxt末尾。

示例2:想要将正确的与错误的数据分别存入不同的档案中:
• 1> :是将正确的数据输出到指定的地方去
• 2> :是将错误的数据输出到指定的地方去

  1. $ find /home -name testing > list_right 2> list_error

有 Permission 的那几行错误信息都会跑到 list_error 这个档案中,至于正确的输出数据则会存到 list_right 这个档案中。

示例3:
  1. 将错误信息不要(置于垃圾箱中/dev/null)
  2. $ find /home -name testing > list_right 2> /dev/null
  3. 将正确输出和错误输出都放置到同一个文件中testing中去
  4. $ find /home -name testing > list 2> list <==错误写法
  5. $ find /home -name testing > list 2>&1 <==正确写法

另外,这里区分一下command>file  2>file 与  command>file 2>&1:

command > file 2>file 的意思是stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file 的管道.
command >file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容.

1.5 命令执行的判断依据

分号; cmd;cmd
多条命令顺序执行,执行顺序是从左到右的顺序。
与&& cmd1 && cmd2
若cmd1执行完毕且正确执行($?=0),则开始执行cmd2
若cmd2执行完毕且为错误($? !=0),则cmd2不执行
或|| cmd1 || cmd2
若cmd1执行完毕且正确执行($?=0),则cmd2不执行
若cmd2执行完毕且为错误($? !=0),则开始执行cmd2

注意:这里的&&和||没有优先级关系,而是按照命令次序按序执行,所以对于:

  1. ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe

该范例总会创建/tmp/abc/hehe文件。而不是先执行后面的。

  1. [ -f file1 ] && exit 0 || exit 1
该范例如果测试成功,则执行第一条命令,否则执行第二条命令。

1.5 shell脚本调试

Shell提供了一些用于调试脚本的选项,如下所示:
-n   读一遍脚本中的命令但不执行,用于检查脚本中的语法错误
-v   一边执行脚本,一边将执行过的脚本命令打印到标准错误输出
-x   提供跟踪执行信息,将执行的每一条命令和结果依次打印出来

  1. $ sh -x ./script.sh

2 语法基本介绍

2.1 开头

程序必须以下面的行开始(必须放在文件的第一行):

  1. #!/bin/sh

符号#!用来告诉系统它后面的参数是用来执行该文件的程序,在这个例子中我们使用/bin/sh来执行程序。

  1. chmod +x filename

当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 这样才能用./filename 来运行。

2.2 注释

在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。

文档可以这样写:

  1. ###################################################################################
  2. ## The script is used for the regression of lineage jar with latest hive-exec..jar
  3. ## , expression_analyze.jar, parse_common.jar, field_lineage.jar, ast_parser.jar
  4. ## in trunk.
  5. ###################################################################################

区块可以这样写

  1. ###############################################
  2. ## PARAMETERS
  3. ##

2.3 变量

2.3.1 变量类型默认为字符串类型

  1. #!/bin/sh
  2. name="Jack"
  3. s="$name, hello!" #注意等号"="前后都不能有空格。建议字符串用双引号(单引号表示纯字符串,不支持$等)。
  4. echo $s           #输出Jack, hello!(若s用单引号,则输出$name, hello!)
  5. unset s           #删除变量s

2.3.2 单引号,双引号,无引号

  1. s="./*"
  2. echo $s     #这是变量,命令即为echo ./* ,通配符解开为:./1.sh ./a ./b ./c
  3. echo '$s'   #这里的单引号表示一个字符串,字符串中的$等符号不能转义,输出:$s
  4. echo "$s"   #这里的双引号表示一个字符串,字符串中的$等符号要转义,其中$s为变量,所以输出./*

2.3.3 参数扩展——花括号

  1. num=2
  2. echo "this is the $numnd" #this is the

这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:

  1. num=2
  2. echo "this is the ${num}nd" #this is the 2nd

这将打印: this is the 2nd

2.3.4 参数扩展——正则表达式

  1. ${name:-default} 使用一个默认值(一般是空值)来代替那些空的或者没有赋值的变量name;
  2. ${name:=default}使用指定值来代替空的或者没有赋值的变量name;
  3. ${name:?message}如果变量为空或者未赋值,那么就会显示出错误信息并中止脚本的执行同时返回退出码1。
  4. ${#name} 给出name的长度
  5. ${name%word} 从name的尾部开始删除与word匹配的最小部分,然后返回剩余部分
  6. ${name%%word} 从name的尾部开始删除与word匹配的最长部分,然后返回剩余部分
  7. ${name#word} 从name的头部开始删除与word匹配的最小部分,然后返回剩余部分
  8. ${name##word} 从name的头部开始删除与word匹配的最长部分,然后返回剩余部分

举例如下,使用cjpeg命令将一个GIF的文件转换为JPEG的文件:

  1. $ cjpeg image.gif > image.jpg
  2. 也许有时我们会在大量的文件上进行这样的操作.这时我们如何自动重定向?我们可以很容易的这样来做:
  3. #!/bin/sh
  4. for image in *.gif
  5. do
  6. cjpeg $image > ${image%%gif}jpg
  7. done

2.3.4 注意变量与变量字符串的问题:

  1. read a
  2. if [ $a = "yes" ];then
  3. echo "OK"
  4. fi
  5. if [ "$a" = "yes" ];then
  6. echo "OK"
  7. fi

这里$a是变量a的值,"$a"是对变量a做字符串处理结果。如果read a 时直接回车,那么$a就是空,而不是"",这时程序变成了 if [ = "yes" ]就错了,所以一般用双引号括起来,表示使用字符串值,且转义其中的$变量。

2.3.5 注意打印"*"的问题:

  1. #!/bin/sh
  2. sql='select * from gexing;'
  3. echo  $sql  #其中的*会被替换成所有文件,这就相当于echo select * from table;
  4. echo "$sql" #这就相当于echo "select * from table"
2.3.6 变量/字符串连接:
  1. names=$var_name1$var_name2   #注意,两个变量之间没有空格
  2. sentence=${names}"hello"     #直接连接

2.4 declare

shell中的变量类型默认为字符串类型,但可以通过declare语法来指定变量的其他类型。
  1. 语法:
  2. declare [+/-][afrix]  variable
  3. 说明:
  4. +/- "-"可用来指定变量的属性,"+"则是取消变量所设的属性。
  5. -a 定义变量variable为数组(array)类型
  6. -i  定义变量variable为整数(integer)类型
  7. -r  定义变量variable为只读(readonly)类型
  8. -x  用法与export一样,将variable设置为环境变量

2.5 数值计算

方法1,declare -i

  1. 示例1:让变量 sum 保存 100+300+50 的加和结果
  2. [root@linux ~]# sum=100+300+50
  3. [root@linux ~]# echo $sum       #结果为:100+300+50
  4. [root@linux ~]# declare -i sum=100+300+50
  5. [root@linux ~]# echo $sum       #结果为:450
  6. 示例2:生成随机数
  7. [root@linux ~]# declare -i number=$RANDOM*10/32767 ; echo $number

方法2,var=$ (( expression ))

  1. foo=1
  2. foo=$(($foo+1))
  1. echo $ (( 13 % 3 ))

2.6 数组

定义:shell支持一维数组,但并不限定数组大小,数组下标从0开始。
修改:对于数组修改操作,可以再对其重新赋值;
删除:如果要删除一个已经赋值后的元素则需要借助一个外部命令:unset,如:unset array[0]可清空下标为0的元素,此时数组大小减一;unset array[@]可以清空整个数组元素所有元素。
    1. #!/bin/bash
    2. #赋值
    3. a[0]=1              #第一种赋值方法
    4. a[1]=2
    5. a[2]=3
    6. b=(6,7,8,9,10)      #第二种赋值方法
    7. #取值
    8. echo  ${b[0]}       #用${数组名[下标]},下标是从0开始。下标是*或者@,则得到整个数组内容。输出6
    9. echo  ${b[*]:1:3}   #直接通过${数组名[@或*]:起始位置:长度}切片原先数组,输出7 8 9
    10. echo  ${b[*]::3}    #输出6 7 8(前三个元素)

shell-脚本入门【转】的更多相关文章

  1. Linux Shell脚本入门--cut命令

    Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields &l ...

  2. linux的shell脚本入门

    Linux shell脚本入门教程 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活 的工具.Shell不仅仅是命令的收集,而且是一门非常 ...

  3. (一)shell脚本入门

    shell脚本入门 1.脚本格式 脚本以#!/bin/bash 开头(指定解析器) 2.第一个shell脚本:helloworld (1)需求:创建一个shell脚本,输出helloworld 运行: ...

  4. Linux Shell脚本入门--wget 命令用法详解

    Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...

  5. 【shell】shell脚本入门

    1. 前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大部分涉及Shell脚 ...

  6. Linux入门第五天——shell脚本入门(上)基本概念

    一.什么是shell脚本 Shell 脚本(shell script),是一种为 shell 编写的脚本程序. 二.shell入门 1.先导知识 变量知识补充:https://www.cnblogs. ...

  7. shell脚本入门及基本元素

    命令和参数 #!/bin/sh 其中#!用来告诉系统它后面的参数是用来执行该文件的程序,必须放在脚本的首行,不然会在执行脚 本 的时候报错.当一个文件开头的两个字符是#!时,内核会扫描其它的部分看是否 ...

  8. Linux Shell 脚本入门

    linux shell 脚本格式 #!/bin/sh#..... (注释)命令...命令... 使用vi 创建完成之后需设置权限 chmod +x filename.sh 执行命令: ./filena ...

  9. Shell脚本入门与应用

    编写第一个shell脚本 如同其他语言一样,通过我们使用任意一种文字编辑器,比如 nedit.kedit.emacs.vi 等来编写我们的 shell 程序.程序必须以下面的行开始(必须方在文件的第一 ...

  10. shell脚本入门

    什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch ...

随机推荐

  1. 【转】windows和linux中搭建python集成开发环境IDE

    本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...

  2. C++ 画星号图形——空心矩形(核心代码记录)

    int mi=(int)a; int mj=(int)b; ;i<mi;i++) { ;j<mj;j++) { ||i==mi-) cout<<"*"; | ...

  3. LWL-Hitokoto API(一言-纯净API)

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:liwanglin12链接:https://blog.lwl12.com/read/hitokoto-api.html来源:L ...

  4. Photosohp 2017 已经发布!(下载地址及破解方法在文章底部)

    Adobe Creative Cloud 软件于2016.11.2 全面更新,Adobe Creative Cloud 2017 震撼登场 全新的 2017版本,包含 Photoshop.Illust ...

  5. JSON与String 格式的转换

    JSON 可以用 .push() 添加新数据 var json =[ { title:"1",content:"Tom" }, { title:"2& ...

  6. .NET中MemCached使用介绍

    阅读目录 1.MemCached是什么? 2.Window中MemCached安装 3.MemCached命令 4.简单示例 MemCached是什么 MemCached是一个自由开源,高性能,分布式 ...

  7. 在命令行下使用perl

    http://blog.sina.com.cn/s/blog_4af3f0d20100g9oz.html aaa@domain.com  2aaa@domain.com 111bbb@home.com ...

  8. angularjs中ng-controller中绑定对象

    <!DOCTYPE HTML><html ng-app="myApp"><head><meta http-equiv="Cont ...

  9. LeetCode Power of Four

    原题链接在这里:https://leetcode.com/problems/power-of-four/ 题目: Given an integer (signed 32 bits), write a ...

  10. python---tcp/ip网络编程

    重点总结: 服务端:一直运行(while true),监听运行所在机器(ip)某端口,多线程或多进程接收客户端的socket请求 客户端:主动发起请求,需求知道服务器的ip和端口 服务端: # -*- ...