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 20:45
下一篇 2016-08-21 20:45

相关推荐

  • 文本编辑器vim概述与应用示例

    文本编辑器vim概述与应用示例 文本编辑器概述 vim编辑器是一种易用、功能强大的文本编辑器,可以基于三种不同的模式对文本进行编辑,包括编辑模式、输入模式和末行模式。 编辑模式 模式转换 i 表示在光标所在处插入 a 表示在光标后方插入 o 表示在光标所在处的下一行插入 O 表示在光标所在处的上一行插入 I 表示在光标所在行的行首插入 A 表示在光标所在行的…

    Linux干货 2017-08-06
  • 第一周linux学习总结

    1、描述计算机的组成及其功能
    2、按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别
    3、描述Linux的哲学思想,并按照自己的理解对其进行解释性描述
    4、说明Linux系统上命令的使用格式;详细介绍ifconfig、echo、tty、startx、export、pwd、history、shutdown、poweroff、reboot、hwclock、date命令的使用,并配合相应的示例来阐述
    5、如何在Linux系统上获取命令的帮助信息,请详细列出,并描述man文档的章节是如何划分的
    6、请罗列Linux发行版的基础目录名称命名法则及功用规定

    Linux干货 2017-12-04
  • 网络配置——CentOS7

    CentOS 7 网络属性配置 使用传统命名方式: (1) 编辑/etc/default/grub 配置文件 GRUB_CMDLINE_LINUX ="rhgb quiet net.ifnames=0" 或:修改/boot/grub2/grub.cfg (2) 为grub2 生成其配置文件 grub2-mkconfig -o /etc/g…

    Linux干货 2016-09-11
  • 第三周博客作业

    who useradd usermod groupadd

    Linux干货 2017-12-17
  • ifcfg家族命令介绍

    ifcfg家族命令: ifconfig ifconfig [interface] add<地址>:设置网络设备IPv6的ip地址; del<地址>:删除网络设备IPv6的IP地址; down:关闭指定的网络设备;<硬件地址>:设置网络设备的类型与硬件地址; io_addr:设置网络设备的I/O地址; irq:设置…

    Linux干货 2016-07-29
  • CentOS 更改改网卡名称

    1 查看你的CentOS7网卡名字叫什么(通常第一个网卡叫做eno16777736) ip addr 2 编辑配置文件 vi /etc/sysconfig/network-scripts/ifcfg-eno16777736 把配置文件里面所有eno16777736改为eth0 3 把网卡配置文件名字也修改一下 cd /etc/sysconfig/networ…

    2018-01-18