变量的内容

1、变量命名:

           1、只能包含字母、数字和下划线,并且不能以数字开头,
    2、不应该跟系统中已有的环境变量重名
    3、最好能见名知意

2、变量赋值:

设置变量:
变量名称=值

fld_name=value 等号两边不能有空格

注意:用echo 显示变量名的值时,需要用$符号。

针对数字,你可以可以这样为变量赋值,定义一个变量的类型:

3、变量类型:

环境变量:
    本地变量(局部变量):
    位置变量:
    特殊变量(系统变量):

本地变量:作用域为整个bash进程
    varname=value
局部变量:作用域只对当前代码段有效
    local varname=value

环境变量:作用域为当前shell进程及其子进程
    export varname=value "导出“

任意脚本在执行时会启动一个子shell进程,
        命令行中启动的脚本会继承当前shell的环境变量
        系统自动执行的脚本(跟命令行无关)就需要自我定义需要的各环境变量
位置变量:
    $1,$2,....

特殊变量:保持某些特殊数据
        $? 上一个命令执行状态返回值
        $# 参数的个数
        $* 参数列表
        $@ 参数列表
        $0  命令本身  脚本本身

执行脚本时的脚本路径及名称

程序执行一般有两类返回值  
    程序执行结果;
    执行状态返回代码(0-255)
            0表示正确
            1-255:错误执行 1,2,127 系统预留 有特殊意义

4、变量取消:

unset   varname

撤销fld_name域的值

查看当前shell中的变量

set  不带任何参数和选项

如果查看当前shell中的环境变量
        env
        export
        printenv
字符串变量添加新的变量
 PATH添加新的路径
export PATH=$PATH:/usr/local/apsch/bin

5、取得变量值:

$变量名称
${变量名称}  $(x) 这个可以用来当做命令调用

如果变量在语句当中被引用,必须要使用${x}才可以,取得数组的变量值时候也需要使用${}来调用

关于变量和引号的关系:

单引号:所见即所得
    双引号:使特殊符号生效

6、调整变量的属性:

1、readonly 命令 :定义只读变量
        -p:显示目前具有只读属性的变量列表
        -f:设定函数不可修改
        -a:定义数组不可修改

count环境变量readonly之前可以修改,之后变成只读变量,不可以在修改。

readonly  -p 读取只读变量,显示在终端。

2、declare 命令

-r:设定只读变量
        -p:显示变量的属性
        -a:变量是一个数组
        -f:搜寻命令时,只找函数
        -i:变量是一个整数
        -F:显示所有的函数式名称及其属性
        -t:设立变量具有trace属性
        -x:设定环境变量

7、数组:

是一种数据结构,有相关的数据项组成,每个数据项,称为数组的元素,且可采用索引的方式取得个元素的值
数组赋值:

1、单个赋值,以index作为索引号,索引号从0开始

# 为数组赋值

#显示数组中所有值方法一

$echo  ${a[*]}

#显示数组中所有值方法二

$echo  ${a[@]}

#为数组添加数据项

2、使用小括号为数组赋值

    a=(1000 2000 3000) 默认空格隔开

#为数组b赋值  记住是小括号,不是大括号

#打印出第一个和第4个数据项

3、为数组中的某一个数据项赋值,默认是从0开始,如果中间出现未比标示的索引项,则从前一个索引项开始计算

a={51 [3]=5  cto  [6]=8}

#为数组赋值  #打印出数组中所有值

#验证中间出现的数值是从哪个索引项开始算起的

数组d[7]测试:

显示赋值:

echo ${a[1]}
取出数组中所有的值:
    echo ${a[@]}  或者echo ${a[*]}
取得数组元素的个数:
    echo ${#a[@]} 或者 echo ${#a[*]}

数组元素及个数:

 8.高级变量

${变量名称}  变量扩展
$(命令)      命令替换
$((算术式))  算术扩展

$(命令) 命令替换:
 测试变量存在与否:
    ${countor:-'num'} 判断条件,如果countor存在,就返回值,如果countor不存在,就把-后接的字符串当做整个变量扩展的结果,并传回

测试变量不存在或为空,传回一个默认值

${myname:-'nick'} 如果待测变量不存在或为空,传回-后的值,存在则传回变量的值

赋值给变量chen:

测试变量不存在或为空,给变量设定一个默认值
    ${count:=100} 若变量coutn没有值或为空,则把待测变量设定为默认值,

测试变量不存在或为空,传回错误信息
    ${myname:?"your input error"}

测试变量的存在性:
    ${myname:+Ture} 若变量存在且值非空,则符合判断

:  空              测空置
    -   负向                 测不存在
    +   正向                 测存在
    ?  有问题            检查是否完备后再来执行吧
    =   设值                 给控值变量设定一个默认值

$(命令) 命令替换  此命令等同于·· (esc下的按键,不是单引号)这个在编写脚本的时候很有用

$((算术式))算术扩展:

----借鉴:

字符串切片是从0开始的 在使用${}的时候 大括号内的变量引用前面的$可以不写
        ${变量:位置起点}   ${myname:3}
        ${变量:位置起点:长度}

1
2
3
4
5
6
7
8
#定义变量
[root@lovelace 51cto]# myname=lovelace
#取得变量字符串从第三个字符开始到字符串结尾的所有字符
[root@lovelace 51cto]# echo ${myname:3}
elace
#取得变量字符串中从第四个字符开始,长度为2的字符
[root@lovelace 51cto]# echo ${myname:4:2}
la

取部分参数:
        命令行参数是从$1开始的依次类推,$@代表所有参数,命令本身使用$0来表示
        ${@:起点}:由点开始,取得后面的所有的位置参数
        ${@:起点:个数}:由起点开始,取得指定个数的位置参数
示例脚本

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
#Verson:0.1
#Auther:lovelace
#Pragram:test argument
#取得程序名
echo $0
#取得变量的所有值
echo ${@:1}
#取得变量的个数
echo $#

执行结果:

1
2
3
4
[root@lovelace 51cto]# ./argument.sh 12 32 45
./argument.sh
12 32 45
3

计算字符串长度:
    ${#变量名称}:传回变量值的字符串长度
    expr:也可以统计字符串的长度
        1、str="here you are."
           len$(expr length "$str")
           echo "str 字符串长度是:$len"
        2、expr "字符串“:‘。*’
            str="here you are."
            len=$(expr "$str":'.*')
            echo "str字符串长度是:$len"

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@lovelace 51cto]# echo $myname
lovelace
#使用${#变量名}取得字符串长度  比较常用
[root@lovelace 51cto]# echo ${#myname}
8
#使用${expr length “$变量名”}取得字符串长度
[root@lovelace 51cto]# len=$(expr length "$myname")
[root@lovelace 51cto]# echo $len
8
#使用${expr “$变量名” : '.*'}取得字符串长度
[root@lovelace 51cto]# len=$(expr "$myname" : '.*')
[root@lovelace 51cto]# echo $len
8

变量扩展:对比样式
    由字符串前面对比,删除最短的
         ${变量#样式}
    由字符串前面对比,删除最长的
         ${变量##样式}

1
2
3
4
5
6
7
8
9
10
11
#定义一个变量
[root@lovelace 51cto]# path=$(pwd)
#查看变量值
[root@lovelace 51cto]# echo $path
/home/scripts/51cto
#使用对比样式
[root@lovelace 51cto]# echo ${path#*/}
home/scripts/51cto
#此对比样式可以取得目录名
[root@lovelace 51cto]# echo ${path##/*/}
51cto

由字符串后面对比,删除最短的
         ${变量%样式}
    由字符串后面对比,删除最长的
          ${变量%%样式}

1
2
3
4
5
#使用此对比样式可以取得路径名
[root@lovelace 51cto]# echo ${path%/*}
/home/scripts
#使用此对比样式没有任何数据输出
[root@lovelace 51cto]# echo ${path%%/*}

至于对比样式可以根据自己的思考来获得,这个没有固定的格式

取代或删除部分字符串:
    只替换第一个对比符合的字符串
        ${变量/样式/替换字符串}
    替换所有符合的字符串
        ${变量//样式/替换字符串}

1
2
3
4
5
6
7
8
9
#定义一个变量
[root@lovelace 51cto]# echo $myname
lovelace
#替换第一次出现的l为F
[root@lovelace 51cto]# echo ${myname/l/F}
Fovelace
#替换字符串中所有l为F
[root@lovelace 51cto]# echo ${myname//l/F}
FoveFace

删除对比符合的字符串
    只删一个
        ${变量/样式/}
    删除全部
        ${变量//样式/}
    #T  行首位置
    %LE  最后面

1
2
3
4
5
6
7
8
9
#定义一个变量获取IP地址相关的信息
[root@lovelace 51cto]# tmp=$(ifconfig eth0 | grep 'inet addr')
#删除对比样式成功的字符串 然后赋值给变量r
[root@lovelace 51cto]# r=${tmp/inet addr:/}
#删除对比样式成功的字符串 然后赋值给变量ip
[root@lovelace 51cto]# ip=${r/ Bcast*/}
#打印出变量ip 查看是不是我们想要的结果
[root@lovelace 51cto]# echo $ip
192.168.2.54

变量扩展:取变量名称列表、数组索引列表
取变量名称列表:
        ${!开头字符串@}或${!开头字符串*}

1
2
3
4
5
[root@lovelace 51cto]# myname=lovelace;mytest=51cto
[root@lovelace 51cto]# echo ${!my@}
myname mytest
[root@lovelace 51cto]# echo ${!my*}
myname mytest

取数组索引列表:
        ${!数组变量[@]}或${!数组变量[*]}

1
2
3
4
5
6
#取得数组a的所有值
[root@lovelace 51cto]# echo ${a[@]}
hello 2 3 nick
#取得数组a的索引项
[root@lovelace 51cto]# echo ${!a[@]}
0 1 2 3

bash脚本编程之一 变量、变量类型等的更多相关文章

  1. Bash脚本编程之算术运算

    简介 Bash所支持的算术运算和C语言是一样的,这里指的是操作符(operator)以及它们的优先级(precedence).结合性(associativity)和值,详见Shell Arithmet ...

  2. Bash脚本编程之数组

    数组简介 在bash脚本编程当中,变量是存储单个元素的内存空间:而数组是存储多个元素的一段连续的内存空间. 数组由数组名和下标构成,如下. ARRAY_NAME[SUBSCRIPT] 数组按照下标的类 ...

  3. Bash脚本编程学习笔记04:测试命令test、状态返回值、位置参数和特殊变量

    我自己接触Linux主要是大学学习的Turbolinux --> 根据<鸟哥的Linux私房菜:基础篇>(第三版) --> 马哥的就业班课程.给我的感觉是这些课程对于bash的 ...

  4. 脚本命令高级Bash脚本编程指南(31):数学计算命令

    题记:写这篇博客要主是加深自己对脚本命令的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 高等Bash脚本编程指南(31):数学盘算命令 成于坚持,败于止步 操作数字 factor ...

  5. 高级Bash脚本编程指南(27):文本处理命令(三)

    高级Bash脚本编程指南(27):文本处理命令(三) 成于坚持,败于止步 处理文本和文本文件的命令 tr 字符转换过滤器. 必须使用引用或中括号, 这样做才是合理的. 引用可以阻止shell重新解释出 ...

  6. 高级bash脚本编程(三)

    高级bash脚本编程 知识点 compound 和 comparison -a 逻辑与 exp1 -a exp2 如果表达式 exp1 和 exp2 都为真的话,那么结果为真. -o 逻辑或 exp1 ...

  7. 高级Bash脚本编程(一)

    高级Bash脚本编程 Bash 它是能力很强的计算机语言,被称为解释性语言或脚本语言,它可以调用所有的UNIX命令和工具再加上公共程序. Bash中的特殊字符 注释(#) (除#!外,#!是用于指定当 ...

  8. Bash脚本编程总结

    bash脚本编程之用户交互: read [option]… [name …]  -p ‘PROMPT’  -t TIMEOUT bash -n /path/to/some_script  检测脚本中的 ...

  9. bash脚本编程知识储备

    bash脚本编程:     脚本程序:解释器解释执行: 首先得理清一些琐碎的知识点,我尽量把我所学的帮朋友一起梳理一下 编程环境:(我会在接下来的篇章,图文例子三结合的方式带大家一起学习)       ...

  10. Bash脚本编程学习笔记08:函数

    官方资料:Shell Functions (Bash Reference Manual) 简介 正如我们在<Bash脚本编程学习笔记06:条件结构体>中最后所说的,我们应该把一些可能反复执 ...

随机推荐

  1. springboot系列之-helloword入门

    一. What: Spring Boot是什么?以1.4.3.RELEASE为例,官方介绍为:http://docs.spring.io/spring-boot/docs/1.4.3.RELEASE/ ...

  2. ios项目接入sdk事项

    使用cocos2d-x引擎创建的项目在xcode里可以看到都带有一个ios目录,把要接入的sdk的包含.framework库文件和.bundle的资源文件的父目录拖入到xcode项目里的这个ios目录 ...

  3. ubuntu 常用命令

    此处为使用ubuntu中常用的命令,不会全面深入讲解命令,仅供日常使用查看,以备遗忘. 不定时更新! 1.远程传输文件(小文件) scp [user@源文件地址:/目录/.../file] [目的地址 ...

  4. WOJ-1203

    Description 有一组数,很多很多个数,里面有一个数出现了超过一半次,请你把它找出来 Input 先是一个N (N<=1000000),然后接下来一行N个数,请一直处理到EOF. Out ...

  5. 数据结构C语言实现系列——线性表(线性表链接存储(单链表))

    #include <stdio.h>#include <stdlib.h>#define NN 12#define MM 20typedef int elemType ;/** ...

  6. mm/kmalloc.c

    /* *  linux/mm/kmalloc.c * *  Copyright (C) 1991, 1992  Linus Torvalds & Roger Wolff. * *  Writt ...

  7. Extjs各版本的下载链接

    Extjs的版本繁多,本文收集了Extjs各个版本的下载链接,包括官网和非官网的,以及各种汉化版api,欢迎大家下载分享. Extjs最新版下载链接:http://www.sencha.com/pro ...

  8. java实现定时任务的三种方法

    /** * 普通thread * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着, * 通过sleep方法来达到定时任务的效果.这样可以快速简单的实现,代码如下: * @au ...

  9. windows多线程相关

    1.多线程同步的方法 a)entercirticalsection leaveciriticalsection b)Mutex互斥对象 waitforsingleobject releasemutex ...

  10. 禁用sqlserver的锁升级

    锁升级 SQLSERVER.DB2中的锁是内存里面实现的,这就有个资源消耗问题,当锁的数量达到一个阀值或内存有压力时,就会引发锁升级.实际的情况是从row lock直接升级到table lock,而不 ...