shell-变量

bash中变量的种类

根据变量的生效范围等标准:
    本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效

    环境变量:生效范围为当前shell进程及其子进程

    局部变量:生效范围为当前shell进程中某代码片断(通常指函数)

    位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数

        注:脚本运行是在当前shell的子shell下运行的,如有(command)括号中的再开一个子shell,脚本shell之下开启的子shell,不可以调用的其他脚本的本地变量

    特殊变量:$?, $0, $*, $@, $#

本地变量

变量赋值:name=‘value’,

可以使用引用value:
    (1) 可以是直接字串; name=“root"
            name=var
            name=“xxx xxx  xx”多个字符串中间有空格的需要用引号如果不引用其他变量或引用命令的话单双引号都可以。
    (2) 变量引用:
        $name, ${name} 
                $a
                $b
                $ab
                ${a}b

        name="$USER" 通过引用起它变量的值赋值
    (3) 命令引用:name=`COMMAND`, name=$(COMMAND)

            注:可以多行内容赋值到一个变量。

变量引用:${name}, $name
    "":弱引用,其中的变量引用会被替换为变量值
    '':强引用,其中的变量引用不会被替换为变量值,而保持原字符串

            "弱引用----双引号
            [root@localhost ~]# echo "echo $USER"
            echo root

            ''强引用------单引号
            [root@localhost ~]# echo 'ehco $USER'
            ehco $USER

            ``命令引用----~下的符号
            [root@localhost ~]# echo `echo $USER`
            Root

显示已定义的所有变量:set

删除变量:unset name 脚本运行完毕要释放变量。养成良好习惯。

环境变量

环境变量的使用必须先声明
变量声明、赋值:
    export name=VALUE
    declare -x name=VALUE

    declare - name=number 声明变量为数值型
变量引用:$name, ${name}

显示所有环境变量:
    export
    env
    printenv

删除:unset name

bash有许多内建的环境变量:PATH, SHELL, USRE,UID, HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1

    声明环境变量后,shell的子进程及其子进程的子进程都可使用。
    新的终端后就不可以使用。

注
source 脚本 和 . 脚本 执行脚本效果是一样的,都是在当前shell下执行。
当前shell下的用户可调用该脚本的本地变量

通过 bash 脚本和直接执行 ./脚本 效果是一样的,都是在当前shell下开启子shell后运行的。
当前shell不可以调用该脚本定义的本地变量。

只读和位置变量

只读变量:只能声时,但不能修改和删除,不能使用unset撤销。
    readonlyname=VLAUE
    declare -r name=VLAUE

        可以与-x一起使用 declare -rx name=VALUE 只读的环境变量

位置变量:在脚本代码中调用通过命令行传递给脚本的参数
    $1, $2, ...:对应第1、第2等参数,shift [n]换位置
    $0: 命令本身,脚本名称。
    $*: 传递给脚本的所有参数,全部参数合为一个字符串
    $@: 传递给脚本的所有参数,每个参数为独立字符串
    $#: 传递给脚本的参数的个数
        $@ $* 只在被双引号包起来的时候才会有差异

            [root@yangyouwei ~]# ./test1.sh a b
            first a b
            secd 
            all a b
            ========
            first a
            secd b
            all a b

            [root@yangyouwei ~]# cat test1.sh 
            #!/bin/bash
            ./test2.sh "$*"
            echo ========
            ./test2.sh "$@"

            [root@yangyouwei ~]# cat test2.sh 
            #!/bin/bash
            echo first "$1"
            echo secd "$2"
            echo all "$*"

shift

位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。

脚本test1加上参数a和b 调用脚本test2
    test1中
            test2运行两次但是调用的 参数不同
            (虽然某些情况下$*和$@效果是一样的,在这里这两个变量的值作为test2的参数,参与test2的执行。)

示例:判断给出的文件的行数

    linecount="$(wc-l $1| cut -d' ' -f1)"
    echo "$1 has $linecountlines."

declare

-i 声明为整数

-a 声明为数组

-f 声明为函数

-r 声明为只读

local 局部变量

定义局部变量
多用于函数内部的变量定义。定义后该变量只在该函数体内部生效。

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

(0)
yywyyw
上一篇 2016-08-21
下一篇 2016-08-21

相关推荐

  • 8-2 作业

    8-2作业     1.在/data/testdir里创建的新文件自动属于g1组,组g2的成员如:alice能对这些新文件有读写权限,组g3的成员如:tom只能对新文件有读权限,其它用户(不属于g1,g2,g3)不能访问这个文件夹。 2.创建组sales,gid 3000,passwd:centos,sales admins:user2。…

    Linux干货 2016-08-05
  • 初学Linux文件目录结构

    /:根目录 /bin(binary):放置的是二进制文件。可执行的命令;非管理类的命令,通常是系统启动就需要的文件,供所有用户使用的基本命令;不能关联至独立分区, OS启动即会用到的程序。 /sbin:管理类的命令,通常只有管理员可以使用。 /lib:存放的是系统级别的库文件 /lib64:专用于x86_64系统上的辅助共享库文件存放位置  /ro…

    Linux干货 2017-07-13
  • MySQL 多实例详解

    目录 一、基本概念 1、MySQL多实例        就是在一台机器上面开启多个不同的端口,运行多个MySQL服务进程。这些MySQL多实例公用一套安装程序,使用不同的(也可以是相同的)配置文件,启动程序,数据文件。在提供服务时候,多实例MySQL在逻辑上看来是各自独立的,多个实例的自身是根据配置…

    Linux干货 2015-09-23
  • 运维工程师技能需求排行

    这是我今天在拉勾网搜索运维,翻完了4四页也招聘信息之后得到的,我的目的是想要看看之后的学习,哪个更应该成为重点,有些在我意料之中,有些还真的没想到,算是努力了一个小时的收获吧,分享给大家。
    注意:其中的看法仅代表个人观点,很多都是依靠我自己的学习经验和工作经验累积的

    Linux干货 2017-12-12
  • 用户和组管理

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@suywien ~]# who | cut -d ‘ ‘ -f1 | uniq -c 2 root [root@suywien ~]# 2、取出最后登录到当前系统的用户的相关信息。 [root@suywien ~]# who | tail -1 | cut…

    Linux干货 2018-03-18
  • 2016全球运维大会,优云蒋君伟演讲“CMDB+自动化的管理融合”成一大亮点

    2016全球运维大会于9月23日-24日在上海盛大开幕。作为国内运维行业的重量级大会,优云产品总监蒋君伟在自动化专场与来自全国各地的运维同行一起探讨、分享业内自动化运维的最佳实践。现场情绪热烈,气氛高涨,成为了本届全球运维大会的一大亮点。 全新梳理自动化与CMDB的融合之道 全球运维大会当天,运维自动化专场很多大牛针对自动化运维管理中的CMDB进行了激烈的讨…

    Linux资讯 2016-12-05