Shell学习小结 - 深入认识变量
移动端访问不佳,请访问我的个人博客
变量的命名
对于初学者来说,可以简单的理解为,变量就是保存在计算机内存中的一系列的键值对。
列如:
str="hello"
这里的str就是变量名,而hello就是变量的值
注意在
shell中变量名的大小是敏感的,因此大小写不同的两个变量名并不代表同一个变量
变量的类型
根据变量的类型确实,可以将程序设计语言分为两类,分别是静态类型语言和动态类型语言
- 静态类型语言: 是在编译期间就确定变量类型的语言,例如
JAVA、C++、PASCAL,在这些语言中使用变量时,必须首先声明其类型。 - 动态设计语言: 实在程序执行过程中才确定变量的数据类型的语言。常见的有
VBScript、PHP及Python。在这些语言中,变量的数据类型根据第一次赋给该变量的值的数据类型来确定。
根据变量是否强制要求类型定义,可以将程序设计语言分为强类型语言和弱类型语言
- 强类型语言: 要求用户在定义变量的时候必须明确指定其数据类型,例如
JAVA和C++。在强类型语言中,数据类型之间的转换非常重要。 - 弱类型语言: 不要求用户明确指定变量的数据类型,例如
VBScript。用户可以将任意类型的数值赋给该变量。并且,变量的数据类型之间的转换也无需明确进行。
Shell是一种动态类型语言和弱类型语言
变量的定义
在Shell中。通常情况下用户可以直接使用变量,无需先进行定义,当用户第一次使用某个变量名时,实际上就同时定义了这个变量,在变量的作用域内,用户都可以使用该变量。如下所示:
#定义变量a
a=1
#定义变量b
b="hello"
#定义变量c
c="hello world"
还可以通过declare关键字来定义变量,它可以对变量的读写属性和变量类型进行设置,改命令的基本语法:
declare attribute variable
其中,attribute表示变量的属性,常用的属性如下所诉:
| 变量 | 说明 |
|---|---|
| -p | 显示所有变量的值 |
| -i | 将变量定义为整数。在之后就可以直接对表达式求值,结果只能是整数。如果求值失败或者不是整数,就设置为0 |
| -r | 将变量声明为只读变量。只读变量不允许修改,也不允许删除 |
| -a | 变量声明为数组变量。但这没必要。所有变量都不必显式定义就可以用做数组,事实上,在某种意义上,所有变量都是数组,而且赋值给没有下标的变量与赋值给下标为0的数组元素相同。 |
| -f | 显示所有自定义函数,包括名称和函数体 |
| -x | 将变量设置成环境变量,这样在随后的脚本和程序中可以使用 |
变量与引号
在Shell语言中一共有3种引号,分别为单引号(’ ‘)、双引号(” “)和反引号(“),它们的作用是不同。
- 单引号: 括起来的字符都做为普通字符出现
- 双引号: 除”$”、”\”、”
"和" " "这几个字符仍是特殊符并保留其特殊功能外,其余字符仍然做为普通字符对待 - 反引号: 括起来的字符串被
Shell解释为命令,在执行时,Shell首先执行改命令,并以它的标准输出结果取代整个反引号(包括两个反引号)部分
反引号的用法:
#输出当前目录
echo "current directory is `pwd`"
变量的作用域
Shell跟其他语言一样,作用域分为全局变量和局部变量。
全局变量
通常认为,全局变量是使用范围较大的变量,不局限某个局部使用。如下:
#定义函数
func()
{
#输出变量的值
echo "$v1"
#修改变量的值
v1=200
}
#在脚本中定义变量
v1=100
#调用函数
func
#输出变量的值
echo "$v1"
该执行的结果如下:
100
200
在函数内部定义变量,代码如下:
#定义函数
func()
{
#在函数内部定义变量
v2=200
}
#调用函数
func
#输出变量的值
echo "$v2"
该执行的结果如下:
200
局部变量
与全局变量想比,局部变量的使用范围较小,通常仅限定某个程序段访问,例如函数内部。需要使用local关键字进行定义,另外,函数的参数也是局部变量。如下:
#定义函数
func()
{
#使用local关键字定义局部变量
local v2=200
}
#调用函数
func
#输出变量
echo "$v2"
该执行的结果如下:
#并没有输出任何结果,因为v2是局部变量
从以下代码来比例两种局部变量和全局变量
#定义函数
func()
{
#输出全局变量v1
echo "global variable v1 is $v1"
#定义局部变量v1
local v1=2
#输出局部变量v1
echo "local variable v1 is $v1"
}
#定义全局变量v1
v1=1
#调用函数
func
#输出全局变量v1
echo "global variable v1 is $v1"
该执行的结果如下:
global variable v1 is 1
local variable v1 is 2
global variable v1 is 1
注意Shell变量中的符号”"表示取变量的值。只有在取值的时候才使用,定义和赋值是无需使用符号"”,另外,实际上Shell中变量的原型为var,var为简写,在某些情况下,简写会导致程序执行错误。
系统变量
Shell语言的系统变量主要在对参数判断和命令返回值判断时使用,包括脚本和函数参数,已经脚本和函数的返回值。Shell语言中的系统变量并不多,但是十分有用,特别是在做一些参数检测的时候。一些常用的系统变量:
| 变量 | 说明 |
|---|---|
#n |
n是第一个整数,从1开始,表示参数的位置,例如1表示第1个参数,2表示第2个参数 |
| $# | 命令行参数的个数 |
| $0 | 当前Shell脚本的名称 |
| $? | 前一个命令或者函数的返回状态码 |
| $* | 以”参数1”“参数2”……的形式将所有参数通过一个字符串返回 |
| $@ | 以”参数1”“参数2”……的形式返回每个参数 |
| $$ | 返回本程序的进程ID(PID) |
下面是常用的系统变量的使用方法:
#输出脚本的参数个数
echo "the number of parameters is $#"
#输出上一个命令的退出状态码
echo "the return code of last command is $?"
#输出当前脚本的名称
echo "the script name is $0"
#输出所有的参数
echo "the parameters are $*"
#输出其中的几个参数
echo "\$1=$1;\$2=$2;\$11=${11}"
环境变量
Shell的环境变量是所有Shell程序都可以使用的变量。Shell程序在运行时,都会接收一组变量,这组变量就是环境变量。环境变量会影响到所有脚本的执行结果。如下是一些常用的环境变量:
| 变量 | 说明 |
|---|---|
| PATH | 命令搜索路径,以冒号为分隔符。注意Windows下不同的是,当前目录不在系统路径里 |
| HOME | 用户主目录的路径名,是cd命令的默认参数 |
| COLUMNS | 定义了命令编辑模式下可使用命令行的长度 |
| HISTFILE | 命令历史文件 |
| HISFILESIZE | 命令历史文件中最多可包含的命令条数 |
| IFS | 定义Shell使用的分隔符 |
| LOGNAME | 当前的登录名 |
| SHELL | Shell的全路径名 |
| TERM | 终端类型 |
| TMOUT | Shell自动退出的时刻,单位为秒,若设置为0则禁止Shell自动退出 |
| PWD | 当前工作目录 |
可以使用set命令列出系统所有的环境变量:
set | more
'!'=0
'#'=0
'$'=6491
'*'=( )
-=569JNRXghikls
0=-zsh
'?'=0
@=( )
ARGC=0
Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.A6yPyflyoi/Render
BG
CDPATH=''
COLORFGBG='12;8'
COLUMNS=80
CPUTYPE=x86_64
CURRENT_BG=NONE
EGID=20
EUID=501
FG
FIGNORE=''
FPATH=/Users/wangchonglei/.oh-my-zsh/plugins/git:/Users/wangchonglei/.oh-my-zsh/functions:/Users/wangchonglei/.oh-my-zsh/completions:/usr/local/share/zsh/site-functions:/usr/share/zsh/site-functions:/usr/share/zsh/5.2/functions
FX
使用范例代码:
#输出命令搜索路径
echo "commands path is $PATH"
#输出当前的登录名
echo "current login name is $LOGName"
#输出当前用户的主目录
echo "current user's home is $HOME"
#输出当前的Shell
echo "current shell is $SHELL"
#输出当前的工作目录
echo "current path is $PWD"
最近在学习
Shell,把学习中的一些知识点记录下来,供以后自己复习使用。谢谢大家的阅读,有什么问题欢迎指出~~
Shell学习小结 - 深入认识变量的更多相关文章
- Shell学习(二)——变量和基本数据类型
参考博客: [1]LinuxShell脚本--变量和数据类型 [2]shell只读变量删除 一.变量 定义变量的语法 定义变量时,变量名和变量值之间使用"="分隔,并且等号两边不能 ...
- shell学习小结
小结 本章我么介绍了怎样使用ls与stat露出文件与文件meta数据,还有怎样使用touch设置未见时间戳.touch可显示有关日期时间相关的信息以及在很多现行系统上的范围限制. 说明了怎样以shel ...
- python学习小结7:变量类型
变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整 ...
- Shell学习之环境变量配置文件(三)
Shell学习之环境变量配置文件 目录 环境变量配置文件简介 环境变量配置文件作用 其他配置文件和登录信息 环境变量配置文件简介 环境变量配置文件简介 环境变量配置文件中主要是定义对系统操作环境生效的 ...
- Shell学习之Bash变量详解(二)
Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...
- shell学习笔记(1)-变量
1.shell中的变量可以自定义,shell中使用变量时用$ name="shero"echo "hi ${name}" root@shero-virtual- ...
- Shell学习笔记 - Shell变量
一.变量的命名 变量名必须以字母或下划线开头,由字母.数字.或下划线组成,变量名的长度不能超过255个字符. 二.变量的分类 1. 用户自定义变量 2. 环境变量 3. 位置参数变量 4. 预定义变量 ...
- Shell学习心得(一):变量
1.begin #!/bin/bash echo "Hello World !" #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell. ec ...
- Shell脚本的学习笔记一:变量
三种变量: 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量. 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需 ...
随机推荐
- 解决存储过程中拼接的SQL字符串超长导致sql语句被截取的问题
今天遇到了一个奇葩的问题:存储过程中的sql字符串拼接的太长,超出了分页存储过程执行sql参数的nvarchar(4000)的长度. 没办法,只能修改自己的存储过程,因为分页存储过程是不能动的. 开始 ...
- Apache Kafka源码分析 – Replica and Partition
Replica 对于local replica, 需要记录highWatermarkValue,表示当前已经committed的数据对于remote replica,需要记录logEndOffsetV ...
- Spark 源码分析 -- BlockStore
BlockStore 抽象接口类, 关键get和put都有两个版本序列化, putBytes, getBytes非序列化, putValues, getValues 其中putValues的返回值为P ...
- Git 使用配置
应用情景:使用Git前需要配置 user.name 和 user.email 信息.Git利用这些信息记录谁进行了什么样的操作.Git属于分布式版本管理系统,开发者很多,配置这个就相当于自报家门,告诉 ...
- MySQL优化(一):MySQL分库分表
一.分库分表种类 1.垂直拆分 在考虑数据拆分的时候,一般情况下,应该先考虑垂直拆分.垂直可以理解为分出来的库表结构是互相独立各不相同的. - 如果有多个业务,每个业务直接关联性不大,那么就可以把每个 ...
- 机房断电导致MySQL同步1594错误
1.错误信息 Last_IO_Error: Got fatal error from master when reading data from binary log: ' at 208645951. ...
- .Net Web Api——获取client浏览器信息
第一次接触到web api,发现这个东西是REST风格的:---- 微软的web api是在vs2012上的mvc4项目绑定发行的.它提出的web api是全然基于RESTful标准的,全然不同于之前 ...
- WCF服务对于处理客户端连接的一点思考
对于每个客户端的,服务端是否为每个客户端有专门的“通道”? 目的:想在服务端记录下来客户端的访问记录(进入.各个操作.离开等信息),并将其执行的操作独立记录在各个客户端对应的日志中. 下面是代码: 契 ...
- C++继承模型
在C++继承模型中,一个派生类对象表现出来的东西,是其自己的成员加上其基类成员的总和.但这些成员怎样摆放,标准并未强制规定.一般而言,低地址放基类子对象,高地址放派生类对象. 以下从四个部分讨论C++ ...
- 使用paramiko执行远程linux主机命令
paramiko是python的SSH库,可用来连接远程linux主机,然后执行linux命令或者通过SFTP传输文件. 关于使用paramiko执行远程主机命令可以找到很多参考资料了,本文在此基础上 ...