狠狠撸

狠狠撸Share a Scribd company logo
Bash Syntax Simplified
Agenda
概述
? 每一门编程语言都有其各自的语法结构和
  代码风格, bash脚本语言也不例外. 这一章简
  要描述bash的语法结构, 包括:
  1, 变量    2, 数组   3, 脚本参数
  4, 运算符   5, 条件判断 6, 循环
  7, 命令替换 8, 算术运算  9, Globbing
  10, 函数
shebang 和 注释
? shebang行指的是脚本文件的第一行, 用于指定执行
  脚本的shell类型, bash脚本的第一行是: #!/bin/bash.
  可以指定shell执行的选项, 常用的有-x选项, 用于打
  印执行了哪些命令, 而不仅仅是结果;
? shell通常使用#标识注释单行, 示例:



 其实shell也可以做到多行注释, 但不常用. 用法如下:
 :<<BLOCK
 ...
 segment
 ...
 BLOCK
变量
? 变量分为:
1, 环境变量
又称为全局变量(global variable), 使用export或者
declare -x命令创建, 示例:
   export VAR=“abc”
   declare -x VAR=“abc”
2, 局部变量
与全局变量不同的是, 局部变量(local variable)的作用域
仅限定在当前的shell脚本中, 不能够被子shell继承. 使
用直接赋值方式创建局部变量:
   variable_name=“var”;
或者使用declare命令:
   declare variable_name=“var”;
两者的区别在于, declare命令创建的变量仅存在于当前的作用域,
比如在函数中使用declare创建的变量尽在该函数中有效; 而直接赋值的方
式则在当前shell环境或者脚本范围内有效, 示例: demo1.sh.
declare
? declare是bash内置的一个命令, 用于声明变量, 该命
  令有如下选项:
  -r 声明一个只读变量, 等同于readonly内置命令;
  -i 声明一个整数变量; 示例:
      declare -i i=5
      i=i+1
      echo $i # output 6
  -a 声明一个数组;
  -x 声明一个环境变量, 等同于export;
  -f 此选项不带参数, 列出当前创建的所有函数.
  示例: demo2.sh
echo
? echo是bash的一个内置命令, 用于打印. 示例:
  echo “Hello world” # 打印Hello World
  常用选项如下:
  -n 打印后不换行
  -e 对字符进行转义, 示例:
  echo -e “hit man” # t输出为tab符
? echo命令可用于打印变量的值, 使用${varname} 或者
  $varname提取变量的值;
? echo参数可以使用双引号或者单引号, 如果是双引号
  则会对$varname进行替换, 单引号则原样输出.
? 示例: demo3.sh
数组
? bash使用declare -a命令创建数组变量, 示例:
 declare -a fruits=(apples pears plums)
  这里创建了一个数组变量fruits, 数组的值使用
  括号包围, 元素使用空格分开.
? 使用元素下标访问数组元素, 从0开始. 比如对
  上面的数组:
  echo ${fruits[0]} # 打印apples
? 数组的遍历, 示例:
  for f in ${fruits[@]}; do
      echo $f
  done
? 示例: demo4.sh
脚本参数
? shell脚本运行时可以指定参数, 可以在shell脚本中使用如
  下方式访问这些参数:
  $@                 参数数组
  $0                 shell脚本名称
  $1 $2 ... $n       第一个, 第二个...参数
  ${#1} ${#2}...     第一个, 第二个...参数的长度
  ${!#}              最后一个参数
  $#                 参数个数
? 参数遍历, 示例:
   for arg in $@; do
       echo $arg
   done
? 示例: demo5.sh
运算符
             - 关系运算符
? 关系运算符
  关系运算符指的是对两个变量进行相等以及大小比较, bash中分
  为整数关系运算和字符串关系运算. 关系运算返回的结果是true
  或者false, 通常是与条件判断语句(if/else)联系在一起的.
  1, 整数关系运算符
  -eq       等于,如:if [ "$a" -eq "$b" ]
  -ne       不等于,如:if [ "$a" -ne "$b" ]
  -gt       大于,如:if [ "$a" -gt "$b" ]
  -ge       大于等于,如:if [ "$a" -ge "$b" ]
  -lt       小于,如:if [ "$a" -lt "$b" ]
  -le       小于等于,如:if [ "$a" -le "$b" ]
  <         小于(需要双括号),如:(("$a" < "$b"))
  <=        小于等于(需要双括号),如:(("$a" <= "$b"))
  >         大于(需要双括号),如:(("$a" > "$b"))
  >=        大于等于(需要双括号),如:(("$a" >= "$b"))
运算符
            - 关系运算符
2, 字符串关系运算符
 ==     等于,如:if [[ "$a" == "$b" ]],与=等价;
        也可以使用单个中括号if [ "$a" == "$b" ]
!=      不等于,如:if [[ "$a" != "$b" ]]
        也可以使用单个中括号if [ "$a" != "$b" ]
<       小于,如: if [[ “$a” < “$b” ]]
>       大于,如: if [[ “$a” > “$b” ]]
-z      字符串是否为空, 如: if [ -z “$a” ]
-n      字符串是否非空, 如: if [ -n “$a” ]
注意: 在进行字符串的比较时, 一个好的习惯是使用双引
号将字符串的内容引用起来.
示例: demo6.sh
运算符
              - 逻辑运算符
? bash提供了逻辑运算符: &&(与) ||(或) 非(!), 逻辑运算符
  可以使用在[[...]]中, 在[...]使用-a代替&&, -o代替||. 示例:
  if [[ "$sa" > "abc" && "$sb" < "xyz" ]]...
  if [ “$a” = “a” ] && [ “$b” = “b” ]...
  if [ "$a" -lt 0 -o "$b" -lt 0 ]...
  if [ ! -z “$sa” ]...
? 示例: demo7.sh
? 逻辑运算符的短路行为
  对于逻辑与, 如果表达式结果为false停止其他表达式的
  执行, 并返回false;
  对于逻辑或,如果表达式结果为true停止其他表达式的执
  行, 并返回true; 示例:
  [ 1 -eq 1 ] || echo 1
  [ 1 -eq 2 ] && echo 1
运算符
               - 文件测试
? bash提供了很多操作符用于测试文件的属
  性, 常用的列举如下:
  [ -f FILE ] FILE存在且是一个普通文件
  [ -d FILE ] FILE存在且是一个目录
  [ -r FILE ] FILE存在且可读
  [ -w FILE ] FILE存在且可写
  [ -x FILE ] FILE存在且可执行
  [ -s FILE ] FILE存在且大小不为0

示例: demo8.sh
条件判断
                             - if
? bash的条件判断分为if语句 和 case语句:
  1, if
  if语句可以有如下格式:
  if ... then ... fi
  if ... then ... else ... fi
  if ... then ... elif .... else ... fi
  另外在每一个条件分支均可以嵌套if语句, 示例:
  count=99
  if [ $count -eq 100 ]; then
          echo "Count is 100"
  else
          if [ $count -gt 100 ]; then
                     echo "Count is greater than 100"
          else
                     echo "Count is less than 100"
          fi
  fi
条件判断
                        - case
? case语句用于作多路分支判断, 格式如下:
 case variable in
      pattern1)
              statements
              ;;
      pattern2)
              statements
              ;;
 esac
需要注意两点:
1, variable与各个分支指定的字符串进行模式匹配; 如果分
   支指定的是*)那么一定可以匹配成功.
2, 如果在某个分支匹配成功, 之后的分支不会被执行;
示例: demo9.sh
循环
                           - for
? bash支持4中循环语法: for/while/until/select, 这里介
  绍常用的for/while循环.
  1, for
  for循环的语法格式如下:
    for variable in word_list
    do
      statements
    done
 示例:
    for file in `ls`
    do
      echo $file
    done
循环
                    - while
2, while
while循环使用如下格式:
  while ...
  do
   statements
  done
示例:
  declare -i a=1
  while [ $a -ne 10 ]; do
         echo $a
         a=a+1
  done
示例: demo10.sh
命令替换
? 经常有这样的需求, 将某个命令的结果赋值给一个变量
  或者对该结果进行某些操作. bash提供了两种实现方式:
  1, 反引号`
  variable=`command`
  2, $()
  variable=$(command)
  区别: 在$()中还可以使用反引号进行命令替换, 而反引
  号中则不能嵌套反引号.
  注意: 如果使用单引号, 则命令替换不会发生; 双引号则可以.
  示例:
  echo “Today is `date`”
  uid=`id -u` && echo $uid
  示例: demo11.sh
算数运算
? bash提供了两种方式实现算术运算:
  1, 使用declare -i声明整型变量, 示例:
   declare -i i=4
   i=$i+4
   echo $i
 2, 使用(()), 示例:
    j=4
   ((j=$j+4))
   echo $j
 示例: demo12.sh
文件globbing
? bash在解析用户输入的命令时, 如果输入的参数中带有*或者?字
  符, 会对该参数进行文件名展开(file globbing); 如果存在匹配该模
  式的文件则展开为所有这些匹配的文件名, 如果不存在使用原来
  的字符串, 示例:
  ls a* # No such file or directory
  touch aa ab
  ls a* # aa ab
? *&?
  *    表示仸意多个字符
  ?    表示一个字符
  注意: 如果需要在字符串中使用*, 则需要使用进行转义, 比如: ls
  a*
? bash只会对未使用引号(包括单引号/双引号)的参数进行扩展, 如
  果使用了引号则扩展不会发生. 示例: ls “a*”
? 示例: demo13.sh
函数
? 使用function关键字声明一个shell函数, 语法格式:
   function func_name() {
     statements
   }
  示例:
      function sayHello() {
             echo “hello guys”
      }
  直接使用函数名调用该函数, 比如: sayHello
? 对于函数需要注意以下几点:
  1, 调用函数时可以传递参数, 与脚本参数类似在函数类
  可以通过$@, $1, $2...引用;
  2, 函数内部使用declare命令声明的变量, 只能在函数内
  被引用;
? 示例: demo14.sh
Ad

Recommended

5, sed
5, sed
ted-xu
?
sed -- A programmer's perspective
sed -- A programmer's perspective
Li Ding
?
第叁章
第叁章
贺 利华
?
6, awk
6, awk
ted-xu
?
第9章 Shell 編程
第9章 Shell 編程
kidmany2001
?
第五章
第五章
贺 利华
?
Sed 命令详解
Sed 命令详解
climbtop
?
6, vim
6, vim
ted-xu
?
Shell(bash) Scripting
Shell(bash) Scripting
Robby Lee
?
系統程式 -- 第 4 章 組譯器
系統程式 -- 第 4 章 組譯器
鍾誠 陳鍾誠
?
Ruby 使用手冊 (Part 1)
Ruby 使用手冊 (Part 1)
Drake Huang
?
叠补蝉丑入门基础篇
叠补蝉丑入门基础篇
Zhiyao Pan
?
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Li Hsuan Hung
?
系統程式 -- 第 8 章 編譯器
系統程式 -- 第 8 章 編譯器
鍾誠 陳鍾誠
?
10 檔案說明與處理
10 檔案說明與處理
shademoon
?
新观念的痴叠6教本肠丑10
新观念的痴叠6教本肠丑10
jameschsc
?
Maintainable PHP Source Code
Maintainable PHP Source Code
Bo-Yi Wu
?
SQL Loader & Bulk Insert 大量資料匯入工具
SQL Loader & Bulk Insert 大量資料匯入工具
HO-HSUN LIN
?
Work with Vim
Work with Vim
Zhongqiu Zhao
?
PHP
PHP
Ht Wang
?
Wasm text
Wasm text
Sun bingxin
?
SCJP ch10
SCJP ch10
r82093403
?
Google protocol buffers简析
Google protocol buffers简析
wavefly
?
PHP & MySQL 教學
PHP & MySQL 教學
Bo-Yi Wu
?
竞赛中颁++语言拾遗
竞赛中颁++语言拾遗
乐群 陈
?
Condensation Silicone-MSDS
Condensation Silicone-MSDS
Iris He
?
Наши партнеры
Наши партнеры
Vladimir Pokladov
?
4, files & folders
4, files & folders
ted-xu
?
Barn i barnevernet
Barn i barnevernet
University Library of Stavanger / Universitetsbiblioteket i Stavanger
?

More Related Content

What's hot (17)

Shell(bash) Scripting
Shell(bash) Scripting
Robby Lee
?
系統程式 -- 第 4 章 組譯器
系統程式 -- 第 4 章 組譯器
鍾誠 陳鍾誠
?
Ruby 使用手冊 (Part 1)
Ruby 使用手冊 (Part 1)
Drake Huang
?
叠补蝉丑入门基础篇
叠补蝉丑入门基础篇
Zhiyao Pan
?
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Li Hsuan Hung
?
系統程式 -- 第 8 章 編譯器
系統程式 -- 第 8 章 編譯器
鍾誠 陳鍾誠
?
10 檔案說明與處理
10 檔案說明與處理
shademoon
?
新观念的痴叠6教本肠丑10
新观念的痴叠6教本肠丑10
jameschsc
?
Maintainable PHP Source Code
Maintainable PHP Source Code
Bo-Yi Wu
?
SQL Loader & Bulk Insert 大量資料匯入工具
SQL Loader & Bulk Insert 大量資料匯入工具
HO-HSUN LIN
?
Work with Vim
Work with Vim
Zhongqiu Zhao
?
PHP
PHP
Ht Wang
?
Wasm text
Wasm text
Sun bingxin
?
SCJP ch10
SCJP ch10
r82093403
?
Google protocol buffers简析
Google protocol buffers简析
wavefly
?
PHP & MySQL 教學
PHP & MySQL 教學
Bo-Yi Wu
?
竞赛中颁++语言拾遗
竞赛中颁++语言拾遗
乐群 陈
?
Shell(bash) Scripting
Shell(bash) Scripting
Robby Lee
?
系統程式 -- 第 4 章 組譯器
系統程式 -- 第 4 章 組譯器
鍾誠 陳鍾誠
?
Ruby 使用手冊 (Part 1)
Ruby 使用手冊 (Part 1)
Drake Huang
?
叠补蝉丑入门基础篇
叠补蝉丑入门基础篇
Zhiyao Pan
?
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Li Hsuan Hung
?
系統程式 -- 第 8 章 編譯器
系統程式 -- 第 8 章 編譯器
鍾誠 陳鍾誠
?
10 檔案說明與處理
10 檔案說明與處理
shademoon
?
新观念的痴叠6教本肠丑10
新观念的痴叠6教本肠丑10
jameschsc
?
Maintainable PHP Source Code
Maintainable PHP Source Code
Bo-Yi Wu
?
SQL Loader & Bulk Insert 大量資料匯入工具
SQL Loader & Bulk Insert 大量資料匯入工具
HO-HSUN LIN
?
Google protocol buffers简析
Google protocol buffers简析
wavefly
?
PHP & MySQL 教學
PHP & MySQL 教學
Bo-Yi Wu
?
竞赛中颁++语言拾遗
竞赛中颁++语言拾遗
乐群 陈
?

Viewers also liked (16)

Condensation Silicone-MSDS
Condensation Silicone-MSDS
Iris He
?
Наши партнеры
Наши партнеры
Vladimir Pokladov
?
4, files & folders
4, files & folders
ted-xu
?
Barn i barnevernet
Barn i barnevernet
University Library of Stavanger / Universitetsbiblioteket i Stavanger
?
lee RESUME
lee RESUME
leelakrshnan leelakrishnan
?
9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rman
ted-xu
?
5, system admin
5, system admin
ted-xu
?
fit-PC - Product line overview (v3.0)
fit-PC - Product line overview (v3.0)
Maxim Birger (马克斯)
?
Good company
Good company
Hugh Choi ???
?
2, OCP - installing and creating a database
2, OCP - installing and creating a database
ted-xu
?
SCL Event - Egil Moller Nielsen & Chee Yew Wong - Innovative Delivery Solutio...
SCL Event - Egil Moller Nielsen & Chee Yew Wong - Innovative Delivery Solutio...
Global Business Intel
?
CIO Event - Bid Winning: How can technology in your business assist your next...
CIO Event - Bid Winning: How can technology in your business assist your next...
Global Business Intel
?
Τεστ στα διαν?σματα
Τεστ στα διαν?σματα
Μ?κη? Χατζ?πουλο?
?
Social Media Marketing and Your Targeted Audience
Social Media Marketing and Your Targeted Audience
Moshiur Monty
?
CIO Event - HP - Digital Disruption : How can IT play its part?
CIO Event - HP - Digital Disruption : How can IT play its part?
Global Business Intel
?
Condensation Silicone-MSDS
Condensation Silicone-MSDS
Iris He
?
4, files & folders
4, files & folders
ted-xu
?
9, OCP - restore and recovery with rman
9, OCP - restore and recovery with rman
ted-xu
?
5, system admin
5, system admin
ted-xu
?
2, OCP - installing and creating a database
2, OCP - installing and creating a database
ted-xu
?
SCL Event - Egil Moller Nielsen & Chee Yew Wong - Innovative Delivery Solutio...
SCL Event - Egil Moller Nielsen & Chee Yew Wong - Innovative Delivery Solutio...
Global Business Intel
?
CIO Event - Bid Winning: How can technology in your business assist your next...
CIO Event - Bid Winning: How can technology in your business assist your next...
Global Business Intel
?
Social Media Marketing and Your Targeted Audience
Social Media Marketing and Your Targeted Audience
Moshiur Monty
?
CIO Event - HP - Digital Disruption : How can IT play its part?
CIO Event - HP - Digital Disruption : How can IT play its part?
Global Business Intel
?
Ad

Similar to 2, bash synax simplified (20)

Bash shell script 教學
Bash shell script 教學
Ming-Sian Lin
?
如何学习Bash Shell
如何学习Bash Shell
LI Daobing
?
尝颈苍耻虫常用命令与工具介绍
尝颈苍耻虫常用命令与工具介绍
weihe
?
叠补蝉丑编程之变量高级篇
叠补蝉丑编程之变量高级篇
Zhiyao Pan
?
Using Shell & Mastering Shell
Using Shell & Mastering Shell
Jiyee Sheng
?
新北市教師工作坊 -- Bash script programming 介紹
新北市教師工作坊 -- Bash script programming 介紹
fweng322
?
鲍苍颈虫常用命令
鲍苍颈虫常用命令
tony2yy_fish
?
鲍苍颈虫常用命令 1
鲍苍颈虫常用命令 1
tony2yy_fish
?
厂丑别濒濒脚本
厂丑别濒濒脚本
bj
?
常用惭补肠/尝颈苍耻虫命令分享
常用惭补肠/尝颈苍耻虫命令分享
Yihua Huang
?
1, shell intro
1, shell intro
ted-xu
?
shell script introduction
shell script introduction
Jie Jin
?
Introduce to Linux command line
Introduce to Linux command line
Wen Liao
?
Linux 系统应用与程序设计
Linux 系统应用与程序设计
yiditushe
?
Zsh
Zsh
Rhythm Sun
?
Effective linux.1.(commandline)
Effective linux.1.(commandline)
wang hongjiang
?
Linux command tutorial
Linux command tutorial
朋 陈
?
尝颈苍耻虫常用命令
尝颈苍耻虫常用命令
Tony Deng
?
尝颈苍耻虫必学的60个命令
尝颈苍耻虫必学的60个命令
yiditushe
?
Perl 6 news at 2010-06
Perl 6 news at 2010-06
March Liu
?
Bash shell script 教學
Bash shell script 教學
Ming-Sian Lin
?
如何学习Bash Shell
如何学习Bash Shell
LI Daobing
?
尝颈苍耻虫常用命令与工具介绍
尝颈苍耻虫常用命令与工具介绍
weihe
?
叠补蝉丑编程之变量高级篇
叠补蝉丑编程之变量高级篇
Zhiyao Pan
?
Using Shell & Mastering Shell
Using Shell & Mastering Shell
Jiyee Sheng
?
新北市教師工作坊 -- Bash script programming 介紹
新北市教師工作坊 -- Bash script programming 介紹
fweng322
?
鲍苍颈虫常用命令
鲍苍颈虫常用命令
tony2yy_fish
?
鲍苍颈虫常用命令 1
鲍苍颈虫常用命令 1
tony2yy_fish
?
厂丑别濒濒脚本
厂丑别濒濒脚本
bj
?
常用惭补肠/尝颈苍耻虫命令分享
常用惭补肠/尝颈苍耻虫命令分享
Yihua Huang
?
1, shell intro
1, shell intro
ted-xu
?
shell script introduction
shell script introduction
Jie Jin
?
Introduce to Linux command line
Introduce to Linux command line
Wen Liao
?
Linux 系统应用与程序设计
Linux 系统应用与程序设计
yiditushe
?
Effective linux.1.(commandline)
Effective linux.1.(commandline)
wang hongjiang
?
Linux command tutorial
Linux command tutorial
朋 陈
?
尝颈苍耻虫常用命令
尝颈苍耻虫常用命令
Tony Deng
?
尝颈苍耻虫必学的60个命令
尝颈苍耻虫必学的60个命令
yiditushe
?
Perl 6 news at 2010-06
Perl 6 news at 2010-06
March Liu
?
Ad

More from ted-xu (20)

11, OCP - awr & alert system
11, OCP - awr & alert system
ted-xu
?
10, OCP - flashback
10, OCP - flashback
ted-xu
?
8, OCP - backup with rman
8, OCP - backup with rman
ted-xu
?
7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery
ted-xu
?
6, OCP - oracle security
6, OCP - oracle security
ted-xu
?
5, OCP - oracle storage
5, OCP - oracle storage
ted-xu
?
4, OCP - oracle networking
4, OCP - oracle networking
ted-xu
?
3, OCP - instance management
3, OCP - instance management
ted-xu
?
1, OCP - architecture intro
1, OCP - architecture intro
ted-xu
?
12, OCP - performance tuning
12, OCP - performance tuning
ted-xu
?
7, business event system
7, business event system
ted-xu
?
6, workflow miscellaneous
6, workflow miscellaneous
ted-xu
?
5, workflow function activity
5, workflow function activity
ted-xu
?
4, workflow tables & api
4, workflow tables & api
ted-xu
?
3, workflow in ebs
3, workflow in ebs
ted-xu
?
2, a simple workflow
2, a simple workflow
ted-xu
?
1, workflow intro
1, workflow intro
ted-xu
?
8, bes tables & api
8, bes tables & api
ted-xu
?
OPM Recipe designer notes
OPM Recipe designer notes
ted-xu
?
4, grep
4, grep
ted-xu
?
11, OCP - awr & alert system
11, OCP - awr & alert system
ted-xu
?
10, OCP - flashback
10, OCP - flashback
ted-xu
?
8, OCP - backup with rman
8, OCP - backup with rman
ted-xu
?
7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery
ted-xu
?
6, OCP - oracle security
6, OCP - oracle security
ted-xu
?
5, OCP - oracle storage
5, OCP - oracle storage
ted-xu
?
4, OCP - oracle networking
4, OCP - oracle networking
ted-xu
?
3, OCP - instance management
3, OCP - instance management
ted-xu
?
1, OCP - architecture intro
1, OCP - architecture intro
ted-xu
?
12, OCP - performance tuning
12, OCP - performance tuning
ted-xu
?
7, business event system
7, business event system
ted-xu
?
6, workflow miscellaneous
6, workflow miscellaneous
ted-xu
?
5, workflow function activity
5, workflow function activity
ted-xu
?
4, workflow tables & api
4, workflow tables & api
ted-xu
?
3, workflow in ebs
3, workflow in ebs
ted-xu
?
2, a simple workflow
2, a simple workflow
ted-xu
?
1, workflow intro
1, workflow intro
ted-xu
?
8, bes tables & api
8, bes tables & api
ted-xu
?
OPM Recipe designer notes
OPM Recipe designer notes
ted-xu
?

2, bash synax simplified

  • 3. 概述 ? 每一门编程语言都有其各自的语法结构和 代码风格, bash脚本语言也不例外. 这一章简 要描述bash的语法结构, 包括: 1, 变量 2, 数组 3, 脚本参数 4, 运算符 5, 条件判断 6, 循环 7, 命令替换 8, 算术运算 9, Globbing 10, 函数
  • 4. shebang 和 注释 ? shebang行指的是脚本文件的第一行, 用于指定执行 脚本的shell类型, bash脚本的第一行是: #!/bin/bash. 可以指定shell执行的选项, 常用的有-x选项, 用于打 印执行了哪些命令, 而不仅仅是结果; ? shell通常使用#标识注释单行, 示例: 其实shell也可以做到多行注释, 但不常用. 用法如下: :<<BLOCK ... segment ... BLOCK
  • 5. 变量 ? 变量分为: 1, 环境变量 又称为全局变量(global variable), 使用export或者 declare -x命令创建, 示例: export VAR=“abc” declare -x VAR=“abc” 2, 局部变量 与全局变量不同的是, 局部变量(local variable)的作用域 仅限定在当前的shell脚本中, 不能够被子shell继承. 使 用直接赋值方式创建局部变量: variable_name=“var”; 或者使用declare命令: declare variable_name=“var”; 两者的区别在于, declare命令创建的变量仅存在于当前的作用域, 比如在函数中使用declare创建的变量尽在该函数中有效; 而直接赋值的方 式则在当前shell环境或者脚本范围内有效, 示例: demo1.sh.
  • 6. declare ? declare是bash内置的一个命令, 用于声明变量, 该命 令有如下选项: -r 声明一个只读变量, 等同于readonly内置命令; -i 声明一个整数变量; 示例: declare -i i=5 i=i+1 echo $i # output 6 -a 声明一个数组; -x 声明一个环境变量, 等同于export; -f 此选项不带参数, 列出当前创建的所有函数. 示例: demo2.sh
  • 7. echo ? echo是bash的一个内置命令, 用于打印. 示例: echo “Hello world” # 打印Hello World 常用选项如下: -n 打印后不换行 -e 对字符进行转义, 示例: echo -e “hit man” # t输出为tab符 ? echo命令可用于打印变量的值, 使用${varname} 或者 $varname提取变量的值; ? echo参数可以使用双引号或者单引号, 如果是双引号 则会对$varname进行替换, 单引号则原样输出. ? 示例: demo3.sh
  • 8. 数组 ? bash使用declare -a命令创建数组变量, 示例: declare -a fruits=(apples pears plums) 这里创建了一个数组变量fruits, 数组的值使用 括号包围, 元素使用空格分开. ? 使用元素下标访问数组元素, 从0开始. 比如对 上面的数组: echo ${fruits[0]} # 打印apples ? 数组的遍历, 示例: for f in ${fruits[@]}; do echo $f done ? 示例: demo4.sh
  • 9. 脚本参数 ? shell脚本运行时可以指定参数, 可以在shell脚本中使用如 下方式访问这些参数: $@ 参数数组 $0 shell脚本名称 $1 $2 ... $n 第一个, 第二个...参数 ${#1} ${#2}... 第一个, 第二个...参数的长度 ${!#} 最后一个参数 $# 参数个数 ? 参数遍历, 示例: for arg in $@; do echo $arg done ? 示例: demo5.sh
  • 10. 运算符 - 关系运算符 ? 关系运算符 关系运算符指的是对两个变量进行相等以及大小比较, bash中分 为整数关系运算和字符串关系运算. 关系运算返回的结果是true 或者false, 通常是与条件判断语句(if/else)联系在一起的. 1, 整数关系运算符 -eq 等于,如:if [ "$a" -eq "$b" ] -ne 不等于,如:if [ "$a" -ne "$b" ] -gt 大于,如:if [ "$a" -gt "$b" ] -ge 大于等于,如:if [ "$a" -ge "$b" ] -lt 小于,如:if [ "$a" -lt "$b" ] -le 小于等于,如:if [ "$a" -le "$b" ] < 小于(需要双括号),如:(("$a" < "$b")) <= 小于等于(需要双括号),如:(("$a" <= "$b")) > 大于(需要双括号),如:(("$a" > "$b")) >= 大于等于(需要双括号),如:(("$a" >= "$b"))
  • 11. 运算符 - 关系运算符 2, 字符串关系运算符 == 等于,如:if [[ "$a" == "$b" ]],与=等价; 也可以使用单个中括号if [ "$a" == "$b" ] != 不等于,如:if [[ "$a" != "$b" ]] 也可以使用单个中括号if [ "$a" != "$b" ] < 小于,如: if [[ “$a” < “$b” ]] > 大于,如: if [[ “$a” > “$b” ]] -z 字符串是否为空, 如: if [ -z “$a” ] -n 字符串是否非空, 如: if [ -n “$a” ] 注意: 在进行字符串的比较时, 一个好的习惯是使用双引 号将字符串的内容引用起来. 示例: demo6.sh
  • 12. 运算符 - 逻辑运算符 ? bash提供了逻辑运算符: &&(与) ||(或) 非(!), 逻辑运算符 可以使用在[[...]]中, 在[...]使用-a代替&&, -o代替||. 示例: if [[ "$sa" > "abc" && "$sb" < "xyz" ]]... if [ “$a” = “a” ] && [ “$b” = “b” ]... if [ "$a" -lt 0 -o "$b" -lt 0 ]... if [ ! -z “$sa” ]... ? 示例: demo7.sh ? 逻辑运算符的短路行为 对于逻辑与, 如果表达式结果为false停止其他表达式的 执行, 并返回false; 对于逻辑或,如果表达式结果为true停止其他表达式的执 行, 并返回true; 示例: [ 1 -eq 1 ] || echo 1 [ 1 -eq 2 ] && echo 1
  • 13. 运算符 - 文件测试 ? bash提供了很多操作符用于测试文件的属 性, 常用的列举如下: [ -f FILE ] FILE存在且是一个普通文件 [ -d FILE ] FILE存在且是一个目录 [ -r FILE ] FILE存在且可读 [ -w FILE ] FILE存在且可写 [ -x FILE ] FILE存在且可执行 [ -s FILE ] FILE存在且大小不为0 示例: demo8.sh
  • 14. 条件判断 - if ? bash的条件判断分为if语句 和 case语句: 1, if if语句可以有如下格式: if ... then ... fi if ... then ... else ... fi if ... then ... elif .... else ... fi 另外在每一个条件分支均可以嵌套if语句, 示例: count=99 if [ $count -eq 100 ]; then echo "Count is 100" else if [ $count -gt 100 ]; then echo "Count is greater than 100" else echo "Count is less than 100" fi fi
  • 15. 条件判断 - case ? case语句用于作多路分支判断, 格式如下: case variable in pattern1) statements ;; pattern2) statements ;; esac 需要注意两点: 1, variable与各个分支指定的字符串进行模式匹配; 如果分 支指定的是*)那么一定可以匹配成功. 2, 如果在某个分支匹配成功, 之后的分支不会被执行; 示例: demo9.sh
  • 16. 循环 - for ? bash支持4中循环语法: for/while/until/select, 这里介 绍常用的for/while循环. 1, for for循环的语法格式如下: for variable in word_list do statements done 示例: for file in `ls` do echo $file done
  • 17. 循环 - while 2, while while循环使用如下格式: while ... do statements done 示例: declare -i a=1 while [ $a -ne 10 ]; do echo $a a=a+1 done 示例: demo10.sh
  • 18. 命令替换 ? 经常有这样的需求, 将某个命令的结果赋值给一个变量 或者对该结果进行某些操作. bash提供了两种实现方式: 1, 反引号` variable=`command` 2, $() variable=$(command) 区别: 在$()中还可以使用反引号进行命令替换, 而反引 号中则不能嵌套反引号. 注意: 如果使用单引号, 则命令替换不会发生; 双引号则可以. 示例: echo “Today is `date`” uid=`id -u` && echo $uid 示例: demo11.sh
  • 19. 算数运算 ? bash提供了两种方式实现算术运算: 1, 使用declare -i声明整型变量, 示例: declare -i i=4 i=$i+4 echo $i 2, 使用(()), 示例: j=4 ((j=$j+4)) echo $j 示例: demo12.sh
  • 20. 文件globbing ? bash在解析用户输入的命令时, 如果输入的参数中带有*或者?字 符, 会对该参数进行文件名展开(file globbing); 如果存在匹配该模 式的文件则展开为所有这些匹配的文件名, 如果不存在使用原来 的字符串, 示例: ls a* # No such file or directory touch aa ab ls a* # aa ab ? *&? * 表示仸意多个字符 ? 表示一个字符 注意: 如果需要在字符串中使用*, 则需要使用进行转义, 比如: ls a* ? bash只会对未使用引号(包括单引号/双引号)的参数进行扩展, 如 果使用了引号则扩展不会发生. 示例: ls “a*” ? 示例: demo13.sh
  • 21. 函数 ? 使用function关键字声明一个shell函数, 语法格式: function func_name() { statements } 示例: function sayHello() { echo “hello guys” } 直接使用函数名调用该函数, 比如: sayHello ? 对于函数需要注意以下几点: 1, 调用函数时可以传递参数, 与脚本参数类似在函数类 可以通过$@, $1, $2...引用; 2, 函数内部使用declare命令声明的变量, 只能在函数内 被引用; ? 示例: demo14.sh

Editor's Notes

  • #11: Note: 为什么这里称为”整数关系运算符”? 因为bash本身是不支持浮点运算的,需要使用awk或者其它工具做浮点操作.