shell入门

本文介绍了Shell脚本的基础知识,包括Shell脚本的概念、编写流程、关键字、变量、运算符及控制语句等内容,并通过多个实例帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 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 脚本

    • 赋予可执行权限

    • 执行,调试

      下面来介绍具体的语法

  2. 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

      授权并执行

  3. 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
  4. Shell 运算
  5. Shell 语句
  6. Shell 函数
  7. Shell 调试
  8. Shell 易错点

    . 用户自定义变量

    这种变量只支持字符串类型,不支持其他字符,浮点等类型,常见有这 3 个前缀:

    这种变量只支持字符串类型,不支持其他字符,浮点等类型,常见有这 3 个前缀:

    1. unset:删除变量

    这种变量只支持字符串类型,不支持其他字符,浮点等类型,常见有这 3 个前缀:

    1. unset:删除变量
    2. readonly:标记只读变量

    这种变量只支持字符串类型,不支持其他字符,浮点等类型,常见有这 3 个前缀:

    1. unset:删除变量
    2. readonly:标记只读变量
    3. 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. 预定义变量

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

    1. $0 :脚本文件名
    2. $1-9 :第 1-9 个命令行参数名
    3. $# :命令行参数个数
    4. $@ :所有命令行参数
    5. $* :所有命令行参数
    6. $? :前一个命令的退出状态,可用于获取函数返回值
    7. $$ :执行的进程 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 编程容易犯的错误,大多都是语法错误:

    1. [] 内不能嵌套 (),可以嵌套 []

    这里我总结了一些初学 Shell 编程容易犯的错误,大多都是语法错误:

    1. [] 内不能嵌套 (),可以嵌套 []
    2. $[ val + 1 ] 是变量加 1 的常用方法

    这里我总结了一些初学 Shell 编程容易犯的错误,大多都是语法错误:

    1. [] 内不能嵌套 (),可以嵌套 []
    2. $[ val + 1 ] 是变量加 1 的常用方法
    3. [] 在测试或者计算中里面的内容最好都加空格

    这里我总结了一些初学 Shell 编程容易犯的错误,大多都是语法错误:

    1. [] 内不能嵌套 (),可以嵌套 []
    2. $[ val + 1 ] 是变量加 1 的常用方法
    3. [] 在测试或者计算中里面的内容最好都加空格
      \4. 单引号和双引号差不多,单引号更加严格,双引号可以嵌套单引号

    这里我总结了一些初学 Shell 编程容易犯的错误,大多都是语法错误:

    1. [] 内不能嵌套 (),可以嵌套 []
    2. $[ val + 1 ] 是变量加 1 的常用方法
    3. [] 在测试或者计算中里面的内容最好都加空格
      \4. 单引号和双引号差不多,单引号更加严格,双引号可以嵌套单引号
      \5. 一定要注意语句的格式,例如缩进

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值