• (二)Shell编程之运行方式、注释、变量


    一、第一个shell脚本

    打开文本编辑器(可以使用vi/vim命令来创建文件),新建一个文件test.sh,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好。

    输入一些代码,第一行一般是这样:

    #!/bin/bash

    #!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell

    echo命令用于向窗口输出文本。

    二、单行、多行注释

    (1)单行注释

    以#开头的行就是注释,会被解释器忽略。

    通过每一行加一个 # 号设置多行注释,像这样:

    1. # --------------------
    2. # 这是一个注释
    3. # author: 大侠
    4. # slogan: 学的不仅是技术,更是梦想!
    5. # --------------------

    (2)多行注释

    多行注释使用以下格式:

    1. :<<EOF
    2. 注释内容...
    3. 注释内容...
    4. 注释内容...
    5. EOF

    EOF也可以使用其他符号:

    1. :<<'
    2. 注释内容...
    3. 注释内容...
    4. 注释内容...
    5. '
    6. :<
    7. 注释内容...
    8. 注释内容...
    9. 注释内容...
    10. !

    三、运行Shell脚本有两种方法

    (1)作为可执行程序

    将上面的代码保存为 test.sh,并 cd 到相应目录:

    1. # 使脚本具有执行权限
    2. chmod 755 ./test.sh
    3. # 执行脚本
    4. ./test.sh

    (2)作为解释器参数

    这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:

    1. /bin/sh test.sh
    2. /bin/python test.py

    四、shell变量

    (1)定义变量

    shell中定义变量与python语言类似,语法如下:

    name=[value]

    如果value没有给出,变量将被赋值为空字符串。

    注意:赋值等号两边不能有空格,这几乎和所有的变成语言都不一样。

    变量名的命名规则同python:

    • 英文字母,数字和下划线
    • 首字符不能是数字
    • 不能使用bash中的关键字(help命令查看保留关键字)

    定义变量有多种形式

    name=liyifeng

    当值中不包含空格时,可以不需要引号。当值中需要包含空格时需要用引号包含。如果只是输出字符的字面值,单引号和双引号没有区别。当需要进行变量扩展等操作时,要使用双引号,详见shell引用。

    1. # 没区别
    2. info='helloworld'
    3. info=helloworld
    4. # 值有空格,必须要加引号。
    5. info='hello world'
    6. info=hello world

    (2)使用变量

    使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

    1. name=liyifeng
    2. echo $name

    也可以 echo ${name},

    echo ${name}

    变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况。

    注意:如果变量不存在,那么就把他替换成空字符串,所以不会报错。

    (3)只读变量

    (4)删除变量 unset

    1. # 删除变量
    2. unset name

     五、变量作用域

    (1)局部变量 

    局部变量在脚本或命令中定义,仅在当前shell进程中有效。

    (2)全局变量

    在当前shell中任何地方可以使用变量,且在子shell中也有效

    通过命令 env 可以查看当前shell中的所有全局变量

    要定义一个全局变量可以使用 export 命令,格式如下

    export var=value

    但是export定义的全局变量是临时的,当关闭执行定义的shell进程后,定义的变量就会被销毁,所以通过export定义的全局变量只能向下传递,也就是只能是父shell传递给子shell。

     

    在外面访问不到info,因为通过export定义的全局变量只能向下传递,也就是只能是父shell传递给子shell。

     那我们在主shell中定义一个全局变量,然后在子shell里test.sh中引用这个变量试试看(向下传递)~

    info这个变量能打印出来!

    那如何定义一个所有shell都可以访问的变量呢。本质上来讲没有一个这样的变量。但是我们可以通过启动shell时预定义全局变量来实现这个目的。也就是接下来我们要讲的环境变量。

    (3)环境变量 

    所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

    环境变量本质上就是全局变量,只不过它是在启动终端(shell主进程)时通过执行初始化脚本预定义的。

    启动终端后直接输入 env 命令 显示得所有的变量都是环境变量。要定义环境变量可以在以下文件中通过export定义:

    • ~/.bashrc 只对当前用户的终端有效
    • ~/.profile 只对当前用户的终端有效
    • /etc/bash.bashrc 对所有用户的终端有效

    注意:不同linux,不同终端启动文件有所不同,但是原理相同

    我们将wangdaxia 追加到.bashrc文件里,然后我们每打开一个终端,他就会打印一个

    想必大家应该都知道怎么定义环境变量了吧。

    我们来操作一下。在 .bashrc文件中配置一个name变量

    1. # 步骤一
    2. cd /root
    3. # 步骤二
    4. vim .bashrc

    然后我通过 env 查看全局环境变量, 看到了我刚才添加的环境变量name。

     那在脚本里我也可以用啦。因为这个环境里面就有name变量啦。

    我们在脚本里面引用这个环境变量。

    然后执行这个脚本 发现这个name变量能引用到。完成啦。

     

    下一节讲shell 数据类型、数组啦~

  • 相关阅读:
    redis
    车辆路径问题——day20 读论文:基于模糊需求与模糊时间窗的车辆路径问题及混合遗传算法求解(2019 系统管理学报)
    24. python 字符串索引取值
    【面试题】 vue高频面试知识点汇总【2022寒冬版】
    OpenCV图像处理基础操作
    基于流的(Flow-based)生成模型简介
    Figma转Sketch文件教程,超简单!
    Fecify 跨境电商系统,有哪些优势?
    vue3的reactive全家桶---kalrry
    php 常用的接口和函数
  • 原文地址:https://blog.csdn.net/Sean_0819/article/details/126811135