Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符/if语句/循环控制/… 但在开始之前, 我想先理清Shell语言与Shell之间的关系.
Shell与Shell语言
上面说了Shell是一种编程语言但你可能也听说过:sh/bash/csh/zsh/…它们也叫Shell, 实际上这里所说的Shell是一种应用程序, 它负责解释执行你编写的Shell脚本, Mac默认就自带了sh/bash/csh/zsh/tcsh/ksh, 你可以这样查看cat /etc/shells
不同的shell的用法基本相同, 但有些shell提供了一些新特性, 比如我现在在用的就是zsh, 更多zsh的内容可以去看这篇文章。
第一个Shell脚本
#! /bin/sh echo "hello shell!"
依国际惯例这里以在终端里打印一句hello shell!开始, 第一行的#!是一个约定标记, 它告诉脚本这段脚本需要什么解释器来执行. 第二行的echo命令则负责向屏幕上输出一句话.
如何运行
运行shell程序有3种方法:
- chmod +x使文件具有可执行权限, 直接运行
- 直接调用解释器, 将脚本文件作为参数传入 (比如
bash hi.sh
) - 使用source(也可用 . 代替)执行文件
通常情况下, 最方便的方式就是方式1, 通过方式1执行你需要在脚本第一行写好这段脚本由哪个解释器来解释, 而通过方式2来执行则没有这个限制, 写了也没用.
除此之外方式1与方式2执行命令就没有区别了, 但方式3执行的方式与前两种都不同:
使用source执行shell脚本时, 不会创建子进程, 而是在父进程中直接执行!
这里不作更多解释, 感兴趣的同学可以去参考Linux Shell编程从入门到精通这本书的第一章的相关部分.
变量
和其它语言一样Shell中也有变量, 而且更简单, 但有一些比较特殊的地方.
- Shell中的变量只有字符串这一种类型
- Shell中变量名与变量值没有长度限制
- Shell的变量也允许比较操作和整数操作, 只要变量中的字符串为数字
定义变量
variable_name=ghui
需要注意: = 两边不能加空格, 当赋值语句包含空格时请加引号(单引号/双引号均可)比如:
variable_name="ghui's blog"
Shell中的变量可以分为两种类型:
- 局部变量 (定义变量时在前面加
local
修饰符) - 全局变量 (定义变量时不加任何修饰符)
与其它语言一样局部变量的可见范围是代码块或函数内, 全局变量在全局范围内可见.看个简单的例子:
#! /bin/sh num=111 #全局变量 func1() { local num=222 #局部变量 echo $num } echo "before---$num" func1 echo "after---$num"
输出:
before---111 222 after---111
使用变量
使用一个定义过的变量, 只要在变量名前面加$即可, 如:
name=ghui echo $name echo ${name} #{} 为了帮助解释器识别变量边界, 非必须
在使用变量时还有一个地方需要注意, 请看下面的例子:
#! /bin/sh str='abc' echo "1 print $str" echo '2 print $str'
输出:
1 print abc 2 print $str
即:
被双引号括起来的变量会发生变量替换, 单引号不会
注释
Shell中注释使用#, 而且它不支持多行注释.
常用的字符串操作
字符串拼接
name="shell" sayHi="hello, "$name" !" sayHi2="hello, ${name} !" echo $sayHi $sayHi2
注意: 上面说的单双引号引起的变量替换问题
获得字符串长度
string="abcd" echo ${#string} #输出:4
截取字符串
str="hello shell" echo ${str:2} #输出: llo shell echo ${string:1:3} #输出:ell
更多关于字符串的操作可以看这个
if/else流程控制
基本语法结构:
if condition then do something elif condition then do something elif condition then do something else do something fi
其中, elif语句和else语句非必须的.看个例子:
#! /bin/sh a=1 if [ $1=$a ] then echo "you input 1" elif [ $1=2 ] then echo "you input 2" else #do nothing echo " you input $1" fi
很简单, 不过这里有两个地方需要注意, 如果某个条件下的执行体为空, 则你就不能写这个条件 即下面这样会报错:
if condition then #do nothing elif condition then # do nothing #or else #do nothing
另外, [ ]
两边一定要加空格, 下面这样都会报错:
if [$a=$b] #or if [ $a=$b] #or if [$a=$b ]
只有这样if [ $a=$b ]
才是对的.
注意: 实际上这里的[]是test命令的一种形式, [是系统的一个内置命令,存在路径是/bin/[
,它是调用test命令的标识, 右中括号是关闭条件判断的标识, 因此下面的两个测试语句是等效的:
if test "2>3" then ... fi
和
if [ "2>3" ] then ... fi
除[]之外, shell语言中还有几种其它括号, 比如: 单小括号/双小括号/双中括号/… , 不同的括号有不同的用法, 更多关于shell中, 括号的用法可以看看这个
switch流程控制
当条件较多时, 可以选择使用switch语句, shell中的switch语句的写法和其它语言还是有些不同的, 基本结构如下:
case expression in pattern1) do something... ;; pattern2) do something... ;; pattern2) do something... ;; ... esac
看个例子:
#! /bin/sh input=$1 case $input in 1 | 0) str="一or零";; 2) str="二";; 3) str="三";; *) str=$input;; esac echo "---$str"
这个例子会根据你执行此脚本时传入的参数不同在屏幕上输出不同的值, 其中第一个case 1 | 0
代表逻辑或.
NOTE:
-
;;
相当于其它语言中的break
- 每个pattern之后记得加
)
- 最后记得加
esac
(即反的case)
for循环
基本结构:
for name [in list] do ... done
其中,[]括起来的 in list
, 为可选部分, 如果省略in list
则默认为in "$@"
, 即你执行此命令时传入的参数列表.
看个例子:
for file in *.txt do open $file done
遍历当前目录下的所有txt文件, 并依次打开.
while循环
基本结构:
while condition do do something... done
看个例子:
#! /bin/sh i=0 while ((i<5)); do ((i++)) echo "i=$i" done
输出:
i=1 i=2 i=3 i=4 i=5
NOTE: 你可能需要去了解一下(())
的用法
until循环
基本结构
until condition do do something... done
看个例子:
#! /bin/sh i=5 until ((i==0)) do ((i--)) echo "i=$i" done
输出:
i=4 i=3 i=2 i=1 i=0
跳出循环
shell中也支持break
跳出循环, continue
跳出本次循环.用法与C, Java中相同
函数
要定义一个函数, 可以使用下面两种形式:
function funcname() { do something }
或者
funcname () { do something }
看个例子
#! /bin/sh # ad.sh 计算sum add() { let "sum=$1+$2" return $sum } add $1 $2 echo "sum=$?"
输入
ad 1 2
输出
sum=3
其中, $?
在shell中保存的是上一条命令的返回值
NOTE:
- 函数必须先定义后使用
- 如果在函数中使用
exit
会退出脚本, 如果想退回到原本函数调用的地方, 则可使用return
向脚本传递参数
先shell脚本传递参数, 非常简单, 只需要在你执行命令的后面跟上即可, 看个例子:
#! /bin/sh # test.sh echo "$# parameters"; echo "$@"; echo "$0" echo "$1"
输入:
test.sh 11 22
输出:
2 parameters 11 22 test.sh 11
http://www.techug.com/linux-shell-bash-zsh
相关推荐
### Linux Shell 脚本编程总结及速查手册 #### 变量定义与赋值 在Shell脚本中,变量的定义与赋值是基础且重要的功能之一。可以通过以下方式来定义变量: - **直接赋值**:`variable_name=value` - **带引号赋值**...
这份“Shell脚本速查手册”提供了丰富的参考资料,帮助用户快速理解和掌握Shell脚本编写的基本概念、语法以及高级技巧。下面我们将深入探讨其中的关键知识点。 一、Shell基础 1. Shell介绍:Shell是操作系统与用户...
**Linux Shell速查手册概述** Linux Shell速查手册是一份专为Linux用户设计的实用工具,尤其适合初学者和有经验的系统管理员。它包含了大量有关Linux Shell命令和脚本编程的信息,帮助用户快速查找并理解如何在...
9. ** Shell脚本编程**: - `bash`:Bourne-Again SHell,Linux最常用的shell。 - `#!/bin/bash`:脚本头部指定解释器。 - `for`、`while`、`if`:流程控制结构。 - `function`:定义函数。 10. **其他实用命令...
《Linux指令范例速查手册(第2版)》是一本深入浅出的Linux命令行操作指南,旨在帮助用户快速掌握在Linux操作系统中进行日常任务处理的必备技能。这本书覆盖了广泛的主题,从基础的文件操作到高级的系统管理,为用户...
本速查手册将围绕VBScript的关键特性、语法结构、常用函数和特效制作流程进行详细介绍。 1. **基本语法** VBScript的基础语法类似于VB,包括变量声明(Dim, Const)、数据类型(String, Integer, Double等)、流程...
"Linux指令速查手册"提供了全面且实用的Linux命令参考,帮助用户快速查找和理解各种指令。 首先,让我们来探讨一些基础且重要的Linux指令: 1. `ls`:列出目录内容。通过`ls -l`可以查看详细信息,包括文件权限、...
10. Shell脚本编程: - `bash`:Bourne-Again SHell,最常用的Linux shell。 - `for`, `while`, `if` 语句:控制流程结构。 - `function`:定义函数。 - `source`:执行脚本或加载配置文件。 以上仅是Linux命令...
9. **脚本编程**:了解`bash` Shell脚本编程,包括变量、条件语句、循环、函数和文件输入输出等,能够编写简单的自动化脚本。 10. **磁盘管理**:`fdisk`用于分区管理,`mkfs`创建文件系统,`mount`和`umount`挂载...
Linux命令速查手册是Linux系统管理员和开发者的重要参考资料,它包含了大量的Linux命令及其用法,帮助用户快速查找和理解各种操作。在这个手册中,你将找到关于文件管理、系统管理、网络操作、进程控制以及更多方面...
在"vbscript速查手册.rar"这个压缩包中,包含的文件"vbscript速查手册.chm"是一份详尽的VBScrip参考指南,通常以CHM(Compiled Help Manual)格式呈现,这是微软开发的帮助文档格式,便于用户检索和查阅。...
VBScript(Visual Basic ...以上是VBScript的基础知识要点,通过"VBScript 速查手册",你可以快速查找和学习这些概念,提升你的VBScript编程能力。在实际应用中,结合具体的案例和实践,将使你更好地掌握这门语言。
Linux速查手册HandBook系列是Linux用户和管理员的宝贵资源,由FengGe精心整理,旨在帮助用户快速理解和解决在Linux环境中遇到的问题。这个手册涵盖了Linux操作系统的基础知识、常用命令、系统管理、网络配置、安全...
"Linux命令速查手册"是一个非常实用的资源,它提供了全面且详细的Linux命令指南,帮助用户快速查找并理解各个命令的使用方法。手册共分为15个章节,并在附录中提供了命令按首字母排序的列表,方便用户查找特定的命令...
此外,手册可能还包括对shell脚本编程的介绍,这是自动化重复任务的关键。 提供的“Linux命令大全搜索工具 v1.5.1.md.pdf”很可能是一个增强版的命令手册,包含了搜索功能,使得在大量命令中快速定位所需信息变得...