shell中的变量

1.变量的定义

变量即在程序运行过程中它的值是允许改变的量
变量是用一串固定的字符来标示不固定的值的一种方法
变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储Script运行时可更改的程序信息
在shell中变量是不能永久保存在系统中的,必须在文件中声明

2.变量的种类

·在shell中变量分为环境级变量,用户级变量,系统级变量。
·环境级变量只在当前shell中生效,shell关闭变量丢失
·用户级变量写在用户的骨文件中,只针对当前用户生效
·系统级变量被写在系统的配置文件/etc/profile或者/etc/profile.d/中,对于所有用户都生效

3.变量的定义方法

1)环境级

如果直接定义a=1,在当前shell里直接执行echo $a,执行结果为1
但是把echo $a写进脚本里,执行脚本的时候,执行结果是空的
因为执行脚本的时候会重新开启一个shell,在新的shell没有定义a=1的值
所以要环境级变量export a=1
[root@localhost ~]# export a=1

这里写图片描述
关闭当前shell重新打开后变量丢失
这里写图片描述
2)用户级

[root@localhost ~]# vim ~/.bash_profile
export a=1
[root@localhost ~]# source ~/.bash_profile #刷新

这里写图片描述
切换用户变量丢失
这里写图片描述
3)系统级

[root@localhost ~]# vim /etc/profile
export a=1

这里写图片描述
切换用户变量仍然生效
这里写图片描述

4.变量名称的规范

变量名称中通常包含大小写字母,数字,下划线
变量名称格式
LINUX_CSDN
Linux_Csdn
linuX_Csdn

5.字符的转译和变量的声明

1)\    #转译单个字符
2""   #弱引用,批量转译
3''   #强引用,批量转译
""''的区别在于""不能转译"\","`","!","$"
4${}  #变量声明

例子:
1)\ 转译单个字符
这里写图片描述
2)双引号与单引号的区别

[root@localhost ~]# echo '#########`hostname`#########'
#########`hostname`#########
[root@localhost ~]# echo "#########`hostname`#########"
#########localhost#########

单引号将`符号转译为普通字符和hostname一起输出,双引号没有转译这个符号的功能,所以执行了hostname这个命令然后输出了主机名
这里写图片描述

5.变量值传递

$1   脚本后的第一串字符串
$2   脚本后的第二串字符串
$3   脚本后的第三串字符串
$#   脚本后的字符串的个数
$*   脚本后的所有字符串,模式为“1 2 3$@   脚本后的所有字符串,模式为“1”“2”“3

例如:

[root@localhost mnt]# vim file.sh
#!/bin/bash
echo \$1 is $1
echo \$2 is $2
echo \$3 is $3
echo \$# is $#
echo \$* is $*
echo \$@ is $@
[root@localhost mnt]# sh file.sh 
[root@localhost mnt]# sh file.sh linux
[root@localhost mnt]# sh file.sh linux lin
[root@localhost mnt]# sh file.sh linux lin li

这里写图片描述

$*与$@的区别举例:
[root@localhost mnt]# vim file1.sh
#!/bin/bash
for name in "$*"
do
   echo $name
done
[root@localhost mnt]# vim file2.sh
#!/bin/bash
for name in "$@"
do
   echo $name
done
[root@localhost mnt]# sh -x file2.sh linux lin li   --->执行了三次
[root@localhost mnt]# sh -x file1.sh linux lin li   --->执行了一次

这里写图片描述

例子:
建立用户,用户名为userfile文件的内容,密码为passwordfile文件里的内容并判断脚本后字符串的个数是否为两个

[root@localhost mnt]# vim user_create.sh 
#!/bin/bash
[ "$#" -eq 2 ]||{
         echo please input userfile and passwordfile!!
         exit 1
}
MAX_LINE=`wc -l $USERFILE|cut -d " " -f 1`
for LINE_NUM in `seq 1 $MAX_LINE`
do
    USERNAME=`sed -n "${LINE_NUM}P" $USERFILE`
    PASSWORD=`sed -n "${LINE_NUM}P" $PASSFILE`
    useradd $USERNAME
    echo $PASSWORD | passwd --stdin $USERNAME
done

这里写图片描述
脚本内容:
这里写图片描述

6.read实现变量传递

例1:判断输入的ip主机是否开启

[root@localhost mnt]# vim ip_check.sh
#!/bin/bash
read -p "Please input a number: " IP    #如果不想显示输入的IP地址,可以加-s
ping -c1 -w1 $IP &> /dev/null && echo $IP is up || echo $IP is down
[root@localhost mnt]# sh ip_check.sh
Please input a number: 172.25.254.140
172.25.254.140 is down
[root@localhost mnt]# sh ip_check.sh
Please input a number: 172.25.254.152
172.25.254.152 is up

这里写图片描述
脚本内容:
这里写图片描述
例2:根据所输入用户名文件和密码文件建立用户,并判断输入的文件是否存在

[root@localhost mnt]# vim user_create.sh 
#!/bin/bash
read -p "Please input a userfile: " USERFILE
[ -e $USERFILE ]||{
         echo -e "\033[31m$USERFILE is not exist!!\033[0m"
         exit 1
}
read -p "Please input a passwordfile: " PASSWORDFILE
[ -e $PASSWORDFILE ]||{
         echo -e "\033[31m$PASSWORDFILE is not exist!!\033[0m"
         exit 1
}
MAX_LINE=`awk 'BEGIN{N=0}{N++}END{print N}' $USERFILE`
for LINE_NUM in `seq 1 $MAX_LINE`
do
     USERNAME=`sed -n "${LINE_NUM}p" $USERFILE`
     PASSWORD=`sed -n "${LINE_NUM}p" $PASSWORDFILE`
     useradd $USERNAME
     echo $PASSWORD | passwd --stdin $USERNAME
done

这里写图片描述
脚本内容:
这里写图片描述

7.别名设定

1) alias xie=’vim’ 关闭当前shell则失效

[root@localhost mnt]# alias xie=vim
[root@localhost mnt]# xie
[root@localhost mnt]# alias
alias xie='vim'

这里写图片描述
2) vim .bashrc 切换用户则失效

[root@localhost ~]# vim .bashrc 
[root@localhost ~]# source .bashrc 
[root@localhost ~]# alias
alias xie='vim'

这里写图片描述
切换用户失效
这里写图片描述
3) vim /etc/bashrc 切换用户仍然有效

[root@localhost ~]# vim /etc/bashrc 
[root@localhost ~]# source /etc/bashrc 
[root@localhost ~]# alias
alias xie='vim'

这里写图片描述
切换用户仍然有效
这里写图片描述
4)撤销设定:unalias xie
把文件里的别名设置删掉然后执行unalias
这里写图片描述

8.exit退出值

0 # 以一个真实值退出,表示正常退出
1 # 带假值退出
2 #用法不当
126 # 找到了要执行的文件,但它不是可执行的实用程序
127 # 未找到要执行的实用程序.
128 # 一个命令被一个信号打断了

例子:编写脚本利用exit退出值检测所输入ip的主机是否打开

[root@localhost mnt]# vim ip_check.sh 
read -p "please input an IP: " IP
ping -c1 -w1 $IP &> /dev/null
num=`echo $?`
[ "$num" = 0 ] &&{
    echo $IP is up
}||{
    echo $IP is down
}
[root@localhost mnt]# sh ip_check.sh
please input a IP: 172.25.254.222
172.25.254.222 is down
[root@localhost mnt]# sh ip_check.sh
please input a IP: 172.25.254.140
172.25.254.140 is up

这里写图片描述
脚本内容:
这里写图片描述

9.脚本中的函数

把一个复杂语句块定义成一个字符串的方法,可以让一个命令循环执行
例如:

[root@localhost mnt]# vim ip_check.sh 
#!/bin/bash
PING()
{
    read -p "Please input a number: " IP
    [ "$IP" = exit ]&&{
             echo bye
             exit 0
    }
    ping -c1 -w1 $IP &> /dev/null  &&{
      echo $IP is up
   }||{
      echo $IP is down
   }
   PING
}
PING
[root@localhost mnt]# sh ip_check.sh
Please input a number: 172.25.254.155
172.25.254.155 is up
Please input a number: 172.25.254.111
172.25.254.111 is down
Please input a number: exit
bye

执行如下:
这里写图片描述
脚本内容:
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值