Shell编程 --- 变量

每天学习一点点,从量变到质变

今天,跟大家详细讲讲Shell编程中的变量。讲解的大纲如下

  1. 什么是变量与变量分类
  2. 用户自定义变量
  3. 环境变量
  4. 位置参数变量
  5. 用read接受键盘给变量赋值

什么是变量与变量分类

  • 什么是变量? 我想,对于什么是变量,估计大家都懂啥是变量,但是,为了我讲解的完整性,我还是要扯一下。哈哈。 初中高中接触过x,y,z这些我们自己设的未知数吧。如果你原意,你给它赋啥值,那它之后就代表那个值。这与变量类似,用一个符号(也就是变量名)来代表一个数值,例如我让 a=3, 那你以后就可以把a当作3来用了。不过,它还是和我们初中高中接触的未知数有点差别。居然是变量,就那说明这个变量a是可以变的啊,也就是说,你不想让a代表3了,你可以让a=4。 扯的有点多了,来个简洁点的 变量就是用一个符号(变量名)来代表一些数值。
  • 变量的命令规则(学过编程的你们估计都懂) 刚才说变量就是用一个符号来代表一些数值,不过我需要告诉你,这个符号可不是逗号,顿号这些哈。这个符号的命名是有规则的。规则如下: (1). 变量名必须以字母或下划线开头,名字中间只能由字母、数字、和下划线组成。例如abc, _abc, _a3b。但可不能 3abc。 (2).变量名的长度不得超过255个字符。 (3).变量名在有效的范围内必须唯一。你定义了a=3,总不能又定义a=4,然后让a同时能代表3又能代表4吧。 (4).在Bash中,变量的默认类型都是字符串类型。就是说你令a=100,a代表的并非是数字的100,而是由三个字符组成的字符串”100”.
  • 变量的分类 (1).如果按照存储数据分类的话,可分为以下几类
    • 字符串型,例如“abc”
    • 整型,例如数字100
    • 浮点型,例如小数100.12
    • 日期行,例如2018-6-20

(2).如果按作用范围的话,可分为自定义变量和环境变量(后面会将自定义变量和环境变量)。

自定义变量

毫无悬念,自定义变量,就是自己想怎么定义就怎么定义的变量。那怎么定义呢? 定义的格式:

变量名=变量值(等号两边可不能有空格哈,不像你在其他软件编写java等语言时经常隔一个空格)

例如:

x=5 myName=”苦逼的码农”

如果在屏幕打印显示变量的值呢?

我们可以通过:echo $变量名 来输出变量的值,$就像是一个取值符号一样。如下所示

不过需要注意的话,如果你不是用远程工具操作并且没有给Linux配置中文显示的话,是无法打印中文字符的哦。

我们还可以用命令 set 来查看当前用户中的所有变量。我就不演示了,可以自己输入set -> 回车试试。

  • 变量删除 简单粗暴,用命令: unset 变量名 就可以删除了

如下所示,删了之后在echo $myName就报错了

  • 变量叠加 例如你定义变量x=abc,现在想让x=abcdef,你直接在变量x=abc的基础上直接叠加上def就行了。如下: x=abc x=”x相当于取出了x的值,然后再拼上def。不过也可以用 x=${x}def,这种用大括号代替一对引号的方式也行,与上面那个等价的。

环境变量

学过c或者java等语言的都知道,有局部变量和全局变量这东西。环境变量就类似于全局变量。我们上面那种定义的变量就类似于局部变量。

也就是说,我们定义的普通变量的作用范围是局部的,啥是局部?就是只在当前的Shell中生效。而环境变量的作用范围是全局的,它在当前的Shell以及和这个Shell的所有子Shell中都生效。 说明:当我们在命令行输入 bash -> 回车,就会进入另一个bash,这个bash是之前那个bash的子Shell。

下面我用普通变量做一个演示,证明它到了子Shell就不存在了。

定义myName="苦逼的码农"
echo $myName
输出:苦逼的码农
执行 bash ->回车,进入子Shell
在执行 echo $myName
输入:啥东西也没有  

但是如果是环境变量的话,到了子Shell那它还是存在的。那如何定义环境变量呢?其实环境变量只需要在我们定义普通变量的时候,前面在加个export关键词就行了。如下

  • export 变量名=变量值

或者先定义成局部变量在声明为环境变量

  • 变量名=变量值
  • export 变量名

至于它的作用范围演示就略过。

想必我们在安装软件等事情的时候,经常会去配置我们的环境变量PATH路径。其实在我们系统内部就已经帮我们定义了很多环境变量了。这些环境变量的作用几乎也已经固定了。例如PATH这个环境变量,我们经常会把一些可执行文件的路径配置到PATH上,当我们在运行一些可执行程序时,就会去PATH那些路径找有没有这个可执行文件的存在。下面列出一些常用的环境变量:

  • HOSTNAME:主机名
  • SHELL:当前的SHELL
  • TERM:终端环境
  • HISTSIZE:历史命令条数
  • USER:当前登陆的用户
  • SSH_CLIENT:当前操作环境是用ssh连接的,这里记录客户端的ip
  • LANG:查看当前系统所用的语言、编码。可以用locale -a来查看当前系统支持的所有语言。如果想更该语言的话,可以在 /etc/sysconfig/i18n这个文件更改你的语言。我就不演示,动手打开试试看?

大家可以通过echo $变量名打印出来看看勒。

位置参数变量

假如我们要写一个从键盘上输入两个数字a, b,然后计算 a+b,最后输出结果的脚本。你要怎么做呢?其实这个时候就涉及到参数问题。我们要写一个脚本,这个脚本要从键盘接受两个数。这种参数我们称之为位置参数,这个时候就要用到位置参数变量。有如下一些位置参数变量:

  • $n: n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十及以上的参数需要用大括号包含,如${10}。
  • $*:这个变量代表命令行中的所有参数,$*把所有的参数看成一个整体
  • $@:这个变量也代表命令行中所有参数,不过$@把每个参数区别对待。
  • $#:这个变量代表命令行中所有参数的个数。

下面我们来完成那个a+b的脚本

(1).adder1.sh,内容如下:

#!/bin/bash
#第一个参数
num1=$1
#第二个参数
num2=$2
#两个参数之和
sum=$(($num1+$num2))
#输出结果
echo $sum

调用输出:

bash adder1.sh 3 4 (也可以用另一种方式调用,我之前有讲过)
输出结果:7

那我要是想接受键盘10数,然后计算他们的和呢?你可能会想定义10变量,然后在计算。不感觉很麻烦?那我要是想计算n个数之和呢?这些用#n这个位置变量不好办了吧?

这下我们就可以用$@这个位置变量了。它会接受全部变量,然后它会把每个参数区别对待存起来。直接看程序如下所示:

#!/bin/bash
for i in "$@"
    do
        sum=(($sum+$i))    #$i代表第几个参数
    done
echo "sum=$sum"

调用输出:

bash sum1.sh 1 2 3 4
输出:sum=10

为啥不用$*?上面已经说了,它把所有参数看出一个整体,并没有把每个参数区别对待。下面看看$*, $@, $#这三个以及区别

#!/bin/bash

for i in "$*"
$*只会循环一次
    do
        echo "The i is :$i
    done

for j in "$@"
#循环多次
    do
        echo "The j is :$j
    done

echo "the sumber:$#

调用运行:

bash sum1.sh 1 2 3
输出结果:The i is : 1 2 3
         The j is : 1
         The j is : 2
         The j is : 3
         The sumber:3

希望,你们都能上机尝试一下哦。

用read接受键盘给变量赋值

直接看命令的格式:

  • read [选项] [变量名] 选项:
    • -p:”提示信息”:在等待read的输入时,输出提示信息
    • -t:秒数。超过设定的时间未输入,自动执行
    • -n:字符数,只接受指定的字符数
    • -s:隐藏输入的数据,例如密码的输入之类的

例子如下:

#!/bin/bash
read -p "Please input your name: " -t 20 name
echo $name

read -p "Please input your password" -s password
echo $password

调用输出:

本次讲解到这里勒,下篇将Shell中的运算符。

ps:那些代码等排版排的好好的,不知为啥到了手机端都丢失了...

原文发布于微信公众号 - 苦逼的码农(di201805)

原文发表时间:2018-06-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jackson0714

【.Net底层剖析】3.用IL来理解属性

3357
来自专栏后端技术探索

实用篇-无处不在的Location

location配置是nginx模块化配置中最出色的一个设计,几乎所有nginx的业务场景都要通过书写多个location配置来顺应业务需要。语法配置和执行规则...

1172
来自专栏LIN_ZONE

PHP 反射的简单使用

1664
来自专栏静默虚空的博客

Shell 快速指南

Shell 快速指南 ███████╗██╗ ██╗███████╗██╗ ██╗ ██╔═══...

27510
来自专栏Nian糕的私人厨房

JavaScript 分支/循环语句

if...else 语句,在条件为 true 时执行代码,在条件为 false 时执行其他代码

884
来自专栏Python

浅淡python中with的用法,上下文管理器

例子一 首先来看一段代码: class Foo(object): def __init__(self): print('实例化一个对象...

21910
来自专栏GreenLeaves

Proxy代理模式(结构型模式)

在面向对象系统中,有些对象由于某种原因(比如创建对象的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给调用者带来麻烦,那么如何在不损失...

1333
来自专栏小樱的经验随笔

【批处理学习笔记】第十五课:语句结构(1)

    类似于C语言,批处理也有它的语句结构。批处理的语句结构主要有选择结构(if语句)、循环结构(for语句)等。   if语句(选择结构)     if语...

2869
来自专栏农夫安全

【weakfilescan】敏感文件扫描工具

weakfilescan 基于爬虫,动态收集扫描目标相关信息后进行二次整理形成字典规则,利用动态规则的多线程敏感信息泄露检测工具,支持多种个性化定制选项,包括...

4578
来自专栏JAVA技术站

shell学习三参数传递 原

echo "Shell 传递参数实例" echo "执行的文件名:$0" echo "第一个参数为:$1" echo "第二个参数为:$2" echo ...

492

扫码关注云+社区

领取腾讯云代金券