惠州专业网站建设公司哪里有,淮安建设企业网站,鞍山最新通知,网站开发首选语言文章目录二、变量和引用2.1 什么是变量2.2变量的命名2.3 变量的类型2.3.1 根据数据类型分类2.3.2 根据作用域分类2.4 变量的定义2.5 shell中的引用2.6 变量的运算练习#xff1a;二、变量和引用
在程序设计语言中#xff0c;变量是一个非常重要的概念。也是初学者在进行Shel…
文章目录二、变量和引用2.1 什么是变量2.2变量的命名2.3 变量的类型2.3.1 根据数据类型分类2.3.2 根据作用域分类2.4 变量的定义2.5 shell中的引用2.6 变量的运算练习二、变量和引用
在程序设计语言中变量是一个非常重要的概念。也是初学者在进行Shell程序设计之前必须掌握的一个非常基础的概念。只有理解变量的使用方法才能设计出良好的程序。本节将介绍Shell中变量的相关知识。
2.1 什么是变量
顾名思义变量就是程序设计语言中的一个可以变化的量当然可以变化的是变量的值。几乎所有的程序设计语言中都有定义变量并且其涵义也大同小异。从本质上讲变量就是在程序中保存用户数据的一块内存空间而变量名就是这块内存空间的地址。
在程序的执行过程中保存数据的内存空间的内容可能会不断地发生变化但是代表内存地址的变量名却保持不变。
2.2变量的命名
在Shell中变量名可以由字母、数字或者下划线组成并且只能以字母或者下划线开头。对于变量名的长度Shell并没有做出明确的规定。因此用户可以使用任意长度的字符串来作为变量名。但是为了提高程序的可读性建议用户使用相对较短的字符串作为变量名。
在一个设计良好的程序中变量的命名有着非常大的学问。通常情况下用户应该尽可能选择有明确意义的英文单词作为变量名尽量避免使用拼音或者毫无意义的字符串作为变量名。这样的话用户通过变量名就可以了解该变量的作用。
2.3 变量的类型
2.3.1 根据数据类型分类
Shell是一种动态类型语言和弱类型语言即在Shell中变量的数据类型毋需显示地声明变量的数据类型会根据不同的操作有所变化。准确地讲Shell中的变量是不分数据类型的统一地按照字符串存储。但是根据变量的上下文环境允许程序执行一些不同的操作例如字符串的比较和整数的加减等等。
什么是弱类型语言、强类型语言 强类型和弱类型主要是站在变量类型处理的角度进行分类的。强类型是指不允许隐式变量类型转换弱类型则允许隐式类型转换。 强类型语言当你定义一个变量是某个类型如果不经过代码显式转换强制转化过它就永远都是这个类型如果把它当做其他类型来用就会报错 弱类型语言你想把这个变量当做什么类型来用就当做什么类型来用语言的解析器会自动隐式转换。
比如 C语言定义变量int变量名实则前面的int就是给变量内存划分了等级int定义整型所以空间里只能存放整型这就是强类型。php、C#和Python等都是强类型语言。
可以使用declare定义变量的类型declare attribute variable
注declare命令还可输出所有的变量、函数、整数和已经导出的变量
-p显示所有变量的值-i将变量定义为整数在之后就可以直接对表达式求值结果只能是整数。如果求值失败或者不是整数就设置为0。-r将变量声明为只读变量。只读变量不允许修改也不允许删除。(也可使用readonly定义只读变量)-a变量声明为数组变量。但这没有必要所有变量都不必显示定义就可以用作数组。事实上在某种意义上似乎所有变量都是数组而且赋值给没有下标的变量与赋值给下标为0的数组元素相同。-f显示所有自定义函数包括名称和函数体。-x将变量设置成环境变量。可使用x将变量变成非环境变量2.3.2 根据作用域分类
根据作用域可将变量分为环境变量全局变量和普通变量局部变量 环境变量 环境变量也可称为全局变量可以在创建它们的shell及其派生出来的任意子进程shell中使用su -切换用户会读取新的环境变量环境变量又可分为自定义环境变量和bash内置的环境变量。
1自定义环境变量
一般是指用export内置命令导出的变量用于定义shell的运行环境保证shell命令的正确执行。环境变量可以在命令行中设置和创建但用户退出命令行时这些变量值就会丢失即该环境变量只在当前shell和子shell中有效。如果希望永久保存环境变量可以在配置文件中设置。
①用户的环境变量配置non-login shell
~/.bash_profile或~/.bashrc②全局环境变量的配置login shell
/etc/bashrc、/etc/profile文件或者/etc/profile.d目录中定义。注意按照系统规范所有环境变量的名字均采用大写形式。在将环境变量应用于用户进程程序之前都应该用命令export导出。
有一些环境变量比如HOME,PATH,SHELL,UID,USER等在用户登录前就已经被/bin/login程序设置好了通常环境变量被定义并保存在用户家目录下的.bash_profile文件或全局的配置文件/etc/profile中。
2bash内置的环境变量
shell内置的环境变量是所有的shell程序都可以使用的变量。shell程序在运行时都会接收一组变量来确定登录用户名、命令路径、终端类型、登录目录等这组变量就是环境变量。环境变量会影响到所有的脚本的执行结果。 注可使用env查看环境变量
2、普通变量
普通变量也可称为局部变量与全局变量相比局部变量的使用范围较小通常仅限于某个程序段访问例如函数内部。在Shell语言中可以在函数内部通过local关键字定义局部变量另外函数的参数也是局部变量。
示例全局变量和局部变量的区别
[rootlocalhost ~]# vim 6.sh
#!/bin/bash
#定义函数
func()
{
#输出全局变量v1的值
echo global variable v1 is $v1
#定义局部变量v1
local v12
#输出局部变量v1的值
echo local variable v1 is $v1
}
#定义全局变量v1
v11
#调用函数
func
#输出全局变量v1的值
echo global variable v1 is $v1
[rootlocalhost test]# chmod arx var.sh
[rootlocalhost test]# ./var.sh
global variable v1 is 1
local variable v1 is 2
global variable v1 is 12.4 变量的定义
在Shell中通常情况下用户可以直接使用变量而毋需先进行定义当用户第一次使用某个变量名时实际上就同时定义了这个变量在变量的作用域内用户都可以使用该变量。
1、变量定义示例变量名变量值
#!/bin/bash
#定义变量a
a1
#定义变量b
bhello
#定义变量c
chello world
#定义备份路径
bak_dir/data/backup
#把一个命令的结果赋值变量
变量名ls
变量名$(ls)注意 1“”前后不能有空格
[rootlocalhost ~]# a 3
-bash: 3: 未找到命令
[rootlocalhost ~]# b 4
-bash: b: 未找到命令2字符串类型建议用引号括起来尤其是特殊字符或有空格
stu_namezhang san 引用变量$变量名 或者 ${变量名} 查看变量echo $变量名set可查看所有变量包括自定义变量和环境变量env显示全局变量declare输出所有的变量、函数、整数和已经导出的变量。 取消变量unset 变量名 作用范围仅在当前shell中有效
注可使用export指令将变量转换成环境变量
2、位置参数和预定义变量 许多情况下Shell脚本都需要接收用户的输入根据用户输入的参数来执行不同的操作。从命令行传递给Shell脚本的参数又称为位置参数Shell脚本会根据参数的位置使用不同的位置参数变量读取它们的值。 示例
[rootlocalhost test]# vim param.sh
echo 第1个位置参数是$1
echo 第2个位置参数是$2
echo 所有参数是: $*
echo 所有参数是: $
echo 参数的个数是: $#
echo 当前进程的PID是: $$
[rootlocalhost test]# bash param.sh shuju1 shuju2
第1个位置参数是shuju1
第2个位置参数是shuju2
所有参数是: shuju1 shuju2
所有参数是: shuju1 shuju2
参数的个数是: 2
当前进程的PID是: 23278$?的示例
[rootlocalhost test]# vim ping.sh
#!/bin/bash
ping -c2 $1 /dev/null
if [ $? 0 ];then
echo host $1 is ok
else
echo host $1 is fail
fi
[rootlocalhost test]# chmod arx ping.sh
[rootlocalhost test]# ./ping.sh 192.168.168.128
host 192.168.168.128 is ok$*//这个是类似于数组和 $//类似于个体的区别 示例
[rootlocalhost test]# set -- i have a cat #利用set命令设置位置参数
[rootlocalhost test]# echo $#
3
[rootlocalhost test]# echo $*
i have a cat
[rootlocalhost test]# echo $
i have a cat
[rootlocalhost test]# for i in $*;do echo $i;done
i
have
a
cat
[rootlocalhost test]# for i in $;do echo $i; done
i
have
a
cat
[rootlocalhost test]# for i in $*;do echo $i;done
i have a cat
[rootlocalhost test]# for i in $;do echo $i;done
i have
a
cat
[rootlocalhost test]# shift #使用该指令可将位置参数左移一位
[rootlocalhost test]# echo $1
a
[rootlocalhost test]# shift
[rootlocalhost test]# echo $1
cat2.5 shell中的引用
在bash中有很多特殊字符这些特殊字符就具有特殊含义。引用就是通知shell将这些特殊字符当作普通字符来处理。 说明反引号中的字符串将被解释为shell命令
[rootlocalhost ~]# echo current_user is: $USER
current_user is: root
[rootlocalhost ~]# echo current_user is: $USER
current_user is: $USER
[rootlocalhost ~]# echo current_user is: whoami
current_user is: root
[rootlocalhost ~]# echo current_user is: whoami
current_user is: whoami2.6 变量的运算
与其他的程序设计语言一样shell也有很多运算符。 示例
[rootlocalhost ~]# r$((25*8))
[rootlocalhost ~]# echo $r
42
[rootlocalhost ~]# let r32
[rootlocalhost ~]# echo $r
5
[rootlocalhost ~]# rexpr 42
[rootlocalhost ~]# echo $r
42
[rootlocalhost ~]# rexpr 4 2
[rootlocalhost ~]# echo $r
6
#使用expr计算字符的长度
[rootlocalhost test4]# chari have a
[rootlocalhost test4]# expr length $char
8
[rootlocalhost ~]# r$[32]
[rootlocalhost ~]# echo $r
5
[rootlocalhost ~]# awk BEGIN {print 23*2}
8
[rootlocalhost test4]# echo 6.282 3.14 | awk {print ($1-$2)}
3.142
[rootlocalhost ~]# declare -i r32
[rootlocalhost ~]# echo $r
5实验计算用户输入的任意两个整数的和、差、乘积、商、余数。 方法一
[rootlocalhost test4]# cat 1.sh
#!/bin/bash
a$1
b$2
echo ab$(($a$b))
echo a-b$((a-b))
echo a*b$((a*b))
echo a/b$((a/b))
echo a%b$((a%b))
[rootlocalhost test4]# ./1.sh 10 3
ab13
a-b7
a*b30
a/b3
a%b1方法二
[rootlocalhost test4]# cat 1.1.sh
#!/bin/bash
read -p please input two number: a b
echo $a$b$(($a$b))
echo $a-$b$((a-b))
echo $a*$b$((a*b))
echo $a/$b$((a/b))
echo $a%$b$((a%b))
[rootlocalhost test4]# ./1.1.sh
please input two number:3 4
347
3-4-1
3*412
3/40
3%43示例截取字符串
[rootlocalhost ~]# str1hello world
#返回变量长度
[rootlocalhost ~]# echo ${#str1}
11
#变量截取
#指定起始位置一直到结束
[rootlocalhost ~]# echo ${str1:1}
ello world
#指定长度不指定起始位置默认从开头开始
[rootlocalhost ~]# echo ${str1::3}
hel
#指定起始位置和长度
[rootlocalhost ~]# echo ${str1:1:3}
ell
#从右边第几个字符开始及字符的个数
[rootlocalhost ~]# echo ${str1:0-1:1}
d
#输出右边的几个字符
[rootlocalhost ~]# echo ${str1:0-5}
world
[rootlocalhost ~]# echo ${str1: -5}
world
#提取完整字符串
[rootlocalhost ~]# echo ${str1:-5}
hello world示例删除字符串
#获取后缀名tar.gz
[rootlocalhost ~]# filenametestfile.tar.gz
[rootlocalhost ~]# file${filename#*.}
[rootlocalhost ~]# echo $file
tar.gz
#获取后缀名.gz
[rootlocalhost ~]# filenametestfile.tar.gz
[rootlocalhost ~]# file${filename##*.}
[rootlocalhost ~]# echo $file
gz
#截取testfile.tar
[rootlocalhost ~]# filenametestfile.tar.gz
[rootlocalhost ~]# file${filename%.*}
[rootlocalhost ~]# echo $file
testfile.tar
#截取testfile
[rootlocalhost ~]# filenametestfile.tar.gz
[rootlocalhost ~]# file${filename%%.*}
[rootlocalhost ~]# echo $file
testfile练习
1.定义两个变量num110和num22
使用(()): 计算num1 num2的值并输出
[rootshell 0130]# num110
[rootshell 0130]# num22
[rootshell 0130]# echo $((num1num2))
12使用let: 计算num1 * num2的值输出
[rootshell 0130]# num110
[rootshell 0130]# num22
[rootshell 0130]# let numnum1*num2
[rootshell 0130]# echo $num
20使用expr: 计算num1 对 num2执行或的位运算
[rootshell 0130]# num110
[rootshell 0130]# num22
[rootshell 0130]# expr $num1 | $num2
100000 0010
| 0000 10100000 101010使用$[]: 计算 num2的num1次方值
[rootshell 0130]# num110
[rootshell 0130]# num22
[rootshell 0130]# num3num1num2
[rootshell 0130]# echo $[num3]
12使用declare: 计算 num1 除以 num2的值
[rootshell 0130]# num110
[rootshell 0130]# num22
[rootshell 0130]# declare -i num3num1/num2
[rootshell 0130]# echo $num3
5使用计算num2除num1的值 • 方法一使用declare计算
[rootshell 0130]# num110
[rootshell 0130]# num22
[rootshell 0130]# declare -i num3num2/num1
[rootshell 0130]# echo $num30• 方法二$[]
[rootshell 0130]# num110
[rootshell 0130]# num22
[rootshell 0130]# num3num2/num1
[rootshell 0130]# echo $[num3]或者
[rootshell 0130]# echo $[num3num2/num1]
0• 方法三expr
[rootshell 0130]# num110
[rootshell 0130]# num22
[rootshell 0130]# expr $num2 / $num10• 方法四let
[rootshell 0130]# num110
[rootshell 0130]# num22
[rootshell 0130]# let numnum2/num1
[rootshell 0130]# echo $num0path/data/data1/data2.txt • 去获取它所在的目录 ○ 方法一使用偏移量提取长度为length的代码片 [rootshell 0130]]# path/data/data1/data2.txt
[rootshell 0130]# echo ${path:0:11}
/data/data1○ 方法二从$开头开始删除最长匹配Word子串从右到左 [rootshell 0130]# path/data/data1/data2.txt[rootshell 0130]# echo ${path%/data2.txt}/data/data1○ 方法三从$结尾开始删除最长匹配Word子串从右到左
[rootshell 0130]# path/data/data1/data2.txt
[rootshell 0130]# echo ${path%%/data2.txt}/data/data1• 去获取文件的名字 ○ 方法一偏移量
[rootshell 0130]# path/data/data1/data2.txt
[rootshell 0130]# echo ${path:12}
data2.txt○ 方法二从$开头开始删除最短匹配Word子串从左到右
[rootshell 0130]# path/data/data1/data2.txt
[rootshell 0130]# echo ${path#/data/data1/}
data2.txt○ 方法三从$结尾删除最短匹配Word子串从左到右
[rootshell 0130]# path/data/data1/data2.txt
[rootshell 0130]# echo ${path##/data/data1/}
data2.txt设置一个只针对root的环境变量ENV_ROOTROOT • 因为是root用户环境变量配置所以需要进入profile配置目录[rootshell 0130]# vim ~/.bash_profile
[rootshell 0130]# vim ~/.bash_profile
[rootshell 0130]# source ~/.bash_profile
[rootshell 0130]# echo $ENV_ALL
ROOT设置一个针对所有用户的环境变量: ENV_ALLALL [rootshell 0130]# vim /etc/profile
[rootshell 0130]# echo $ENV_ALL
ALL在root用户下访问ENV_ROOT和ENV_ALL
[rootshell 0130]# echo $ENV_ROOT ROOT
[rootshell 0130]# echo $ENV_ALL ALL在普通用户下访问ENV_ROOT和ENV_ALL
[rootshell 0130]$ echo $ENV_ALL ALLROOT用户不能访问输出结果为空白的行