个人博客网:https://wushaopei.github.io/    (你想要这里多有)

四、Shell 中的变量

1、系统变量

1.1 常用系统变量

$HOME、 $PWD、 $SHELL 、$USER等

1.2 案例实操

(1)查看系统变量的值

[root@rich datas]# echo $HOME
/root
[root@rich datas]# echo $PWD
/home/wenmin/datas
[root@rich datas]# echo $SHELL
/bin/bash
[root@rich datas]# echo $USER
root

(2)显示当前Shell中所有变量: set

2、自定义变量

2.1 基本语法

(1) 定义变量: 变量 = 值

(2)撤销变量: unset 变量

(3)声明静态变量: readonly 变量,注意: 不能 unset

2.2 变量定义规则

(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写

(2)等号两侧不能有空格

(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算

(4)变量的值如果有空格,需要使用双引号或单引号括起来

2.3 案例实操

(1)定义变量A

[root@rich datas]# A=5
[root@rich datas]# echo $A
5

(2)给变量A重新赋值

[root@rich datas]# A=88
[root@rich datas]# echo $A
88

(3)撤销变量

[root@rich datas]# unset A
[root@rich datas]# echo $A

(4)声明静态的变量B=3 ,不能unset

[root@rich datas]# readonly B=3
[root@rich datas]# echo $B
3
[root@rich datas]# unset B
-bash: unset: B: 无法反设定: 只读 variable

(5)在bash中,变量默认类型都是字符串类型,无法直接进行述职运算

[root@rich datas]# C=1+1
[root@rich datas]# echo $C
1+1

(6)变量的值如果有空格,需要使用双引号或单引号括起来

[root@rich datas]# D=wenxing love me
bash: love: 未找到命令...
[root@rich datas]# D="wenxing love me"
[root@rich datas]# echo $D
wenxing love me

(7)可把变量提升为全局环境变量,可供其他Shell程序使用

export  变量名

[root@rich datas]# vim helloworld.sh 

在helloworld.sh 文件中增加 echo $D

#!/bin/bash

echo "helloworld wenmin"
echo $D

执行脚本:

[root@rich datas]# ./helloworld.sh
helloworld wenmin

发现没有打印输出变量D的值

[root@rich datas]# export D
[root@rich datas]# ./helloworld.sh
helloworld wenmin
wenxing love me

将局部变量提升为全局变量后,属于不同进程的脚本也可以调用全局变量的 $D  的进程,进而执行对应脚本命令

3、特殊变量:$n

3.1 基本语法

$n  (功能描述: n为数字,$0 代表该脚本名称, $1-$9 代表第一道第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})

3.2 案例实操

(1)输出该脚本文件名称、输入参数1 和 输入参数2 、输入参数3 的值

[root@rich ~]# touch parameter.sh
[root@rich ~]# vim parameter.sh

#!/bin/bash

echo "$0 $1 $2 $3"

执行脚本:

[root@rich ~]# bash parameter.sh
parameter.sh
[root@rich ~]# bash parameter.sh wenmin // 写入一个参数
parameter.sh wenmin
[root@rich ~]# bash parameter.sh wenmin love // 写入两个参数
parameter.sh wenmin love
[root@rich ~]# bash parameter.sh wenmin love mm // 写入三个参数
parameter.sh wenmin love mm
[root@rich ~]# bash parameter.sh wenmin love mm 1 // 写入三个参数,最后一个没有被接收到
parameter.sh wenmin love mm

脚本中设定的输入参数最多为  3  个,所以,当执行语句后的参数个数超过三个后,不再被写入。

4、特殊变量: $#

4.1 基本语法

$#  (功能描述: 获取所有输入参数个数,常用于循环)

4.2 案例实操

(1)获取输入参数的个数

[root@rich ~]# vim parameter.sh 

#!/bin/bash

echo "$0 $1 $2 $3"
echo $#

执行脚本:

(a)

[root@rich ~]# bash parameter.sh wenxin
parameter.sh wenxin
1
[root@rich ~]# bash parameter.sh wenxin wenmin
parameter.sh wenxin wenmin
2
[root@rich ~]# bash parameter.sh wenxin wenmin wenchang
parameter.sh wenxin wenmin wenchang
3

或(b)

[root@rich ~]# chmod 777 parameter.sh
[root@rich ~]# ./parameter.sh cls xz
./parameter.sh cls xz
2

5、特殊变量: $* 、$@

5.1 基本语法

$*  (功能描述: 这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体)

$@  (功能描述: 这个变量也代表命令行中所有的参数,不过$@  把每个参数区分对待)

5.2 案例实操

(1) 打印输入的所有参数

[root@rich ~]# vim parameter.sh

#!/bin/bash

echo "$0 $1 $2 $3"
echo $#
echo $*
echo $@

执行脚本:

[root@rich ~]# ./parameter.sh wenmin wenxin wenchang
./parameter.sh wenmin wenxin wenchang
3
wenmin wenxin wenchang //$*
wenmin wenxin wenchang //$#

从执行的结果来看,$* 和$@ 好像没有什么区别,但是实际在执行过程中,$*会对输入的多个参数看成一个整体来执行,而$@则会将输入的多个参数按照顺序依次执行;在参数数量较少的情况下,两者没有什么差别。

6、特殊变量 $?

6.1 基本语法

$? (功能描述: 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是那个数,由命令自己来决定),则证明上一个命令执行不正确了。)

6.2 案例实操

(1) 判断helloworld.sh 脚本是否正确执行难

[root@rich wenmin]# cd datas/
[root@rich datas]# ./helloworld.sh
helloworld wenmin
[root@rich datas]# $?
bash: 0: 未找到命令...
[root@rich datas]# echo $? //当上一条命令没有正确执行时,echo $?返回 127
127
[root@rich datas]# ./helloworld.sh
helloworld wenmin
[root@rich datas]# echo $? //当上一条命令正确执行时,echo $?返回 0
0
[root@rich datas]#

五、 运算符

1、基本语法

(1)“$((运算式))” 或 “$[运算式]”

(2)expr + , - , \* , / , %   加,减,乘,除,取余

注意: expr 运算符间要有空格

2、案例实操:

(1)计算 3+2 的值

[root@rich datas]# expr 3 + 2
5

(2)计算 3-2 的值

[root@rich datas]# expr 3 - 2
1

(3)计算(2+3)X4 的值

(a) expr一步完成计算

[root@rich datas]# expr `expr 2 + 3` \* 4
20

当前表达式中, 被   “ ` ” 所包含的运算式会先执行,再结果的基础上再与外面的运算式继续执行乘的操作

(b)采用$[运算式]方式

[root@rich datas]# s=$[(2+3)*4]
[root@rich datas]# echo $s
20

Shell脚本 (二) 变量与运算符的更多相关文章

  1. shell脚本二

    在shell脚本一 中,我讨论了shell脚本的语法规范,shell脚本的变量,以及shell脚本的测试语句. 仅仅懂得这些只能写简单的脚本,在简单的脚本中各条语句按顺序执行,从而实现自动化的管理,顺 ...

  2. shell脚本特殊变量与变量子串相关知识

    一.shell脚本特殊变量 1.shell中常用特殊位置变量说明: $0 获取当前执行的shell脚本的文件名,如果执行脚本包含了路径,那么就包含了脚本路径 $n 获取当前执行的shell脚本的第n个 ...

  3. shell脚本-高级变量

    shell脚本-高级变量 字符串变量切片 ${#var}: 返回字符串变量var的长度 ${var:offset}: 返回字符串变量var中从第offset个字符后(不包括第offset 个字符)的字 ...

  4. Linux基础-shell脚本知识整理和脚本编写----------变量、运算符、流程控制、函数、计划任务(发送邮件)

    I:知识整理:变量.运算符.流程控制.函数.计划任务 变量 系统变量:set:显示所有变量                env:环境变量 常用系统变量: path pwd lang home his ...

  5. Shell基础:变量类型 & 运算符

    Shell变量 Shell支持三种类型的变量 用户自定义变量:用户自定义的变量,变量名以英文字母或下划线开头,区分大小写. 位置变量:根据位置传递参数给脚本的变量,默认支持9个位置变量 $1,$2,$ ...

  6. 3.1 shell简介、变量、运算符

    小知识: ipcs可以查看系统中创建的ipc进程间通信资源,例如信号量.共享内存等.示例如下: 什么是shell? shell是核心程序kernel之外的指令解析器,是一个程序,同时是一种命令语言和程 ...

  7. Linux shell 脚本中变量的数学计算【转】

    本文转载自:http://blog.csdn.net/qinghezhen/article/details/9194287 首先从一个例子说起: x=1+1 echo $x 你是不是期待着输出2啊?让 ...

  8. shell脚本之变量与状态码

    目录: 前言 如何创建一个脚本 脚本调试 变量相关 变量的命令规则 bash中变量的种类 本地变量 环境变量 只读和位置变量 位置变量 查询变量 进程的退出状态与状态码 前言 在linux管理中,sh ...

  9. Shell脚本中变量和函数变量的作用域

    (1)Shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止.(2)Shell函数定义的变量默认是global的,其作用域从“函数被调用时执行变 ...

  10. shell脚本学习-变量

    跟着RUNOOB网站的教程学习的笔记 shell变量 shell变量的命名 定义变量时,变量名不加美元符号($,PHP语言中需要),如: name="runoob" 注意,变量名与 ...

随机推荐

  1. SAP HTTP调用其他系统接口

    1业务说明 ABAP系统通过HTTP方式调用其他系统发布的接口 2代码实现 2.1认证接口 根据访问的URL创建HTTP客户端 设置访问方式,并调用SEND和接收函数 有时需要专门验证用户名密码 获取 ...

  2. Vular开发手记#1:设计并实现一个拼插式应用程序框架

    可视化编(rxeditor)辑告一段落,在知乎上发了一个问题,询问前景,虽然看好的不多,但是关注度还是有的,目前为止积累了21w流量,因为这个事,开心了好长一段时间.这一个月的时间,主要在设计制作Vu ...

  3. 单向环形链表解决约瑟夫环(Josephus)问题

    一.约瑟夫环问题 Josephu 问题为:设编号为1,2,- n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那 ...

  4. React面试题汇总

    1.如何理解React中的组件间数据传递? ①父-子  通过props传递 ②子-父  在父中创建一个可以修改state的方法,之后把这个方法通过props传递给子,在子中调用这个方法 从而达到修改父 ...

  5. 迟早要知道的JS系列之常用数组方法

    常用数组方法 一.不会改变原始数组的方法: 即访问方法,下面的这些方法绝对不会改变调用它们的对象的值,只会返回一个新的数组或者返回一个其它的期望值. 1. concat() ** 语法:** Java ...

  6. Java中JVM相关面试题-整理

    1.JVM内存模型 •程序计数器:当前线程字所执行节码的行号指示器,用于记录正在执行的虚拟机字节指令地址,线程私有. •Java虚拟机栈:存放基本数据类型,对象的引用,方法出口等,线程私有. •本地方 ...

  7. MySQL 间隙锁

    一.根据案例二:不同索引加锁顺序的问题,模拟重现死锁(详细操作步骤) 1.RR级别下,更新操作默认会加行级锁,行级锁会对索引加锁 2.如果更新语句使用多个索引,行级锁会先锁定普通索引,再锁定聚簇索引 ...

  8. javaWeb普通类获取ApplicationContext

    网上看了很多关于获取ApplicationContext的方法,五大方法,但是我用web服务使用成功的就这一个,自己记忆下. import javax.servlet.ServletContextEv ...

  9. 1.scrapy框架

    Scrapy 是一个基于 Twisted 的异步处理框架.异步就是说调用在发出之后,这个调用就直接返回,不管有没有结果.(非阻塞关注的是程序在等待调用结果(消息.返回值)时的状态,指在不能立刻得到结果 ...

  10. C语言基础知识(二)——二维数组

    二维数组本质 二维数组本质就是一维数组,只不过**形式是二维**,类似矩阵,使用二维数组表示会更加形象. 二维数组实例 float rain[5][12]; //内含5个数组元素的数组,每个数组元素内 ...