bash变量详解

   shell作为用户和Unix/Linux沟通的桥梁,既可以是一个可执行的二进制程序,同时也是一个具备了编程能力的程序设计语言,定义了各种各样的变量和参数,下面介绍一下shell之上的各种变量。

1、本地变量

   特性:只对当前shell生效

[root@centos7 ~/bin]#cat localvar1.sh 
#!/bin/bash
#
var1=hei
echo "localvar1:$var1"
localvar2.sh
[root@centos7 ~/bin]#cat localvar2.sh 
#!/bin/bash
var2=ha
echo "localvar2:var2 is "$var2""
echo "localvar2:var1 is "$var1""
[root@centos7 ~/bin]#localvar1.sh 
localvar1:hei
localvar2:var2 is ha
localvar2:var1 is

    localvar1脚本中输出var1变量之外,还执行了localvar2脚本,同时打开了一个子shell,而在localvar2中,不仅输出var2变量,还要输出前一个shell中定义的var1。因为本地变量只对当前shell有效,所以子shell中输出不成功。

2、环境变量

[root@centos7 ~/bin]#cat localvar1.sh 
#!/bin/bash
#
export var1=hei
echo "localvar1:$var1"
localvar2.sh
[root@centos7 ~/bin]#localvar1.sh 
localvar1:hei
localvar2:var2 is ha
localvar2:var1 is hei

   注意:还是上述例子,只需将localvar1中的var1定义为环境变量,localvar1中定义的var1的作用范围将扩展至当前shell及其子shell,所以localvar2中可以输出var1。

3、特殊变量

   <1>区分$*和$@

[root@centos7 ~/bin]#cat arg1.sh 
#!/bin/bash
#
arg2.sh "$*"
echo --------------
arg2.sh "$@"
[root@centos7 ~/bin]#cat arg2.sh 
#!/bin/bash
echo "First parameter is $1"
echo "Second parameter is $2"
[root@centos7 ~/bin]#arg1.sh a b
First parameter is a b
Second parameter is 
--------------
First parameter is a
Second parameter is b

    执行arg1脚本时,实际上是通过将$*和$#作为参数赋予脚本arg2,来执行arg2,子shell中执行的arg2脚本再通过位置变量将这俩个参数输出,进而区分$*和$@的区别。得出结论:$*将全部参数作为一个字符串,而$#将全部参数识别为独立的字符串。 

    <2>认识$#,$0,$?

[root@centos7 ~/bin]#cat test.sh 
#!/bin/bash
#
echo $0
echo $#
[root@centos7 ~/bin]#echo $?
0

    上面可以看出:$0是脚本的名称,$#是参数的个数,而$?是测试上一条命令是否执行成功。

4、位置变量

[root@centos7 ~/bin]#cat countdao.sh 
#!/bin/bash
#
echo "$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} $11 $12"
[root@centos7 ~/bin]#countdao.sh a b c
a b c        a1 a2
[root@centos7 ~/bin]#countdao.sh z b c
z b c        z1 z2

    位置变量中$1..$9正常识别,$10将被识别为$1+1,解决方法$10–>${10}

    注意:在bash中位置变量也是有上限的,如果要测试,可使用以下代码

[root@centos7 /tmp]#cat testpa.sh 
#!/bin/bash
#Author:Zhao
#Name:testpa.sh
#Function:Test the maximum value of the script can accept
echo $200000                
[root@centos7 /tmp]#bash testpa.sh `echo {1..200000}`
200000       -----------------此处小编只测试到200000,大家可以加大数值

5、局部变量

   特点:只对特定的代码片段生效

强化练习

1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小

#!/bin/bash
#Author:Zhao
#Name:Systeminfo
#Function:A brief description of the system infomation
#---------
IP=`ifconfig | sed -n '2p' | tr -s ' ' | cut -d' ' -f3`
OS_Version=`cat /etc/centos-release`
Kernel=`cat /etc/centos-release`
CPU_Model=`cat /proc/cpuinfo | grep "model name" | sed -r 's@.*[[:space:]](i7.*)@\1@'`
Disk_Available=`fdisk -l | sed -n '2p' | tr ',' ':' | cut -d: -f2`
Memory=`cat /proc/meminfo | head -1 | sed -r 's@^.*[[:space:]]([[:digit:]]+.*)@\1@'`

echo "IP:$IP"
echo "OS_Version:$OS_Verson"
echo "Kernel:$Kernel"
echo "CPU_Model:$CPU_Model"
echo "Disk_Available=$Disk_Available"
echo "Memory:$Memory"

unset IP
unset OS_Version
unset Kernel
unset CPU_Model
unset Disk_Available
unset Memory

2、编写脚本/root/bin/backup.sh,可实现手动将/etc/目录备份到/root/etcYYYY-mm-dd中

#!/bin/bash
#Author:Zhao
#Name:backup.sh
#Function:Backup /etc directory

cp -a /etc/ /root/etc`date +%F`

3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值

#!/bin/bash
#Author:Zhao
#Name:disk.sh
#Function:Query disk usage

Maxdisk=`df | grep -v "media" | grep dev | tr ' ' ':' | tr -s ':' | cut -d: -f1,5 | sort -t: -k2 | tail -1`
echo "Maximum disk usage is:$Maxdisk"

unset Maxdisk

4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序

#!/bin/bash
#Author:Zhao
#Name:links.sh
#Function:Query current numbers of connection

links=`netstat -tn | grep tcp | tr -s ' ' | cut -d' ' -f5 | sort -r`
echo -e "The numbers of connection are\n$links"

unset links

5、写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和

#!/bin/bash
#Author:Zhao
#Name:sumid.sh
#Function:Calculate the sum of ID

line1=10
line2=20
ID1=`sed -n ''$line1'p' /etc/passwd | cut -d: -f3`  -----特别注意sed处的变量替换的写法
ID2=`sed -n ''$line2'p' /etc/passwd | cut -d: -f3`
sumid=$[$ID1+$ID2]
echo "The sum of ID is:$sumid"

unset line1
unset line2
unset ID1
unset ID2
unset sumid

6、写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和

#!/bin/bash
#Author:Zhao
#Name:sumspace.sh
#Function:Calculate the number of blank lines

line1=`grep "^$" $1 | uniq -c`
line2=`grep "^$" $2 | uniq -c`
linesum=$[$line1+$line2]
echo "The number of blank lines is: $linesum"

unset line1
unset line2
unset linesum

7、写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件

#Author:Zhao
#Name:sumspace.sh
#Function:Calculate the number of directorys and files

etc_file=`ls -A /etc | wc -l`
var_file=`ls -A /var | wc -l`
usr_file=`ls -A /var | wc -l`

file_sum=$[$etc_file+$var_file+$usr_file]
echo "The sum of directory and files is:$file_sum"

unset etc_file
unset var_file
unset usr_file

7、写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行

#!/bin/bash
#Author:Zhao
#Name:links.sh
#Function:Query current numbers of connection

[ $# -lt 1 ] && (echo "At least input a parameter"; exit) || (`grep "^$" $1 | wc -l` && echo "The blank lines is:$blank")

unset blank

8、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

#!/bin/bash
#Author:Zhao
#Name:hostping.sh
#Function:Test whether the IP address can communicate

IP1=`echo $1 | grep -E -o "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"`
[[ $1 == $IP1 ]] && (echo "legal IP"; ping -c1 -W1 $1 &> /dev/null && echo "The IP address can be accessed" || echo "The IP address can't be accessed") || echo "Illegal IP"; exit

unset IP1

9、chmod -rw /tmp/file1,编写脚本/root/bin/per.sh,判断当前用户对/tmp/fiile1文件是否不可读且不可写

#!/bin/bash
#Author=Zhao
#Name:per.sh
#Function:Test user's permissions for file

File=/tmp/file1
Who=`whoami`
[ ! -r $File -a ! -w $File ] && echo "Don't have read and write permissions,$Who" || [ ! -r $File ] && echo "No read permission,$Who" || [ ! -w $File ] && echo "No write permission,$Who"

unset File
unset Who

注意:上面这个例子如果拿root测试会出现问题

10、编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统。

#!/bin/bash
#Author=Zhao
#Name:per.sh
#Function:Test user's permissions for file

File=/etc/nologin
[ -f $File ] && echo "No login system" || (touch $File; echo "System Locked")

unset File
#!/bin/bash
#Author:Zhao
#Name:login.sh
#Function:Make users can login system

File=/etc/nologin
[ -f $File ] && (rm -f $File; echo "System Unlocked") || echo "You can login system"

unset File

12、计算1+2+3+…+100的值

#!/bin/bash
#Author:Zhao
#Name:sum.sh
#Function:Calculate the sum of figures

sum=`echo {1..100} | tr ' ' '+' | bc`
echo "{1..100} sum is:$sum"

unset sum

13、计算从脚本第一参数A开始,到第二个参数B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之

#!/bin/bash
#Author:Zhao
#Name:sum2.sh
#Function:Calculate the sum of figures

sum=`seq $1 $2 | xargs | tr ' ' '+' | bc`
[ $2 -gt $1 ] && echo "{A..B} sum is:$sum" || echo "Error input"

unset sum

原创文章,作者:mfwing,如若转载,请注明出处:http://www.178linux.com/34649

(0)
mfwingmfwing
上一篇 2016-08-15
下一篇 2016-08-15

相关推荐

  • Linux基础知识之逻辑卷管理器(LVM)

    逻辑卷管理器(LVM)        允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小     允许在多个物理设备间重新组织文件系统将设备指定为物理卷     用一个或者多个物理卷来创建一个卷组  &n…

    Linux干货 2016-09-01
  • 8月3日课堂练习及课后作业

    课堂练习 1、创建用户gentoo,附加组为bin和root,默认shell为/bin/csh,注释信息为“Gentoo Distribution” useradd -G bin,root -s /bin/csh -c "Gentoo Distribution" gentoo  2、创建下面的用户、组和组成员关系,名字为admi…

    Linux干货 2016-08-04
  • 游戏运维工程师

    爱乐盟互动为深圳市政府评定的深圳市重点文化企业,同时为广东省高科技产业商会常务理事单位,注册资金人民币1000万元。公司的原创大型MMORPG网游《王者传说2》为深圳市政府重点支持的网游项目,《王者传说2》将全面领先于国内的同类产品,成为业界新标准的重要网游产品!! 《王者传说2》已进入产品研发的重要阶段。除《王者传说2》,爱乐盟也已经启动了数款全新大型网游…

    Linux干货 2016-10-19
  • 计算机的发展及组成

    计算机发展 计算机(Computer):俗称电脑,是一种能接收和存储信息,并按照存储在其内部的程序对海量数据进行自动、高速地处理,然后把处理结果输出的现代化智能电子设备。 1946年,世界上诞生了第一台计算机,用于军事,计算弹道。 1946年数学家冯.诺依曼提出冯诺依曼体系结构,即所有计算机由运算器、控制器、存储器、输入设备、输出设备组成,所有遵循冯.诺依曼…

    Linux干货 2017-07-13
  • 基础网络配置

    配置文件: /etc/ude /proc/sys/net/ipv4/ip_forward /etc/sysconfig/network-scripts/ifcfg-IFACE 网络配置文件 /etc/sysconfig/network-scripts/route-IFACE 路由配置文件 配置文件里的设置: DEVICE:此配置文件应用到的设备 HWADDR…

    Linux干货 2017-05-08
  • 优质代码的十诫

    1.- DRY: Don’t repeat yourself. DRY 是一个最简单的法则,也是最容易被理解的。但它也可能是最难被应用的(因为要做到这样,我们需要在泛型设计上做相当的努力,这并不是一件容易的事)。它意味着,当我们在两个或多个地方的时候发现一些相似的代码的时候,我们需要把他们的共性抽象出来形一个唯一的新方法,并且改变现有的地方的代码让…

    Linux干货 2015-04-01

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-16 16:58

    通过示例演示了各个变量之间的区别,最好能总结一下实验中结果,通过一句话能描述出来,这样以后自己复习过程中也会轻松很多哦