栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Shell编程学习(二)变量、运算

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Shell编程学习(二)变量、运算

shell中变量的分类

第一种分类方式

  • 系统变量:比如$JAVA_HOME
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $JAVA_HOME
/home/dongmu/jdk1.8.0_121
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $USER
root
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $SHELL
/bin/bash
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $PWD
/home/dongmu/shellStudy

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# printenv USER
root
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# printenv JAVA_HOME
/home/dongmu/jdk1.8.0_121
  • 用户变量

第二种分类方式

  • 全局变量:父bash进程种的变量可以被子bash进程访问你到。
  • 局部变量:如果父进程种定义的是局部变量,则这个父bash里面的子bash无法访问这个变量。
自定义变量
  • 变量名=变量值(等号前后不能有空格,等号前面有空格就会当成命令到bin或者sbin下面去找,如果我们变量值里面有空格怎么办?就直接带上引号就行了)
  • 撤销变量:unset 变量名
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=21
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo a
a
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $a
21
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# unset a
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $a

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# 

  • 只读变量的赋值readonly 变量名=变量值,只读变量不能unset。也不能进行修改。
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# readonly b=12
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $b
12
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# unset b
-bash: unset: b: cannot unset: readonly variable
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# b=13
-bash: b: readonly variable

这种定义变量的方式是全局变量还是局部变量呢?

实验一:

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# my_var= "hello word!"
-bash: hello word!: command not found
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# my_var="hello word!"

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $my_var
hello word!

env 是查看全局变量
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# env | grep my_var

set 是查看所有的变量
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# set | grep my_var
my_var='hello word!'

所以可以发现这种定义变量的方式是局部变量

实验二:我们直接启动一个子bash看能不能访问这个变量不就得了

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# bash
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $my_var

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# exit
exit
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $my_var
hello word!

这里依然能够得到结论这是一个局部变量。

如何把他变成一个全局变量呢?

使用export命令即可。

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# export my_var
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# bash
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $my_var
hello word!

这里要注意一个问题,就是我们如果在子bash里面把变量的值改了,在子bash里面访问是更改之后的值,但是在父bash里面还是原来的值,我们即使在子bash里面进行export也不能进行全局的更改。但是会影响到这个子bash的子bash里面的值。

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $my_var
hello word!
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# bash
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $my_var
hello word!
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# export my_var="hello Donmu"
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# bash
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $my_var
hello Donmu

Shell中环境变量的问题

加入我们写了一个脚本hello.sh
我们直接执行hello.sh是会报错的。

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# hello.sh
-bash: hello.sh: command not found
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat hello.sh 
#!/bin/bash
echo "hello world!"

我们怎么把它变成一个命令呢?
直接把这个文件拷贝到/bin目录下即可,但是/bin目录下一般是一些系统配置的命令,我们一般不这样做,那怎么办呢?

  • 把我们这个文件的存放目录配置到PATH系统变量里面去就行了。这里就不演示了。
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/dongmu/jdk1.8.0_121/bin:/home/dongmu/jdk1.8.0_121/jre/bin:/root/bin
Shell中的特殊变量

$n

如果我们想在执行shell脚本的时候,携带参数进行执行。
$1~$9表示第1-9个参数,在往上就用${12}

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat hello.sh 
#!/bin/bash
echo "hello world!"
echo $1
echo $2
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# sh hello.sh dongmu beihai 
hello world!
dongmu
beihai

注意:如果我们脚本里

echo "$n" 这个n会被当成变量来解析
echo '$n' 这个n就会原封不动地输出

验证:

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat hello.sh 
#!/bin/bash
echo "hello world!"
echo "$n"
echo '$n'
echo $1
echo $2
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . hello.sh dongmu beihai
hello world!

$n
dongmu
beihai

这里由于我没有定义这个n变量所以第二行是空的。

$n:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及 加强脚本的健壮性。

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim hello.sh 
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat hello.sh 
#!/bin/bash
echo "hello world!"
echo "$n"
echo '$n'
echo $1
echo $2

echo "输入参数的个数是$#"
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . hello.sh dongmu beihai yuweimian
hello world!

$n
dongmu
beihai
输入参数的个数是3

$*和$@:获取所有的输入参数

  • 区别: $*是把所有的参数当成一个整体,$@是把参数分开处理。
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim hello.sh 
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat hello.sh 
#!/bin/bash
echo "hello world!"
echo "$n"
echo '$n'
echo $1
echo $2

echo "输入参数的个数是$#"

echo $*

echo $@
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . he
-bash: he: No such file or directory
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . hello.sh dongmu beihai yuweimian 
hello world!

$n
dongmu
beihai
输入参数的个数是3
dongmu beihai yuweimian
dongmu beihai yuweimian

$?:获取最后一次命令的执行结果

如果但会的是0表示上一次命令执行成功,不为0表示失败。

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $?
0
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# .s
-bash: .s: command not found
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $?
127
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ls
hello.sh  test  third.sh
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $?
0
Sehll中变量的运算

使用expr 进行运算

expr a + b:要注意加号两边要有空格,不然就会被当成字符串

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr 1 + 2
3
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr 1 + 2 + 5
8
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr 1 + 2 + 5 - 3
5
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr 1 + 2 + 5 - 3 - 12
-7
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr 5 * 2
10

对于乘法要用对*进行转义,因为linux里面*已经有了特殊的含义。

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr 5 * 2
10
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr 5 - 5 * 2 + 5
0

上面这种运算很麻烦,所以linux提供了下面的这种方式

使用$[]或者$(())

如果我们直接运算就会把他当成字符串
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=1+5
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $a
1+5

使用$[]或者$(())
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=$[1+5]
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo a
a
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $a
6
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=$((4+5))
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $a
9
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr $[5*6/3*5]
50
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $[2-3*6/4*8]
-30

如果我们想把表达式的值直接赋值给一个变量,怎么办?
使用$()或者``

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=expr 1 + 3
-bash: 1: command not found
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=`expr 1 + 2`
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=$(expr 1 + 2)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/826508.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号