一 变量
 
变量:本质上是程序中保存用户数据的一块内存空间,变量名就是内存空间地址。
 
Shell中:变量可由字母数字和下划线组成,以字母或下划线开头。
 
命名:PATH=/sbin
 
     JAVA_HOME=”/usr/lib”
 
(变量名区分大小写)
 
在shell中,变量的数据类型无需显式声明,变量的数据类型会根据不同操作有所变化。
 
(shell变量部分数据类型,统一按字符串存储,但根据变量的上下文环境,允许程序执行一些不同操作)。为了能执行加减法计算,shell为自动进行数据类型的转换,如果遇到含义非数字的字符串,则该字符串被转换成整数0。同时,在空串以及没有定义变量的情况下,变量值都会被转换为整数0。
 
例如,n=“” echo “n=$n”
 
     echo “p=$p”
 
 
 
1.1变量的定义:
 
Shell中可以直接使用变量,无需定义,如果变量的值包含空格,一定要用引号引起来。
 
declare attribute variable(控制变量相关属性)
 
attribute 表示变量属性,variable表示名称,属性有:
 
-p:显示所有变量值
 
-i:定义为整数
 
-r:定义为只读变量
 
-a:定义为数组变量
 
-f:显示所有自定义函数,包括名称和函数体
 
-x:变量设置成环境变量,随后的脚本和程序可以使用
 
例子:
 
x=6/3
 
echo "$x"                            //6/3
 
#定义变量x为整数
 
declare -i x
 
echo "$x"                          //6/3,因为shell中所有数据都当做字符串存储
 
#将算术式赋给变量x
 
x=6/3
 
echo "$x"                         //2,变量声明为整数后,可以进行算术运算
 
#将字符串赋给变量x
 
x=hello
 
echo "$x"
 
#将浮点数赋给变量x
 
x=3.14
 
echo "$x"                          //报错,bash不支持浮点数
 
#取消变量x的整数属性
 
declare +i x
 
#重新将算术式赋给变量x
 
x=6/3
 
echo "$x"
 
#求表达式的值
 
x=$[6/3]
 
echo "$x"                              //2,得到算术值得两种方法,方括号
 
#求表达式的值
 
x=$((6/3))                             //2,得到算术值得两种方法,圆括号
 
 
1.2 引号
 
单引号(‘’):括起来的字符作为普通字符
 
双引号(“”):括起来的字符,除    “$”, “\”,  “`”和“``”保留其特殊功能外,其余仍作为普通字符
 
反引号(``):括起来的字串被解释为命令,shell首先执行该命令,并以他的标准输出结果取代整个反引号部分
 
#! /bin/bash
 
#输出当前目录
 
echo "current directory is `pwd`"
 
结果:currentdirectory is /root/chapter3
 
(先执行`pwd`,结果/root/chapter3取代`pwd`)
 
 
1.3 变量的作用域:
 
全局变量:shell中,全局变量可在脚本中定义,也可在某个函数中定义。脚本中定义的变量都为全局变量,作用域为被定义的地方开始,指定shell脚本结束或显示删除。
 
例:
 
#! /bin/bash
 
#定义函数
 
func()
 
{
 
   #输出变量x的值
 
  echo "$v1" //100
 
   #修改变量x的值
 
  v1=200
 
}
 
#在脚本中定义变量x
 
v1=100
 
#调用函数
 
func
 
#输出变量x的值
 
echo "$v1"  //200
 
局部变量:通常仅限某个程序段访问,如函数内部。Shell中可在函数内部通过local关键字定义局部变量,另外函数的参数也是局部变量。
 
例:
 
#! /bin/bash
 
#定义函数
 
func()
 
{
 
   #使用local关键字定义局部变量
 
  local v2=200
 
}
 
#调用函数
 
func
 
#输出变量的值
 
echo "$v2"    // 空值,函数外面不能获得该变量的值
 
注意:全局变量与局部变量同名时,函数内部的局部变量优先被使用。无论在何处,赋值语句都会影响全局变量的值,全局变量的值改变后,最整个脚本都有效,默认情况下,函数内部定义的变量也是全局变量,除非用local声明
 
 
1.4 系统变量:
 
Shell的系统变量主要对参数判断和命令返回值判断时的使用,包括脚本和函数的参数,以及脚本和函数的返回值。常用系统变量:
 
$n:表示传递给脚本的第n个参数,如$1表示第一个参数
 
$#:命令行参数的个数
 
$0:当前脚本名称
 
$*:以“参数1参数2….”形式返回所有参数的值
 
$@:以“参数1”“参数2”形式返回所有参数的值
 
$_:保存之前执行的命令的最后一个参数
 
例子:
 
#! /bin/bash
 
#输出脚本的参数个数
 
echo "thenumber of parameters is $#"
 
#输出上一个命令的退出状态码
 
echo "thereturn code of last command is $?"
 
#输出当前脚本名称
 
echo "thescript name is $0"
 
#输出所有的参数
 
echo "theparameters are $*"
 
#输出其中的几个参数
 
echo"\$1=$1;\$2=$2;\$11=$11"
 
1.5 环境变量:
 
 
Shell环境变量是所有shell程序都可以使用的变量。(全部大写)
 
PATH:命令搜索路径,以冒号为分隔符,当前目录不在系统路径里
 
HOME:用户主目录的路径名,cd命令的默认参数
 
COLUMNS:命令编辑模式下可使用命令行长度
 
HISTSIZE:命令历史文件中最多可包含的命令条数
 
HISTFILE:命令历史文件
 
HISTFILESIZE:命令历史文件中包含的最大行数
 
IFS:shell使用的分隔符
 
LOGNAME:当前的登入名
 
SHELL:Shell的全路径名
 
TERM:终端类型
 
TMOUT:shell自动退出时间,单位秒,为0则禁止shell自动退出
 
PWD:当前工作目录
 
可以使用set命令列出所有环节变量,set| more
 
例子:
 
#! /bin/bash
 
#输出命令搜索路径
 
echo"commands path is $PATH"
 
#输出当前的登录名
 
echo "currentlogin name is $LOGNAME"
 
#输出当前用户的主目录
 
echo "currentuser's home is $HOME"
 
#输出当前的Shell
 
echo "currentshell is $SHELL"
 
#输出当前工作目录
 
echo "currentpath is $PWD"
 
1.6 变量赋值和清空:
 
 
Shell中所有普通变量值都看作字符串,如果赋值包含空格,制表符和换行符,要用单引号或双引号括起来,一个没有初始化的shell变量被认为是一个空字符串。
 
1.7 清除变量:
 
 
 
 
变量被清除后,代表的值也会消失。消除变量用unset语句
 
 
 
unsetvariable_name
 
二 引用
 
2.1引用变量的值:
 
 
可通过在变量面前加$来获取变量的值。
 
为了能使shell正确的界定变量名,可以在引用变量时使用大括号将变量括起来
 
如:
 
v4=123
 
echo “${v4}abc”
 
结果:123abc
 
(若直接echo “$v4abc”,会变成空字符串,因为v4abc没有被定义)
 
2.2引用和替换:
 
 
引用:字符串用引用符合包括起来,防止特殊字符被shell解释成其他含义
 
常用引用符号:
 
双引号:除$,’’,``,\之外,其他所有字符保持字面意义
 
单引号:所有字符保持字面意义
 
反引号:反引号中的字符串被解释为shell命令
 
反斜线:转义字符,屏蔽后的字符的特殊意义
 
2.3全引用:
 
 
单引号引用的方式。
 
#! /bin/bash
 
#定义变量v1
 
v1="chunxiao"
 
#输出含有变量名的字符串
 
echo 'Hello, $v1'  //全引用保持字面意义
 
结果:Hello ,$v1
 
2.4 部分引用:
 
 
双引号引用方式
 
2.5 命令替换:
 
 
将某个shell命令的执行结果赋给某个变量。
 
两种方式:
 
反引号:`shell_command`
 
圆括号:$(shell_command)
 
2.6转义:
 
 
转换某些特殊字符的意义,\表示。屏蔽反斜线后面字符的特殊意义
 
如:
 
Echo $SHELL
 
结果:/bin/bash
 
Echo \$SHELL
 
结果:$SHELL
 

2.8 补充:shell变量引用方式的更多相关文章

  1. MyBatis mapper文件中的变量引用方式#{}与${}的差别

    MyBatis mapper文件中的变量引用方式#{}与${}的差别 #{},和 ${}传参的区别如下:使用#传入参数是,sql语句解析是会加上"",当成字符串来解析,这样相比于$ ...

  2. ][mybatis]MyBatis mapper文件中的变量引用方式#{}与${}的差别

    转自https://blog.csdn.net/szwangdf/article/details/26714603 MyBatis mapper文件中的变量引用方式#{}与${}的差别 默认情况下,使 ...

  3. Shell 变量引用实例

    初学 Shell 编程时,对变量各种引用使用不太熟悉,走了很多弯路,本文记录变量引用的一些用法,希望对大家有所帮助. 引用 引用指将字符串用引用符号引起来,以防止特殊字符被 shell 脚本解释为其他 ...

  4. SHELL 变量引用

    shell变量的引用非常重要,运用技巧灵活多变 变量的引用主要包含四类:双引号引用.单引号引用.反引号引用.反斜线引用 " " 双引号 屏蔽除美元符号$.反引号( ` )和反斜线( ...

  5. springboot 配置文件中属性变量引用方式@@解析

    这种属性应用方式是field_name=@field_value@. 两个@符号是springboot为替代${}属性占位符产生,原因是${}会被maven处理,所以应该是起不到引用变量的作用. @@ ...

  6. [转载]MyBatis mapper文件中的变量引用方式#{}与${}的差别

    转载自:http://blog.csdn.net/szwangdf/article/details/26714603 默认情况下,使用#{}语法,MyBatis会产生PreparedStatement ...

  7. shell变量引用

    var="www.sina.com.cn" echo ${var#*.} #sina.com.cn 从前向后删 echo ${var##*.} #.cn 贪婪模式从前向后删 ech ...

  8. Ansible系列(六):各种变量定义方式和变量引用

    本文目录:1.1 ansible facts1.2 变量引用json数据的方式 1.2.1 引用json字典数据的方式 1.2.2 引用json数组数据的方式 1.2.3 引用facts数据1.3 设 ...

  9. Ansible系列(五):各种变量定义方式和变量引用

    Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1.1 ansible facts facts组件是用来收集被管理节点信息的 ...

随机推荐

  1. ci完整集成

    http://www.cnblogs.com/zhanchenjin/p/5032218.html http://blog.csdn.net/williamwanglei/article/detail ...

  2. ubuntu16.04 查看系统可用内存

    free -m 查看内存情况    (单位MB) mem 行显示了从系统角度看来内存使用的情况, total是系统可用的内存大小, 数量上等于系统物理内存减去内核保留的内存. buffers和cach ...

  3. E20170616-hm

     transaction   n. 交易,业务,事务; 办理,处理; (一笔) 交易,(一项)事务; (学会等的) 会议记录,学报;  isolation   n. 隔离; 孤独; 隔离状态; 孤立状 ...

  4. bzoj 1643: [Usaco2007 Oct]Bessie's Secret Pasture 贝茜的秘密草坪【枚举】

    4维枚举平方小于10000的数,相加等于n则ans++ #include<iostream> #include<cstdio> using namespace std; con ...

  5. deepin 安装 idea

    1.su root 2.sudo apt install idea 3.sudo vi /etc/hosts 最后一行添加 0.0.0.0 account.jetbrains.com 4.注册码 N7 ...

  6. java 键盘输入多种方法

    转! 分类: java学习2012-11-04 09:58 8427人阅读 评论(1) 收藏 举报 一.java不像C中拥有scanf这样功能强大的函数,大多是通过定义输入输出流对象.常用的类有Buf ...

  7. 重新学习Java——Java基本的程序设计结构(二)

    上一节简单回顾了Java基本的一些程序设计的知识,这一节将继续根据<Java核心技术>这本书,进行这方面知识的复习与探索. 1. 字符串 Java字符串实际上就是Unicode字符序列.例 ...

  8. 关于加减和es6

    console.log(1+ "2"+"2");   //对于加法来说,如果只有一个操作数是字符串,则将另一个操作数也转换为字符串,然后将两者拼接,为122 c ...

  9. python学习小结-字典key,val互换

    第一种,使用压缩器: >>> m = {'a': 1, 'b': 2, 'c': 3, 'd': 4} >>> zip(m.values(), m.keys()) ...

  10. (转) 淘淘商城系列——redis-desktop-manager的使用

    http://blog.csdn.net/yerenyuan_pku/article/details/72849791 实际工作环境中,redis会安装在服务器上,我们想使用redis服务就要使用re ...