1. 定义本地变量
  本地变量在用户当前的shell生产期的脚本中使用。例如,本地变量OLDBOY取值为ett098,这个值只在用户当前shell生存期中有意义。如果在shell中启动另一个进程或退出,本地变量OLDBOY值将无效。
  1. 普通字符串变量定义
  变量名=value
  变量名='value'
  变量名="value"
  shell中变量名的要求:一般是字母,数字,下划线组成。字母要开头,字母大写
  oldboy,oldboy123,oldboy_training
  例子:下面的例子会输出什么结果。

[root@yanwei-test1 scripts]# cat abctest.sh
a=192.168.1.2
b='192.168.1.2'
c="192.168.1.2"
echo "a=$a"
echo "b=$b"
echo "c=${c}"
提示:
1) $c 和{c} 在这里等同。
需要在命令行实践以上内容。

思考:想一想a,b,c各是什么结果?
答案:
  a=192.168.1.2
  b=192.168.1.2
  c=192.168.1.2
   例2:想一想a,b,c各种事什么结果

a=192.168.1.2-$a
b='192.168.1.2-$a'
c="192.168.1.2-$a"
echo "a=$a"
echo "b=$b"
echo "c=${c}"
提示:
需要在命令行实践以上内容。

思考:在想一想a,b,c现在各是什么结果?为什么是这个结果?
  答案:
  a=192.168.1.2-192.168.1.2
  b=192.168.1.2-$a
  c=192.168.1.2-192.168.1.2-192.168.1.2
  提示:
  第一种定义a变量的方式是直接定义变量内容,内容一般为简单连续的数字、字符串、路劲名等。
  第二种定义b变量的方式是通过单引号定义变量。这个方式的特点是:输出变量时引号里是什么就输出什么,即使内容中有变量也会把变量名原样输出。此法比较适合于定义显示纯字符串。
  第三种定义c变量方式是通过双引号定义变量。这个方式的特点是:输出变量时引号里的变量会经过解析后输出该变量内容,而不是把引号中变量名原样输出,适合于字符串中附带有变量的内容的定义。
  习惯:数字不加引号,其他默认加双引号。

2. 定义变量单引号、双引号与不加引号
  1. 有关单引号、双引号与不加引号的简要说明如下:
  单引号
    可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么
  双引号
    把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来。
  无引号
    把内容输出出来,会将含有空格的字符串视为一个整体输出,如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以不加任何引号,不过最好用双引号替代之。
  2. 单引号、双引号与不加引号实践演示
  范例1:经过反引号的`date`命令测试

[root@1-241 ~]# echo '`date`'
`date`
#单引号时看到啥就显示啥
[root@1-241 ~]# echo "`date`"
2017年 09月 14日 星期四 02:58:51 CST
#双引号时如果里面是变量,会先把变量解析成具体内容在显示
[root@1-241 ~]# echo `date`
2017年 09月 14日 星期四 02:58:59 CST
#对于连续的字符串等内容一般不加引号也可,加双引号一般比较保险,推荐

   范例2:变量定义后,调用时测试

[root@1-241 ~]# OLDBOY=testchars       #创建一个不带引号的变量
[root@1-241 ~]# echo $OLDBOY #不加引号,显示一个变量解析后的内容
testchars
[root@1-241 ~]# echo '$OLDBOY' #单引号,显示一个变量本身
$OLDBOY
[root@1-241 ~]# echo "$OLDBOY" #双引号,显示一个变量内容,引号内可以是变量、字符串等
testchars

 范例3:grep过滤字符串例子

[root@1-241 ~]# cat grep.log
testchars
oldboy
[root@1-241 ~]# grep "$OLDBOY" grep.log
testchars
[root@1-241 ~]# grep '$OLDBOY' grep.log
[root@1-241 ~]# grep $OLDBOY grep.log
Testchars
过滤双引号测试
[root@1-241 ~]# cat > oldboy.log
\"
[root@1-241 ~]# vim oldboy.log
[root@1-241 ~]# cat oldboy.log
\" [root@1-241 ~]# grep '\"' oldboy.log
\"
特殊例子:awk调用shell变量引号例子
[root@1-241 ~]# ETT=123
[root@1-241 ~]# awk 'BEGIN {print '$ETT'}'
123
[root@1-241 ~]# awk 'BEGIN {print "$ETT"}'
$ETT

  提示:以上的结果正好的前面的结论相反,这是awk调用shell变量的特殊用法。
3. 自定义变量的建议:
  1. 存数字(不带空格),定义方式可以不加引号(单或双),例如:

a.0ldboyAge=33
b.NETWORKING=yes

2. 没特殊情况,字符串一般用双引号定义,特别是多个字符串中间有空格时,例如:

a.NFSD_MODULE="yes  oldboy"
b.MyName="Oldboy is a handsome "

 3. 变量内容需要原样输出时,要用单引用('')。

 a.0ldboyAge='$OLDBOY' 

4. 变量的命名规范
  1. 变量命名要统一,使用全部大写字母,如APACHE_ERR_NUM;语义要清晰,能够正确表达变量内容的含义,过长的英文单词可采用前几个字符代替。多个单词连接使用“_”号连接,引用时,最好以${APACHE ERR NUM}加大括号或"${APACHE ERR NUM}"外面加双引号方式引用变量;
  2. 避免无含义字符或数字:例如下面的count,并不知道其确切含义;

  范例1:COUNT的不确切定义

COUNT=`grep keywords file`
if [ $COUNT -ne 22 ]
then
echo 'Do Something'
fi

3. 全局变量和局部变量命名

  1) 脚本中的全局变量定义,如OLDBOY_HOME或OLDBOYHOME,在变量使用时使用{}将变量扩起或"{OLDBOY_HOME}"

[yanwei@yw-07 ~]$ cat /etc/init.d/functions
# -*-Shell-script-*-
#
# functions This file contains functions to be used by most or all
# shell scripts in the /etc/init.d directory.
# TEXTDOMAIN=initscripts # Make sure umask is sane
umask 022 # Set up a default search path.
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
export PATH

2) 脚本中局部变量定义:存在于脚本函数(function)中的变量称为局部变量,要以local方式进行声明,使之只在函数作用域内有效,防止变量在函数中的命名与变量外部程序中变量重名造成程序异常。下面是函数中的变量定义例子:

  

#!/bin/bash
#author: zhansan
#Email: zhansan@163.com
#date:2018/4/10
#content:infra install 236 JENKINS_DIR=/api/236/batch/
YW_DIR=/appl/yanwei-batch
API_IP=(yanwei-09 yanwei-10) for IP in ${API_IP[*]}
do
API_process=`ssh ${IP} "ps -ef |grep java |grep -v grep |grep yanwei-platform-batch |wc -l"`
JUDGE_DIR=`ssh ${IP} " [ -d /appl/yanwei-batch ]" && echo yes ||echo no`
FREE="-Xms512m -Xmx1g -Xss512k"
JAVA="/usr/bin/java ${FREE} -jar"
if [ "$API_process" -eq 7 ]
then
ssh ${IP} "ps -aux|grep -v grep |grep yanwei-platform-batch |awk '{print \$2}'|xargs kill -9" fi

  3) 变量合并:当某些变量或配置项要组合起来才有意义时,如文件的路径和文件名称,建议将要组合的变量合并到一起赋值给一个新的变量,这样既方便之后的调用,也为以后进行修改提供了方便。

范例3:使用java的方便
FREE="-Xms512m -Xmx1g -Xss512k"
JAVA="/usr/bin/java ${FREE} -jar

 4) 变量定义总结:多学习模仿操作系统自带的/etc/init.d/functions函数库脚本的定义思路。

  1.把一个命令定义为一个变量

[root@1-241 ~]# ls
anaconda-ks.cfg grep.log install.log install.log.syslog oldboy.log tools
[root@1-241 ~]# CMD=`ls`
[root@1-241 ~]# echo $CMD
anaconda-ks.cfg grep.log install.log install.log.syslog oldboy.log tools
[root@1-241 ~]# CMD1=$(pwd)
[root@1-241 ~]# echo $CMD1
/root

  提示:
  1) “CMD=ls”注意命令变量前后的字符``(为键盘tab建上面的哪个,不是单引号)
  2) 在变量名前加$,可以取的此变量的值,使用echo命令可以显示变量的值,$A和${A}的写法不同,但功能是一样的,推荐使用后者的语法或"${A}"的写法不同,但功能是一样的,推荐使用后者的语法或“${A}”的用法。
  3) ${WEEK}day若变量和其他字符组成新的变量就必须给变量加上大括号{}。
  4) *养成将所有字符串变量用双引号括起来使用的习惯,将会减少很多编程时遇到的怪异的错误。具体使用方法如:“$A”或"${A}"的用法。

5) 生产环境常见应用:

1.对站点按天打包生成不同的文件名。
[root@1-241 ~]# CMD=$(date +%F)
[root@1-241 ~]# echo $CMD
2017-09-14
[root@1-241 ~]# echo `date +%F`.tar.gz
2017-09-14.tar.gz
[root@1-241 ~]# echo ${CMD}.tar.gz
2017-09-14.tar.gz

  

 

shell-的变量-局部变量的更多相关文章

  1. (转)Shell全局变量、局部变量与特殊变量笔记总结

    Shell全局变量.局部变量与特殊变量笔记总结 原文:http://blog.csdn.net/apollon_krj/article/details/70148022 变量类型:全局变量(环境变量) ...

  2. shell 全局和局部变量

    /******************************************************************** * shell 全局和局部变量 * 声明: * 到目前为止, ...

  3. shell脚本中局部变量local

    shell脚本中局部变量 在shell中定义函数可以使代码模块化,便于复用代码.不过脚本本身的变量和函数的变量的作用域问题可能令你费解,在这里梳理一下这个问题. (1)Shell脚本中定义的变量是gl ...

  4. shell 编程 变量

    转自:http://blog.csdn.net/qq504196282/article/details/52994249 shell之变量和引用 分类:SHELL编程基础 (470)  (0)  举报 ...

  5. [shell基础]——变量

    变量的赋值 #定义变量,注意等号两边没有任何空格 variable=#定义环境变量export variable= #双引号:可含空格.可转义特殊字符 variable=" " # ...

  6. shell编程-变量

    Shell支持自定义变量. 定义变量 定义变量时,变量名不加美元符号($),如: VALUE=“tmp” 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名的命名须遵 ...

  7. shell与变量的声明的操作

    1.给命令起别名:alias 执行下面命令后,可以使用dir代替ls –l 命令,显示目录中的文件详细信息: 还可以用一个别名表示几个命令 的结合: 2.ps:显示当前登录会话的所有活动进程: 3.更 ...

  8. 成员变量&&局部变量

    一.相同点:1.都遵循变量的声明格式:(修饰符) 数据类型  变量名=初始化值 2.都有各自的作用域 二.不同点:1.声明的位置不同      成员变量:声明在类内,方法外. 局部变量:声明在方法内. ...

  9. shell之变量与read

    环境变量 set 环境变量可供shell以外的程序使用 shell变量 env shell变量仅供shell内部使用 set:显示(设置)shell变量 包括的私有变量以及用户变量,不同类的shell ...

随机推荐

  1. tcpdump 命令格式

    tcpdump 命令格式 tcpdump [选项] [表达式 1. 选项 常用选项: -i : 网卡名: 指定网卡,默认抓取系统第一个网卡 -n : 对地址以数字方式显示 -nn :对地址端口以数字方 ...

  2. 给MySQL中数据表添加字段

    添加一个char字段: mysql> alter table stock add src char(20); Query OK, 3766 rows affected (0.65 sec) Re ...

  3. 通过股票K线图来谈谈真正的技术和现实的技术

    开局一张图 这是一张股票日线图,上面记载这近期每个交易日该股的开盘价,收盘价,最高价,最低价. 有兴趣的人可以估算下数据量和表的设计,似乎有点工作量.可这还只是一部分,你还可以获得每日分时数据,成交量 ...

  4. Centos7安装后进不去,死活就要填licence,该怎么办?

    遇到这个问题不要麻爪,跟着我做: 1 回车 2 回车 c 回车 c 回车 然后就进入系统了. 要使它联网,点右上角的开关按钮,将PCI Ethernet选择为connect状态. 我的centos7是 ...

  5. Count(*) 与 count(field) 一样吗?

    有这么个表: 执行 select count(*) from hy_test select count(deptno) from hy_test 都得到 5 但执行 select count(name ...

  6. 关于Vue-Router的那些事儿

    Vue-Router Vu-router是Vue.js的官方路由管理器,方便于构建页面,在我们的使用过程中,一般是在router的index.js文件中配置对应的组件和对应的路径 主要的功能 嵌套路由 ...

  7. java+swing+mysql图书管理系统

    系统说明:本系统采用eclipse开发,IDEA,eclipse,myeclipse均可运行 界面采用swing实现 数据库:mysql,附sql代码,其余数据库可复制sql代码运行 数据库连接文件m ...

  8. C Primer Plus 学习笔记

    随笔: 1)C语言中%3d%2d什么意思? 格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,用来确定输出内容格式.在"%"和字母之间插进数字表示最大场 ...

  9. postman -- 环境变量、全局变量使用

    背景: [登录接口]中会返回sign值,[学生金币充值接口]会则需要用到该sign值,因此把sign设置为环境或全局变量,便于其他接口调用. 1.请求登录接口,获取sign值: 2.把sign值添加至 ...

  10. yum安装软件包提示Error Downloading Packages解决方法

    在执行yum upgrade时报错 解决方法: 方法一: 1.清理本地yum缓存 执行:yum clean all 2.查看软件包列表 执行:yum list 注意:如果查询不到软件包列表,查看yum ...