shell2

转载

Linux Shell 编程入门

本文转载自:https://blog.csdn.net/qq_22075977/article/details/75209149

本文摘要

本文主要介绍 Linux Shell 编程的基础知识,包含下面 8 个方面

  1. Shell 编程概述
  2. Shell 关键字
  3. Shell 变量
  4. Shell 运算
  5. Shell 语句
  6. Shell 函数
  7. Shell 调试
  8. Shell 易错点

下面一一介绍。

Shell 编程概述

在 Linux 下有一门脚本语言叫做:Shell 脚本,这个脚本语言可以帮助我们简化很多工作,例如编写自定义命令等,所以还是很有必要学习它的基本用法的,一个简单的 hello.sh 脚本像下面这样,第一行 #!/bin/bash 标识该 Shell 脚本由哪个 Shell 解释


       
       
       
       
  1. #!/bin/bash
  2. echo "Hello World!"
  • 1
  • 2
  • 3

赋予权限才可以执行


       
       
       
       
  1. # 赋予可执行权限
  2. chmod a+ x hello.sh
  3. # 执行
  4. ./hello.sh
  5. # 结果
  6. Hello World!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Shell 的编写流程: 
1. 编写 Shell 脚本 
2. 赋予可执行权限 
3. 执行,调试

下面来介绍具体的语法。

Shell 关键字

常用的关键字如下: 
1. echo:打印文字到屏幕 
2. exec:执行另一个 Shell 脚本 
3. read:读标准输入 
4. expr:对整数型变量进行算术运算 
5. test:用于测试变量是否相等、 是否为空、文件类型等 
6. exit:退出

看个例子:


       
       
       
       
  1. #!/bin/bash
  2. echo "Hello Shell"
  3. # 读入变量
  4. read VAR
  5. echo "VAR is $VAR"
  6. # 计算变量
  7. expr $VAR - 5
  8. # 测试字符串
  9. test "Hello"= "HelloWorld"
  10. # 测试整数
  11. test $VAR -eq 10
  12. # 测试目录
  13. test -d ./Android
  14. # 执行其他 Shell 脚本
  15. exec ./othershell.sh
  16. # 退出
  17. exit
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

运行前,你需要新建一个 othershell.sh 的文件,让它输出 I'm othershell,并且中途需要一次输入,我这里输入的是 10:


       
       
       
       
  1. Hello Shell
  2. 10
  3. VAR is 10
  4. 5
  5. I 'm othershell
  • 1
  • 2
  • 3
  • 4
  • 5

学习任何一门语言都要了解它的变量定义方法,Shell 也不例外。

Shell 变量

Shell 变量分为 3 种: 
1. 用户自定义变量 
2. 预定义变量 
3. 环境变量

定义变量需要注意下面 2 点: 
1. 等号前后不要有空格:NUM=10 
2. 一般变量名用大写:M=1

使用 $VAR 调用变量:

echo $VAR
       
       
       
       
  • 1

1. 用户自定义变量

这种变量只支持字符串类型,不支持其他字符,浮点等类型,常见有这 3 个前缀: 
1. unset:删除变量 
2. readonly:标记只读变量 
3. export:指定全局变量

一个例子:


       
       
       
       
  1. #!/bin/bash
  2. # 定义普通变量
  3. CITY=SHENZHEN
  4. # 定义全局变量
  5. export NAME=cdeveloper
  6. # 定义只读变量
  7. readonly AGE= 21
  8. # 打印变量的值
  9. echo $CITY
  10. echo $NAME
  11. echo $AGE
  12. # 删除 CITY 变量
  13. unset CITY
  14. # 不会输出 SHENZHEN
  15. echo $CITY
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

运行结果:


       
       
       
       
  1. SHENZHEN
  2. cdeveloper
  3. 21
  • 1
  • 2
  • 3
  • 4

2. 预定义变量

预定义变量常用来获取命令行的输入,有下面这些:

  1. $0 :脚本文件名
  2. $1-9 :第 1-9 个命令行参数名
  3. $# :命令行参数个数
  4. $@ :所有命令行参数
  5. $* :所有命令行参数
  6. $? :前一个命令的退出状态,可用于获取函数返回值
  7. $$ :执行的进程 ID

一个例子:


       
       
       
       
  1. #!/bin/bash
  2. echo "print $"
  3. echo "\$0 = $0"
  4. echo "\$1 = $1"
  5. echo "\$2 = $2"
  6. echo "\$# = $#"
  7. echo "\$@ = $@"
  8. echo "\$* = $*"
  9. echo "\$$ = $$"
  10. echo "\$? = $?"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

执行./hello.sh 1 2 3 4 5 的结果:


       
       
       
       
  1. print $
  2. # 程序名
  3. $0 = ./hello.sh
  4. # 第一个参数
  5. $1 = 1
  6. # 第二个参数
  7. $2 = 2
  8. # 一共有 5 个参数
  9. $# = 5
  10. # 打印出所有参数
  11. $@ = 1 2 3 4 5
  12. # 打印出所有参数
  13. $* = 1 2 3 4 5
  14. # 进程 ID
  15. $$ = 9450
  16. # 之前没有执行其他命令或者函数
  17. $? = 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

3. 环境变量

环境变量默认就存在,常用的有下面这几个: 
1. HOME:用户主目录 
2. PATH:系统环境变量 PATH 
3. TERM:当前终端 
4. UID:当前用户 ID 
5. PWD:当前工作目录,绝对路径

还是看例子:


       
       
       
       
  1. #!/bin/bash
  2. echo "print env"
  3. echo $HOME
  4. echo $PATH
  5. echo $TERM
  6. echo $PWD
  7. echo $UID
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

运行结果:


       
       
       
       
  1. print env
  2. # 当前主目录
  3. /home/orange
  4. # PATH 环境变量
  5. /home/orange/anaconda2/bin:后面还有很多
  6. # 当前终端
  7. xterm - 256color
  8. # 当前目录
  9. /home/orange
  10. # 用户 ID
  11. 1000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

Shell 变量就介绍到这里,下面来介绍 Shell 的变量运算。

Shell 运算

我们经常需要在 Shell 脚本中计算,掌握基本的运算方法很有必要,下面就是 4 种比较常见的运算方法,功能都是将 m + 1: 
1. m=$[ m + 1 ] 
2. m=expr $m + 1 # 用 “ 字符包起来 
3. let m=m+1 
4. m=$(( m + 1 ))

来看一个实际的例子:


       
       
       
       
  1. #!/bin/bash
  2. m= 1
  3. m=$[ m + 1 ]
  4. echo $m
  5. m=`expr $m + 1`
  6. echo $m
  7. # 注意:+ 号左右不要加空格
  8. let m=m+ 1
  9. echo $m
  10. m=$(( m + 1 ))
  11. echo $m
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

运行结果:


       
       
       
       
  1. 2
  2. 3
  3. 4
  4. 5
  • 1
  • 2
  • 3
  • 4

了解了基本的运算方法,下面进一步来学习 Shell 的语句。

Shell 语句

Shell 语句跟高级语言有些类似,也包括分支,跳转,循环,下面就带着大家一个一个突破。

1. if 语句

这个跟高级语言的 if - else - if 类似,只是格式有些不同而已,也来看个例子吧:


       
       
       
       
  1. #!/bin/bash
  2. read VAR
  3. # 下面这两种判断方法都可以,使用 [] 注意左右加空格
  4. #if test $VAR -eq 10
  5. if [ $VART -eq 10 ]
  6. then
  7. echo "true"
  8. else
  9. echo "false"
  10. fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2. case 语句

case 语句有些复杂,要注意格式:


       
       
       
       
  1. #!/bin/bash
  2. read NAME
  3. # 格式有点复杂,一定要注意
  4. case $NAME in
  5. "Linux")
  6. echo "Linux"
  7. ;;
  8. "cdeveloper")
  9. echo "cdeveloper"
  10. ;;
  11. *)
  12. echo "other"
  13. ;;
  14. esac
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

运行结果:


       
       
       
       
  1. # 输入 Linux
  2. Linux
  3. Linux
  4. # 输入 cdeveloper
  5. cdeveloper
  6. cdeveloper
  7. # 输入其他的字符串
  8. hello
  9. other
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3. for 循环

这是一个 for 循环基本使用例子,挺简单的,有点类似 Python:


       
       
       
       
  1. #!/bin/bash
  2. # 普通 for 循环
  3. for ((i = 1; i <= 3; i++))
  4. do
  5. echo $i
  6. done
  7. # VAR 依次代表每个元素
  8. for VAR in 1 2 3
  9. do
  10. echo $VAR
  11. done
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

运行结果:


       
       
       
       
  1. 1
  2. 2
  3. 3
  • 1
  • 2
  • 3

4. while 循环

注意与 for 循环的区别:


       
       
       
       
  1. #!/bin/bash
  2. VAR= 1
  3. # 如果 VAR 小于 10,就打印出来
  4. while [ $VAR -lt 10 ]
  5. do
  6. echo $VAR
  7. # VAR 自增 1
  8. VAR=$[ $VAR + 1 ]
  9. done
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

运行结果:


       
       
       
       
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

5. until 循环

until 语句与上面的循环的不同点是它的结束条件为 1


       
       
       
       
  1. #!/bin/bash
  2. i= 0
  3. # i 大于 5 时,循环结束
  4. until [[ "$i" -gt 5 ]]
  5. do
  6. echo $i
  7. i=$[ $i + 1 ]
  8. done
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

6. break

Shell 中的 break 用法与高级语言相同,都是跳出循环,来看个例子:


       
       
       
       
  1. #!/bin/bash
  2. for VAR in 1 2 3
  3. do
  4. # 如何 VAR 等于 2 就跳出循环
  5. if [ $VAR -eq 2 ]
  6. then
  7. break
  8. fi
  9. echo $VAR
  10. done
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行结果:

1
       
       
       
       
  • 1

7. continue

continue 用来跳过本次循环,进入下一次循环,再来看看上面的例子:


       
       
       
       
  1. #!/bin/bash
  2. for VAR in 1 2 3
  3. do
  4. # 如果 VAR 等于 2,就跳过,直接进入下一次 VAR = 3 的循环
  5. if [ $VAR -eq 2 ]
  6. then
  7. continue
  8. fi
  9. echo $VAR
  10. done
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行结果:


       
       
       
       
  1. 1
  2. 3
  • 1
  • 2

下面介绍 Shell 编程中比较重要的函数,好像每种编程语言的函数都很重要。

Shell 函数

函数可以用一句话解释:带有输入输出的具有一定功能的黑盒子,相信有过编程经验的同学不会陌生。那么,我们先来看看 Shell 中函数定义的格式。

1. 定义函数

有 2 种常见格式:


       
       
       
       
  1. function fun_name()
  2. {
  3. }
  4. fun_name()
  5. {
  6. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

例如:


       
       
       
       
  1. #!/bin/bash
  2. function hello_world()
  3. {
  4. echo "hello world fun"
  5. echo $1 $2
  6. return 1
  7. }
  8. hello()
  9. {
  10. echo "hello fun"
  11. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2. 调用函数

如何调用上面的 2 个函数呢?


       
       
       
       
  1. # 1. 直接用函数名调用 hello 函数
  2. hello
  3. # 2. 使用「函数名 函数参数」来传递参数
  4. hello_world 1 2
  5. # 3. 使用「FUN=`函数名 函数参数`」 来间接调用
  6. FUN=`hello_world 1 2`
  7. echo $FUN
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3. 获取返回值

如何获取 hello_world 函数的返回值呢?还记得 $? 吗?


       
       
       
       
  1. hello_world 1 2
  2. # $? 可用于获取前一个函数的返回值,这里结果是 1
  3. echo $?
  • 1
  • 2
  • 3

4. 定义本地变量

使用 local 来在函数中定义本地变量:


       
       
       
       
  1. fun()
  2. {
  3. local x= 1
  4. echo $x
  5. }
  • 1
  • 2
  • 3
  • 4
  • 5

俗话说,程序 3 分靠写,7 分靠调,下面我们就来看看如何调试 Shell 程序。

Shell 调试

使用下面的命令来检查是否有语法错误

sh -n script_name.sh
       
       
       
       
  • 1

使用下面的命令来执行并调试 Shell 脚本

sh -x script_name.sh
       
       
       
       
  • 1

来看个实际的例子,我们来调试下面这个 test.sh 程序:


       
       
       
       
  1. #!/bin/bash
  2. for VAR in 1 2 3
  3. do
  4. if [ $VAR -eq 2 ]
  5. then
  6. continue
  7. fi
  8. echo $VAR
  9. done
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

首先检查有无语法错误:

sh -n test.sh
       
       
       
       
  • 1

没有输出,说明没有错误,开始实际调试:

sh -x test.sh
       
       
       
       
  • 1

调试结果如下:


       
       
       
       
  1. + [ 1 -eq 2 ]
  2. + echo 1
  3. 1
  4. + [ 2 -eq 2 ]
  5. + continue
  6. + [ 3 -eq 2 ]
  7. + echo 3
  8. 3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

其中带有 + 表示的是 Shell 调试器的输出不带 + 表示我们程序的输出

Shell 易错点

这里我总结了一些初学 Shell 编程容易犯的错误,大多都是语法错误: 
1. [] 内不能嵌套 (),可以嵌套 [] 
2. $[ val + 1 ] 是变量加 1 的常用方法 
3. [] 在测试或者计算中里面的内容最好都加空格 
4. 单引号和双引号差不多,单引号更加严格,双引号可以嵌套单引号 
5. 一定要注意语句的格式,例如缩进

文章最后发布于: 2018-04-20 09:49:01

你可能感兴趣的:(转载,环境配置)