bash shell学习之变量

简介:

关于变量的内容

一、变量命名:
二、变量赋值:

三、变量类型:
四、变量取消:
五、取得变量值:

六、调整变量的属性

七、数组
八、变量扩展:
九、命令扩展:

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

二、变量赋值:

设置变量:
变量名称=值

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

1
2
3
[root@lovelace 51cto] # youname=lovelace
[root@lovelace 51cto] # echo $youname
lovelace

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

1
2
3
[root@lovelace 51cto] # declare -i sum=100
[root@lovelace 51cto] # echo $sum
100

 

三、bash:变量类型:
    环境变量:
    本地变量(局部变量):
    位置变量:
    特殊变量(系统变量):

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

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

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

位置变量:
    $1,$2,....

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

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


四、撤销变量:
    unset varname

1
[root@lovelace 51cto] # unset youname;echo $youname


查看当前shell中的变量
        set  不带任何参数和选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
[root@lovelace 51cto] # set
BASH= /bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]= "3"  [1]= "2"  [2]= "25"  [3]= "1"  [4]= "release"  [5]= "i386-redhat-linux-gnu" )
BASH_VERSION= '3.2.25(1)-release'
COLORS= /etc/DIR_COLORS .xterm
COLUMNS=80
CVS_RSH= ssh
DIRSTACK=()
EUID=0
GROUPS=()
G_BROKEN_FILENAMES=1
HISTFILE= /root/ .bash_history
HISTFILESIZE=5000
HISTSIZE=5000
HOME= /root
HOSTNAME=lovelace.localdomain
HOSTTYPE=i386
IFS=$ ' \t\n'
INPUTRC= /etc/inputrc
LANG=zh_CN.GB2312
LC_ALL=zh_CN.GB2312
LESSOPEN= '|/usr/bin/lesspipe.sh %s'
LINES=20
LOGNAME=root
LS_COLORS= 'no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:'
MACHTYPE=i386-redhat-linux-gnu
MAIL= /var/spool/mail/root
MAILCHECK=60
OLDPWD= /home/scripts
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH= /usr/kerberos/sbin : /usr/kerberos/bin : /usr/local/sbin : /usr/local/bin : /sbin : /bin : /usr/sbin : /usr/bin : /root/bin
PIPESTATUS=([0]= "0" )
PPID=16933
PROMPT_COMMAND= 'printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1= '[\u@\h \W]\$ '
PS2= '> '
PS4= '+ '
PWD= /home/scripts/51cto
SHELL= /bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand: history :interactive-comments:monitor
SHLVL=1
SSH_ASKPASS= /usr/libexec/openssh/gnome-ssh-askpass
SSH_CLIENT= '192.168.2.28 8577 22'
SSH_CONNECTION= '192.168.2.28 8577 192.168.2.54 22'
SSH_TTY= /dev/pts/0
SUPPORTED=zh_CN.UTF-8:zh_CN.GBK:zh_CN.GB2312:zh_CN:zh:en_US.UTF-8:en_US:en
TERM=xterm
UID=0
USER=root
_= echo
consoletype=pty
sum =100
tmpid=0
x=101

如果查看当前shell中的环境变量
        env
        export
        printenv

字符串变量添加新的变量
 PATH添加新的路径
export PATH=$PATH:/usr/local/apsch/bin

 

五、取得变量值:
    $变量名称
    ${变量名称}  $(x) 这个可以用来当做命令调用
     如果变量在语句当中被引用,必须要使用${x}才可以,取得数组的变量值时候也需要使用${}来调用

1
2
3
4
5
[root@lovelace 51cto] # listnum=100
[root@lovelace 51cto] # echo $listnum
100
[root@lovelace 51cto] # echo ${listnum}
100

关于变量和引号的关系:
    单引号:所见即所得
    双引号:使特殊符号生效

1
2
3
4
[root@lovelace 51cto] # echo "There are $listnum pelple."
There are 100 pelple.
[root@lovelace 51cto] # echo 'There are $listnum pelple.'
There are $listnum pelple.



六、调整变量的属性:

1、readonly 命令 :定义只读变量
        -p:显示目前具有只读属性的变量列表
        -f:设定函数不可修改
        -a:定义数组不可修改
2、declare 命令 
        -r:设定只读变量
        -p:显示变量的属性
        -a:变量是一个数组
        -f:搜寻命令时,只找函数
        -i:变量是一个整数
        -F:显示所有的函数式名称及其属性
        -t:设立变量具有trace属性
        -x:设定环境变量



七、 数组:   

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

1、单个赋值,以index作为索引号,索引号从0开始
    a[0]=1
    a[2]=2
    a[3]=3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#为数组赋值
[root@lovelace 51cto] # a[0]=1
[root@lovelace 51cto] # a[1]=2
[root@lovelace 51cto] # a[2]=3
#显示数组中所有值方法一
[root@lovelace 51cto] # echo ${a[*]}
1 2 3
#显示数组中所有值方法二
[root@lovelace 51cto] # echo ${a[@]}
1 2 3
#为数组添加数据项
[root@lovelace 51cto] # a[3]='nick'
[root@lovelace 51cto] # echo ${a[*]}
1 2 3 nick

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

    a=(1 2 3) 默认空格隔开

1
2
3
4
5
6
7
8
9
#为数组b赋值  记住是小括号,不是大括号
[root@lovelace 51cto] # b=(bbs www http ftp)
[root@lovelace 51cto] # echo ${b[*]}
bbs www http  ftp
#打印出第一个和第三个数据项
[root@lovelace 51cto] # echo ${b[0]};echo '*******';echo ${b[2]}
bbs
*******
http

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

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

1
2
3
4
5
6
7
8
9
10
11
12
#为数组赋值
[root@lovelace 51cto] # c=(51cto [3]='nick' 51 [5]='lovelace')
#打印出数组中所有值
[root@lovelace 51cto] # echo ${c[@]}
51cto nick 51 lovelace
#验证中间出现的数值是从哪个索引项开始算起的
[root@lovelace 51cto] # echo ${c[1]}
[root@lovelace 51cto] # echo ${c[0]}
51cto
[root@lovelace 51cto] # echo ${c[2]}
[root@lovelace 51cto] # echo ${c[4]}
51

 

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

1
2
3
4
5
#打印出数组所有值,统计数组中数据项个数
[root@lovelace 51cto] # echo ${c[@]};echo ${#c[@]};echo ${#c[*]}
51cto nick 51 lovelace
4
4



八、高级变量:
${变量名称}  变量扩展
$(命令)      命令替换
$((算术式))  算术扩展

 

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

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

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

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

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

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

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

1
2
3
4
5
#打印出当前路径
[root@lovelace 51cto] # echo $(pwd)
/home/scripts/51cto
[root@lovelace 51cto] # echo `pwd`
/home/scripts/51cto

$((算术式))算术扩展:这个我们在下章将会单独讲解,这里给出示例查看

1
2
3
[root@lovelace 51cto] # a=3;b=5
[root@lovelace 51cto] # echo $((a+b))
8

九、变量扩展“去字符串切片,字符串长度
 字符串切片是从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

 

后记:学习shell编程,变量这一块很重要,文章中列出的仅仅是变量内容的一部分,还有很多像系统内置变量,以及环境变量,局部变量之间的转化,我们这里没有提及到,所以需要我们多练习、多总结。就算你一下记不住这么多知识,熟能生巧总是可以的吧......


本文转自lovelace521 51CTO博客,原文链接:http://blog.51cto.com/lovelace/1211141,如需转载请自行联系原作者

相关文章
|
2月前
|
存储 Java Shell
Shell 变量
10月更文挑战第2天
28 0
|
2月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
80 12
|
3月前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别
|
3月前
|
Unix Shell Windows
随笔:What is Bash? What is shell?
随笔:What is Bash? What is shell?
23 1
|
3月前
|
Java Shell Linux
Shell 变量设置
Shell设置变量
49 5
|
3月前
|
Java Shell Linux
Shell 变量设置25-1
Shell编程语言是一种非类型的解释型语言,无需像C++/Java那样事先声明变量。通过赋值即可定义变量,在Linux支持的所有Shell中均适用。变量分为局部变量与环境变量,前者仅限于定义脚本内使用,后者可在其派生的子进程中使用。常见系统变量如$0表示当前程序名称,$n表示第n个参数(n=1,2,...,9),$*代表所有参数,$#代表参数个数,$?表示命令执行后的状态(0为成功),$UID为当前用户ID,$PWD表示当前目录。定义变量如`A=123`,
33 0
|
4月前
|
Shell
[shell]在curl测试的data参数中引用变量
[shell]在curl测试的data参数中引用变量
240 1
|
4月前
|
缓存 Shell Linux
在Linux中,bash shell 中的 hash 命令有什么作用?
在Linux中,bash shell 中的 hash 命令有什么作用?
|
4月前
|
Shell Linux
在Linux中,使用bash shell实现条件判断和循环结构的例子是什么样的?
在Linux中,使用bash shell实现条件判断和循环结构的例子是什么样的?