【Shell】20天学会shell脚本命令(2)变量的详解

一、问题

1.1、环境
电脑环境:Windows 10;
Docker版本:Server Version: 19.03.3

1.2、问题
shell脚本一直是Linux的必回只语言;就像去英语系国家工作,shell就是英语;如果不会英语,那么工作起来就会举步维艰;

声明:本学习内容,来自哔哩哔哩网站上的公开课内容【京峰教育】的吴光科老师的视频编写而成;仅供学习参考;网站地址

二、解答

2.1、基本知识;
任何的语言,都有常量和变量,什么是变量呢,未知数x就是变量,变量可以等于任何满足条件的值,并且不同的条件下,会有不同的值;shell的变量分为两类:

  1. 局部变量:仅在本shell内有效;
  2. 环境变量:在本Linux系统内有效;
    这个和java一样,java也有局部变量和环境变量;局部变量和环境变量有什么区别,就好比一个演员,他在电影里可以扮演某个角色,使用该角色的身份;但是在现实中,他就无法使用电影中的角色的权力;但是在现实中,他可以行使自己作为正常公民的所有权力;如果你非要让他本色出演,在局部变量里声明一个系统变量原有的值,也是可以的;

1、定义变量

A=1

变量赋值通过赋值号来连接,也就是我们常见的等于号,但是它不是等于号;打个比方,变量A就是一个杯子,现在杯子里装的如果是水,你不能说杯子等于水;现在杯子里装的是数值1,随着编程的进行,后面A的值会发生变化;定义的格式是:

变量名=值

这里注意变量名前面没有任何单词,不像java,要规定变量的类型,由此可见,shell是弱语言类型的;并且,这里的【值】不一定指数值,也有可能是字符串或者其他内容;还有要注意的是,shell里的变量,我们最好用大写字母来表示,这样我们能一眼认出哪些是我们自定义的变量;方便我们调取;

2、运行
我们新建一个vary.sh,输入内容如下:

#!/bin/bash
#study varialbes
A=1
echo "$A"

运行后的结果为:
在这里插入图片描述
3、与Java的对比
①、这里的echo就是shell脚本里面的打印函数或者叫打印方法,后面跟打印的内容即可,类似于Java里的System.out.println()方法;并且Java还需要有一个main方法(或者@Test标注的测试类)才能完成打印动作;显然,shell更方便;
②、shell定义变量时,不需要规定变量的类型,但是Java是强语言类型,必须声明变量的类型;各有利弊;
③、并且对比Java,我们可以发现,变量的引用方式也不一样,Java是直接引用变量名a,不需要使用美元符号;但是shell需要;这里Java搬回1分;
④、Java在引用变量时,会受到英文的双引号的干扰,因为变量一旦写在英语的双引号内,系统无法识别他是文字内容还是变量,所以Java的变量必须要切断引号,暴露在引号外,才能打印;而shell因为有美元符号加持,所以不用怕,系统照样识别$A是一个变量;
⑤、shell里的等号前后不能有空格,而Java不必担心;这里要非常注意;

在这里插入图片描述

4、系统变量
系统规定了一部分特殊的变量,内容如下:

$0:当前程序的名称;
$n:当前系统的第n个参数,n=1,2,3,4,5,6,7,8,9
$*:当前参数的所有参数(不含程序本身)
$# 当前程序的参数个数(不包括程序本身)
$?:命令或者程序执行后的状态,返回0表示成功;这里跟我们常识感觉可能不一样,因为我们一般以0为无,没有的意思;通常认为0表示失败,这里恰恰相反,大家注意;
$UID:当前用户的ID;
$PWD:当前所在的目录;(这里的PWD不是密码的意思,不是表示password,而是print working directory,一般英语大写缩写都是多个单词的缩写,这里注意,容易误解);
我们编写打印脚本,把这几个变量都打印一遍,脚本内容:
在这里插入图片描述

echo "当前程序名称为:$0"                                                                                               echo "当前系统第1个参数为:$1"                                                                                          echo "当前系统第2个参数为:$2"                                                                                          echo "当前系统的所有参数为:$*"                                                                                         echo "当前系统的执行状态为:$?"                                                                                        echo "当前程序的参数个数为:$#"                                                                                         echo "当前用户的ID:$UID"                                                                                               echo "当前所在的目录为:$PWD"                                                                                                                         

执行结果截图:
在这里插入图片描述

在这里插入图片描述

我们发现,因为该脚本没有输入任何参数,所以第1,2个参数都为空;并且,程序的执行状态为$?,而不是返回0或者其他数字来表示成功与否,因为在打印过程中,脚本还没结束,系统执行到这里时无法判断接下来程序是否正常运行结束,所以在自己的脚本中,系统无法判断脚本自己是否正常结束;如果想看刚才执行的脚本是否成功,我们可以再执行完脚本后,立马执行

echo $?

这样就可以看到返回值是否是0来判断脚本是否执行成功(刚刚说的,0代表成功);
在这里插入图片描述
但是,如上图,我们如果光打印$?,命令行是无法识别的;

如果要想打印第1,2个参数,我们可以这样运行脚本,在sh systemVariables.sh 后面加空格123,再加空格456(这就是执行脚本传递参数的方式,按照空格后录入参数,以空格区分,依次顺序录入);
在这里插入图片描述

4、转义
如果我们要打印【$1】或者【$0】这里具有特殊意义的文本该如何处理呢?

echo "\$1"
echo "\$#"

来运行shell脚本了,这样,我们就不用授权,也能执行了;执行结果如下图:
在这里插入图片描述

本篇说明内容完毕;

三、总结

欢迎关注我的
CSDN博客: https://blog.csdn.net/River_Continent
微信公众号:幕桥社区
在这里插入图片描述
* 知乎:张牧野, https://www.zhihu.com/people/zhang-mu-ye-37-76/activities
* 简书: https://www.jianshu.com/u/02c0096cbfd3

发布了348 篇原创文章 · 获赞 202 · 访问量 83万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章