Shell 编程概述
Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。换一种说法也就是,shell script是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与指令写在里面,然后用正规表示法,管道命令以及数据流重导向等功能,以达到我们所想要的处理目的。
shell脚本第一行 #!/bin/bash 标识该 Shell 脚本由哪个 Shell 解释
第一个入门案例:
#!/bin/bash echo "Hello World!"
赋予权限才可以执行
chmod a+x hello.sh
执行
./hello.sh
Shell 的编写流程
编写 Shell 脚本
赋予可执行权限
执行,调试
下面来介绍具体的语法
Shell 关键字
echo:打印文字到屏幕
exec:执行另一个 Shell 脚本
read:读标准输入
expr:对整数型变量进行算术运算
test:用于测试变量是否相等、 是否为空、文件类型等
exit:退出
代码案例:
#!/bin/bash echo "Hello Shell" # 读入变量 read VAR echo "VAR is $VAR" # 计算变量 expr $VAR - 5 # 测试字符串 test "Hello"="HelloWorld" # 测试整数 test $VAR -eq 10 # 测试目录 test -d ./Android # 执行其他 Shell 脚本 exec ./othershell.sh # 退出 exit
授权并执行
Shell 变量
变量分类
- 用户自定义变量
- 预定义变量
- 环境变量
注意事项
- 等号前后不要有空格:
NUM=10
- 一般变量名用大写:
M=1
- 等号前后不要有空格:
变量的调用
- 使用
$VAR
调用变量 $M
代码实例:
#!/bin/bash # 定义普通变量 CITY=SHENZHEN # 定义全局变量 export NAME=cdeveloper # 定义只读变量 readonly AGE=21 # 打印变量的值 echo $CITY echo $NAME echo $AGE # 删除 CITY 变量 unset CITY # 不会输出 SHENZHEN echo $CITY
- 使用
Shell 运算
Shell 语句
Shell 函数
Shell 调试
Shell 易错点
. 用户自定义变量
这种变量只支持字符串类型,不支持其他字符,浮点等类型,常见有这 3 个前缀:
这种变量只支持字符串类型,不支持其他字符,浮点等类型,常见有这 3 个前缀:
unset
:删除变量
这种变量只支持字符串类型,不支持其他字符,浮点等类型,常见有这 3 个前缀:
unset
:删除变量readonly
:标记只读变量
这种变量只支持字符串类型,不支持其他字符,浮点等类型,常见有这 3 个前缀:
unset
:删除变量readonly
:标记只读变量export
:指定全局变量
一个例子:
#!/bin/bash # 定义普通变量 CITY=SHENZHEN # 定义全局变量 export NAME=cdeveloper # 定义只读变量 readonly AGE=21 # 打印变量的值 echo $CITY echo $NAME echo $AGE # 删除 CITY 变量 unset CITY # 不会输出 SHENZHEN echo $CITY1234567891011121314151617181920
运行结果:
SHENZHEN cdeveloper 21 1234
2. 预定义变量
预定义变量常用来获取命令行的输入,有下面这些:
- $0 :脚本文件名
- $1-9 :第 1-9 个命令行参数名
- $# :命令行参数个数
- $@ :所有命令行参数
- $* :所有命令行参数
- $? :前一个命令的退出状态,可用于获取函数返回值
- $$ :执行的进程 ID
一个例子:
#!/bin/bash echo "print $" echo "\$0 = $0" echo "\$1 = $1" echo "\$2 = $2" echo "\$# = $#" echo "\$@ = $@" echo "\$* = $*" echo "\$$ = $$" echo "\$? = $?"1234567891011
执行
./hello.sh 1 2 3 4 5
的结果:print $ # 程序名 $0 = ./hello.sh # 第一个参数 $1 = 1 # 第二个参数 $2 = 2 # 一共有 5 个参数 $# = 5 # 打印出所有参数 $@ = 1 2 3 4 5 # 打印出所有参数 $* = 1 2 3 4 5 # 进程 ID $$ = 9450 # 之前没有执行其他命令或者函数 $? = 012345678910111213141516171819202122232425
3. 环境变量
环境变量默认就存在,常用的有下面这几个:
环境变量默认就存在,常用的有下面这几个:
\1. HOME:用户主目录环境变量默认就存在,常用的有下面这几个:
\1. HOME:用户主目录
\2. PATH:系统环境变量 PATH环境变量默认就存在,常用的有下面这几个:
\1. HOME:用户主目录
\2. PATH:系统环境变量 PATH
\3. TERM:当前终端环境变量默认就存在,常用的有下面这几个:
\1. HOME:用户主目录
\2. PATH:系统环境变量 PATH
\3. TERM:当前终端
\4. UID:当前用户 ID环境变量默认就存在,常用的有下面这几个:
\1. HOME:用户主目录
\2. PATH:系统环境变量 PATH
\3. TERM:当前终端
\4. UID:当前用户 ID
\5. PWD:当前工作目录,绝对路径还是看例子:
#!/bin/bash echo "print env" echo $HOME echo $PATH echo $TERM echo $PWD echo $UID123456789
运行结果:
print env # 当前主目录 /home/orange # PATH 环境变量 /home/orange/anaconda2/bin:后面还有很多 # 当前终端 xterm-256color # 当前目录 /home/orange # 用户 ID 100012345678910111213141516
Shell 变量就介绍到这里,下面来介绍 Shell 的变量运算。
Shell 运算
我们经常需要在 Shell 脚本中计算,掌握基本的运算方法很有必要,下面就是 4 种比较常见的运算方法,功能都是将 m + 1:
我们经常需要在 Shell 脚本中计算,掌握基本的运算方法很有必要,下面就是 4 种比较常见的运算方法,功能都是将 m + 1:
\1. m=$[ m + 1 ]我们经常需要在 Shell 脚本中计算,掌握基本的运算方法很有必要,下面就是 4 种比较常见的运算方法,功能都是将 m + 1:
\1. m=$[ m + 1 ]
\2. m=expr $m + 1
# 用 “ 字符包起来我们经常需要在 Shell 脚本中计算,掌握基本的运算方法很有必要,下面就是 4 种比较常见的运算方法,功能都是将 m + 1:
\1. m=$[ m + 1 ]
\2. m=expr $m + 1
# 用 “ 字符包起来
\3. let m=m+1我们经常需要在 Shell 脚本中计算,掌握基本的运算方法很有必要,下面就是 4 种比较常见的运算方法,功能都是将 m + 1:
\1. m=$[ m + 1 ]
\2. m=expr $m + 1
# 用 “ 字符包起来
\3. let m=m+1
\4. m=$(( m + 1 ))来看一个实际的例子:
#!/bin/bash m=1 m=$[ m + 1 ] echo $m m=`expr $m + 1` echo $m # 注意:+ 号左右不要加空格 let m=m+1 echo $m m=$(( m + 1 )) echo $m123456789101112131415
运行结果:
2 3 4 51234
了解了基本的运算方法,下面进一步来学习 Shell 的语句。
Shell 语句
Shell 语句跟高级语言有些类似,也包括分支,跳转,循环,下面就带着大家一个一个突破。
1. if 语句
这个跟高级语言的
if - else - if
类似,只是格式有些不同而已,也来看个例子吧:#!/bin/bash read VAR # 下面这两种判断方法都可以,使用 [] 注意左右加空格 #if test $VAR -eq 10 if [ $VART -eq 10 ] then echo "true" else echo "false" fi 123456789101112
2. case 语句
case 语句有些复杂,要注意格式:
#!/bin/bash read NAME # 格式有点复杂,一定要注意 case $NAME in "Linux") echo "Linux" ;; "cdeveloper") echo "cdeveloper" ;; *) echo "other" ;; esac 12345678910111213141516
运行结果:
# 输入 Linux Linux Linux # 输入 cdeveloper cdeveloper cdeveloper # 输入其他的字符串 hello other1234567891011
3. for 循环
这是一个 for 循环基本使用例子,挺简单的,有点类似 Python:
#!/bin/bash # 普通 for 循环 for ((i = 1; i <= 3; i++)) do echo $i done # VAR 依次代表每个元素 for VAR in 1 2 3 do echo $VAR done1234567891011121314
运行结果:
1 2 3123
4. while 循环
注意与 for 循环的区别:
#!/bin/bash VAR=1 # 如果 VAR 小于 10,就打印出来 while [ $VAR -lt 10 ] do echo $VAR # VAR 自增 1 VAR=$[ $VAR + 1 ] done1234567891011
运行结果:
1 2 3 4 5 6 7 8 9123456789
5. until 循环
until 语句与上面的循环的不同点是它的结束条件为 1:
#!/bin/bash i=0 # i 大于 5 时,循环结束 until [[ "$i" -gt 5 ]] do echo $i i=$[ $i + 1 ] done12345678910
6. break
Shell 中的
break
用法与高级语言相同,都是跳出循环,来看个例子:#!/bin/bash for VAR in 1 2 3 do # 如何 VAR 等于 2 就跳出循环 if [ $VAR -eq 2 ] then break fi echo $VAR done123456789101112
运行结果:
11
7. continue
continue
用来跳过本次循环,进入下一次循环,再来看看上面的例子:#!/bin/bash for VAR in 1 2 3 do # 如果 VAR 等于 2,就跳过,直接进入下一次 VAR = 3 的循环 if [ $VAR -eq 2 ] then continue fi echo $VAR done123456789101112
运行结果:
1 312
下面介绍 Shell 编程中比较重要的函数,好像每种编程语言的函数都很重要。
Shell 函数
函数可以用一句话解释:带有输入输出的具有一定功能的黑盒子,相信有过编程经验的同学不会陌生。那么,我们先来看看 Shell 中函数定义的格式。
1. 定义函数
有 2 种常见格式:
function fun_name() { } fun_name() { }123456789
例如:
#!/bin/bash function hello_world() { echo "hello world fun" echo $1 $2 return 1 } hello() { echo "hello fun" }12345678910111213
2. 调用函数
如何调用上面的 2 个函数呢?
# 1. 直接用函数名调用 hello 函数 hello # 2. 使用「函数名 函数参数」来传递参数 hello_world 1 2 # 3. 使用「FUN=`函数名 函数参数`」 来间接调用 FUN=`hello_world 1 2` echo $FUN123456789
3. 获取返回值
如何获取
hello_world
函数的返回值呢?还记得$?
吗?hello_world 1 2 # $? 可用于获取前一个函数的返回值,这里结果是 1 echo $?123
4. 定义本地变量
使用
local
来在函数中定义本地变量:fun() { local x=1 echo $x }12345
俗话说,程序 3 分靠写,7 分靠调,下面我们就来看看如何调试 Shell 程序。
Shell 调试
使用下面的命令来检查是否有语法错误:
sh -n script_name.sh1
使用下面的命令来执行并调试 Shell 脚本:
sh -x script_name.sh1
来看个实际的例子,我们来调试下面这个
test.sh
程序:#!/bin/bash for VAR in 1 2 3 do if [ $VAR -eq 2 ] then continue fi echo $VAR done12345678910
首先检查有无语法错误:
sh -n test.sh1
没有输出,说明没有错误,开始实际调试:
sh -x test.sh1
调试结果如下:
+ [ 1 -eq 2 ] + echo 1 1 + [ 2 -eq 2 ] + continue + [ 3 -eq 2 ] + echo 3 312345678
其中带有 + 表示的是 Shell 调试器的输出,不带 + 表示我们程序的输出。
Shell 易错点
这里我总结了一些初学 Shell 编程容易犯的错误,大多都是语法错误:
这里我总结了一些初学 Shell 编程容易犯的错误,大多都是语法错误:
[]
内不能嵌套()
,可以嵌套[]
这里我总结了一些初学 Shell 编程容易犯的错误,大多都是语法错误:
[]
内不能嵌套()
,可以嵌套[]
$[ val + 1 ]
是变量加 1 的常用方法
这里我总结了一些初学 Shell 编程容易犯的错误,大多都是语法错误:
[]
内不能嵌套()
,可以嵌套[]
$[ val + 1 ]
是变量加 1 的常用方法[]
在测试或者计算中里面的内容最好都加空格
这里我总结了一些初学 Shell 编程容易犯的错误,大多都是语法错误:
[]
内不能嵌套()
,可以嵌套[]
$[ val + 1 ]
是变量加 1 的常用方法[]
在测试或者计算中里面的内容最好都加空格
\4. 单引号和双引号差不多,单引号更加严格,双引号可以嵌套单引号
这里我总结了一些初学 Shell 编程容易犯的错误,大多都是语法错误:
[]
内不能嵌套()
,可以嵌套[]
$[ val + 1 ]
是变量加 1 的常用方法[]
在测试或者计算中里面的内容最好都加空格
\4. 单引号和双引号差不多,单引号更加严格,双引号可以嵌套单引号
\5. 一定要注意语句的格式,例如缩进
shell入门
最新推荐文章于 2025-05-31 12:19:37 发布