bash脚本变量的使用

bash脚本的变量使用详解

变量的类型包括整数、字符串和数组,但在bash脚本编程中不需要指定类型就可以直接赋值,默认均为字符型,其参与运算会自动进行隐式类型转换。

变量的赋值方式为:name='value',其中“=”两边一定不能有空格,如果变量值中包含有空格则需要使用引号引起来,需要注意的是强引用和弱引用的区分。此外变量的赋值也可以引用变量和命令,如果引用变量赋值需要使用双引号,如果引用命令赋值需要使用反向单引号。变量的引用需要使用"$"符号,如引用变量PATH:$PATH 或 ${PATH}。

示例1:

[root@fengl /]# a=hello        #给变量a赋值hello
[root@fengl /]# b="hello world"    #给变量b赋值hello world
[root@fengl /]# c="$a world"        #给变量c赋值并引用变量a的值,需要使用双引号
[root@fengl /]# echo $c
hello world
[root@fengl /]# c='$a world'   #引用变量a的值给变量c赋值时,如果使用单引号则表示强引用
[root@fengl /]# echo $c
$a world
[root@fengl /]# d="hello `hostname`"     #引用命令赋值时需要在命令上使用反向单引号
[root@fengl /]# echo $d
hello fengl
[root@fengl /]# d="hello $(hostname)"     #引用命令赋值时也可以使用“$()”的方式
[root@fengl /]# echo $d
hello fengl
[root@fengl /]# d='hello `hostname`'      #引用命令赋值时如果使用单引号则会将其当成字符串处理
[root@fengl /]# echo $d
hello `hostname`

bash脚本编程的变量根据生效范围的不同可以分为多种,以下将对每种变量做详细介绍。

1、局部变量(本地变量)

局部变量也叫本地变量,局部变量的生效范围仅限当前shell进程,对当前shell之外的其他进程以及当前shell的子进程均无效,即局部变量只能在进程内自己使用,不能被别的进程使用,包括子进程。

示例2:

 #查看已编好的测试脚本,该脚本中定义了局部变量testvar
[root@fengl bin]# cat test.sh   
#!/bin/bash
#author:liang
#Version:1.0
#Test script

testvar="hello world"
echo "This is my first script,the testvar value is $testvar"
 
 #直接执行test.sh脚本可以正常调用脚本中的变量
[root@fengl bin]# test.sh    
This is my first script,the testvar value is hello world

 #使用echo命令调用test.sh脚本中的变量testvar,发现无法输出变量结果,即局部变量在当前shell的其他进程中无效
[root@fengl bin]# echo "testvar value is $testvar"    
testvar value is
 
 #再编辑一个脚本test1.sh,在该脚本中重新定义一个变量testvar2,并调用这个变量testvar2和test.sh脚本中的变量testvar,
 #同时也对test.sh脚本进行修改,在test.sh脚本中执行test1.sh,实现变量testvar在子进程中被调用,并观察结果
 
[root@fengl bin]# cat test1.sh    #查看test1.sh脚本
#!/bin/bash

testvar2="hello chain"
echo "testvar:$testvar"
echo "testvar2:$testvar2"
[root@fengl bin]# cat test.sh    #查看test.sh脚本
#!/bin/bash
#author:liang
#Version:1.0
#Test script

testvar="hello world"
echo "This is my first script,the testvar value is $testvar"
test1.sh 

[root@fengl bin]# test.sh   #执行test.sh脚本,并观察结果
This is my first script,the testvar value is hello world
testvar:                    #发现test.sh的子进程test1.sh无法调用test.sh中的变量
testvar2:hello chain        
[root@fengl bin]# test1.sh               #执行test1.sh脚本,并观察结果
testvar:                #发现test.sh中的变量无法被其他进程调用
testvar2:hello chain

2、环境变量

环境变量与局部变量的最大的区别是环境变量可以在当前shell的其他进程中被调用,也可以在当前shell的子进程中被调用,但在其他shell中无法被调用,系统中常用的变量大多数都是环境变量,并且系统中的环境变量全部为大写字母,如PATH、LANG、SHELL等。环境变量的定义方式也与本地变量不同,环境变量定义时需要声明该变量是环境变量,声明方式为:

export name=VALUE   或       declare -x name=VALUE

查看环境变量的命令也有多个,分别为:

export   或   env   或   printenv

3、只读变量

只读变量也叫常量,一旦声明了只读变量后,则该变量无法修改和删除,常用于固定的值,如圆周率π。只读变量和局部变量类似,只读变量也只能在自己的进程中使用,不能被当前shell的其他进程调用,包括子进程。只读变量和局部变量在退出当前的进程时将被自动删除。

声明只读变量的方式为:

readonly name       或      declare -r name

一个变量既可以同时被申明为只读变量和环境变量,声明方式为  declare -r -x name

4、位置变量

位置变量是系统中定义好的一种特殊变量,其作用是在脚本代码中调用通过命令行传递给脚本的参数,比如当执行某个脚本时可以跟上几个参数,通过调用位置变量来给脚本传递参数。位置变量的应用方式如下:

(1)使用位置变量直接调用命令行中的参数,使用方式为$直接跟数字,表示命令行中对应的参数,如$1表示命令行中的第1个参数,$2表示命令行中的第2个参数。这里需要强调的是$0表示调用命令本身

[root@fengl bin]# cat test    #查看一个写好并调用了位置变量的脚本
cat: test: No such file or directory
[root@fengl bin]# cat test.sh 
#!/bin/bash
#author:liang
#Version:1.0
#Test script

echo "输入的第1个参数为:$1"
echo "输入的第2个参数为:$2"
echo "输入的命令为:$0"

[root@fengl bin]# test.sh aaaa bbbb    #执行脚本时跟上两个参数
输入的第1个参数为:aaaa
输入的第2个参数为:bbbb
输入的命令为:/root/bin/test.sh

(2)使用位置变量传递命令行中的所有参数,使用方式为$*或$@,虽然这两种方式都能将命令行中的所有参数传递过来,但是$*和$@传递的参数是由区别的,$*传递的参数为一个整合过的字符创,而$@传递的参数为一个多个独立的字符串,需要注意的是$*和$@只是在引号引起来的时候才存在差异

[root@fengl bin]# cat test.sh   #查看编辑好并条用位置变量的脚本
#!/bin/bash
#author:liang
#Version:1.0
#Test script

echo -e "使用\$*传递的参数为:$*"
echo -e "使用\$@传递的参数为:$@"

echo -e "用\$*的值在./aa下创建目录"
mkdir ./aa/"$*"
echo ======================================
echo -e "用\$@的值在./bb下创建目录"
mkdir ./bb/"$@"

[root@fengl bin]# bash -x test.sh x y       #执行脚本并显示脚本执行过程
+ echo -e '使用$*传递的参数为:x y'
使用$*传递的参数为:x y
+ echo -e '使用$@传递的参数为:x' y
使用$@传递的参数为:x y
+ echo -e '用$*的值在./aa下创建目录'
用$*的值在./aa下创建目录
+ mkdir './aa/x y'                 #从这可以看出使用$*创建的是一个“x y”的目录,并且该目录在./aa目录下
+ echo ======================================
======================================
+ echo -e '用$@的值在./bb下创建目录'
用$@的值在./bb下创建目录
+ mkdir ./bb/x y             #从这可以看出使用$@创建的是两个目录,分别为./bb下的x目录和./下的y目录


[root@fengl bin]# ll aa/    #查看使用$*创建的目录
total 4
drwxr-xr-x. 2 root root 4096 Aug 15 02:53 x y

[root@fengl bin]# ll bb/ ./       #查看使用$@创建的目录
./:
total 80
...
drwxr-xr-x. 2 root root 4096 Aug 15 02:53 y
bb/:
total 4
drwxr-xr-x. 2 root root 4096 Aug 15 02:53 x

(3)使用位置变量传递参数个数,用法为$#

[root@fengl bin]# cat test1.sh   #查看编辑好并调用位置变量的脚本
#!/bin/bash

echo  "使用的参数个数为:$#"

[root@fengl bin]# test1.sh a b c  #执行脚本,并跟上参数
使用的参数个数为:3

原创文章,作者:苦涩咖啡,如若转载,请注明出处:http://www.178linux.com/33916

(0)
苦涩咖啡苦涩咖啡
上一篇 2016-08-15 09:24
下一篇 2016-08-15 09:24

相关推荐

  • 马哥教育网络班22期+第5周课程练习

    1、显示当前系统上root、fedora或user1用户的默认shell;cat /etc/passwd | grep "^\<root\>"cat /etc/passwd | grep "^\<fedora\>"cat /etc/passwd | grep "^\<user1\…

    Linux干货 2016-09-19
  • 软连接与硬链接区别

    前言: 今天学习了文件系统,简单的接触到文件系统构成的原理。原来我们不管在linux和win上面删除某个文件只是删除一个链接而已。而linux把链接分为软链接和硬链接。接下来我们就从文件系统构成的基本原理出发来说明下linux软链接和硬链接的区别。 文件系统简述: linux的哲学就是一切皆文件。为了方便人们的使用,我们可以通过看文件名来区分不同的文件。但作…

    Linux干货 2016-10-31
  • 文本处理三剑客之一的sed

    处理文本的工具sed Stream EDitor, 行编辑器 sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Se…

    Linux干货 2017-04-27
  • shell脚本编程2

    shell脚本编程2   今天继续学习了shell脚本编程,续之前写的脚本编程1。上次主要学了编程的基础,脚本格式,变量类型及变量的使用,条件测试,数字运算并且进行了部分练习,因为这部分逻辑思维能力要求不是很高,因此记忆起来难度不是特别大。   从今天开始便进入了流程控制以及函数、数组、高级字符串操作、高级变量等内容的学习,总体来说难度和…

    Linux干货 2016-08-16
  • 马哥教育网络19期+第五周练习博客

    1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;   grep "^[[:space:]]\+.*" /boot/grub/grub.conf 2、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行; &n…

    Linux干货 2016-06-19
  • linux开机启动流程

    linux开机启动流程:   一、BIOS 加电自检 当你按电源开关开机时,电脑会首先去启动BIOS(基本输入输出系统),BIOS一般是集成在主板上的. BIOS 的工作 1.检测连接硬件,比如显卡,内存,磁盘等等,检测的目的是以后把这些设备信息提供给操作系统 2.寻找启动磁盘,每一种BIOS都会有开机启动菜…

    Linux干货 2016-09-14

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-15 17:17

    理论与实践结合,注意下次联系跟总结写在一起哦。