一 变量
 
变量:本质上是程序中保存用户数据的一块内存空间,变量名就是内存空间地址。
 
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. 在数据库中生成txt文件到网络驱动器中(计算机直接创建的网络驱动器在sql server中没有被找到)

    环境:sql server 2008 一.创建网络驱动器映射 语法:exec master..xp_cmdshell 'net use Z: \\ip地址\网络路径 密码 /user:用户名' 例如: ...

  2. bzoj 1026: [SCOI2009]windy数【数位dp】

    忘记limit不能记WA了一发-- 典型数位dp,变成work(r)-work(l-1),然后dfs的时候记录w当前位置,la上一个数选的什么,lm当前位是否有上限,ok当前位是否可以不考虑差大于等于 ...

  3. bzoj 2878: [Noi2012]迷失游乐园【树上期望dp+基环树】

    参考:https://blog.csdn.net/shiyukun1998/article/details/44684947 先看对于树的情况 设d[u]为点u向儿子走的期望长度和,du[u]为u点的 ...

  4. bzoj 1660: [Usaco2006 Nov]Bad Hair Day 乱发节【单调栈】

    开一个单调递减的单调栈,然后用sum数组维护每个点的答案,新加点的时候一边退栈一边把退掉的点的sum加进来 #include<iostream> #include<cstdio> ...

  5. Wannafly挑战赛29A御坂美琴

    传送门 这套题很有意思2333 蠢了--首先先判总共加起来等不等于\(n\),不是的话就不行 然后dfs记录\(n\)不断分下去能分成哪些数,用map记录一下,判断是否所有数都能被分出来就是了 //m ...

  6. [USACO09NOV]灯Lights

    题目描述 Bessie and the cows were playing games in the barn, but the power was reset and the lights were ...

  7. linux学习之路4 系统目录架构

    linux树状文件系统结构 bin(binary) 保存可执行文件 也就是保存所有命令 boot 引导目录 保存所有跟系统有关的引导程序 其中Vmlinux文件最为重要,是系统内核 dev 保存所有的 ...

  8. 300 Longest Increasing Subsequence 最长上升子序列

    给出一个无序的整形数组,找到最长上升子序列的长度.例如,给出 [10, 9, 2, 5, 3, 7, 101, 18],最长的上升子序列是 [2, 3, 7, 101],因此它的长度是4.因为可能会有 ...

  9. 本地编译全志R系列的步骤7(Ubuntu 17.04非长期支持版本)

    本地编译全志R系列的步骤7(Ubuntu 17.04非长期支持版本) 2017/6/29 13:49 0.获取全志R系列的Android源码包: 请通过渠道/代理商/方案公司获取全志R系列的Andro ...

  10. Android Studio3.0打包APK的时候 报错:

    Error:Execution failed for task ':app:transformDexWithDexForRelease'.> com.android.build.api.tran ...