精华内容
下载资源
问答
  • Linuxshell变量说明

    千次阅读 2015-08-11 12:24:04
    shell变量可以保存诸如路径名、文件名或者一个数字这样的变量名。shell将其中任何设置都看做文本字符串。 有两种变量,本地和环境。严格地说可以有4种,但其余两种是只读的,可以认为是特殊变量,它用

    原文地址:http://123304258.blog.163.com/blog/static/12354702012423113850772/

      为使shell编程更有效,系统提供了一些shell变量。shell变量可以保存诸如路径名、文件名或者一个数字这样的变量名。shell将其中任何设置都看做文本字符串。
    有两种变量,本地和环境。严格地说可以有4种,但其余两种是只读的,可以认为是特殊变量,它用于向shell脚本传递参数。

    1. 什么是shell变量

      按照定义来说,变量是存储设备中的一些可读写的存储单元.变量可以定制用户本身的工作环境。使用变量可以保存有用信息,使系统获知用户相关设置。变量也用 于保存暂时信息。例如:一变量为EDITOR,系统中有许多编辑工具,但哪一个适用于系统呢?将此编辑器名称赋给EDITOR,这样,在使用cron或其 他需要编辑器的应用时,这就是你将一直使用的EDITOR取值,并将之用作缺省编辑器。
      举例来说,登录的审核系统需要编辑。在菜单中选择此选项时,应用查询EDITOR变量值,其值为vi。系统知道可使用此编辑器(用命令echo $EDITOR看看自己的?)。
    另一个例子需要登录数据库系统,键入下列命令:

    $ isql -Udavet -Pabcd -Smethsys

      这里- S为正在连接的服务器名称。有一变量DSQUERY保存服务器名称值。设置服务器名称值到DSQUERY变量,这样如果登录时不使用-S提供服务器名称, 应用将查询DSQUERY变量,并使用其取值作为服务器名称。需要做的全部工作就是键入下列命令:

    $ isql -Udavet -Pabcd

      工作方式同上例。

    2. 本地变量

      本 地变量在用户现在的shell生命期的脚本中使用。例如,本地变量file-name取值为loop.doc,这个值只在用户当前shell生命期有意 义。如果在shell中启动另一个进程或退出,此值将无效。这个方法的优点就是用户不能对其他的shell或进程设置此变量有效。
      使用变量时,如果用花括号将之括起来,可以防止shell误解变量值,尽管不必一定要这样做,但这确实可用。要设置一本地变量,格式为:

    $ variable-name=value 或 $ {variable-name=value}

      注意,等号两边可以有空格。如果取值包含空格,必须用双引号括起来。shell变量可以用大小写字母。
    变量设置时的不同模式:
    Variable-name=value 设置实际值到variable-name
    Variable-name+value 如果设置了variable-name,则重设其值
    Variable-name:?value 如果未设置variable-name,显示未定义用户错误信息
    Variable-name?value 如果未设置variable-name,显示系统错误信息
    Variable-name:=value 如果未设置variable-name,设置其值
    Variable-name:-value 同上,但是取值并不设置到variable-name,可以被替换

    2.1 显示变量

      使用echo命令可以显示单个变量取值,并在变量名前加$,例如:

    echo $LOGNAME
    $dave
      可以结合使用变量,下面将错误信息和环境变量LOGNAME设置到变量error-msg。
    $ERROR_MSG=”sorry, there is not LOGNAME$echoERROR_MSG”
    $sorry, there is not dave
      上面例子中,shell首先显示文本,然后查找变量$LOGNAME,最后扩展变量以显示整个变量值。

    2.2 清除变量

      使用unset命令清除变量。
      unset variable-name

    2.3 显示所有本地shell变量

      使用不加任何参数的set命令显示所有本地定义的shell变量。
      set输出可能很长。查看输出时可以看出shell已经设置了一些用户变量以使工作环境更加容易使用。

    2.4 结合变量值

      将变量并排可以使变量结合在一起:

    echo $var_1$var_2

    2.5 测试变量是否已经设置

      有时要测试是否已设置或初始化变量。如果未设置或初始化,就可以使用另一值。此命令格式为:

    $ {variable:-value}

      意即如果设置了变量值,则使用它,如果未设置,则取新值。例如:

    $color=blue
    $echo “The sky is ${color:-grey} today”
    The sky is blue today

      变量colour取值blue,echo打印变量colour时,首先查看其是否已赋值,如果查到,则使用该值。现在清除该值,再来看看结果。

    $color=blue
    $unset color
    $echo “The sky is ${color:-grey} today”
    The sky is grey today

      上面的例子并没有将实际值传给变量,需使用下述命令完成此功能:

    $ {variable:=value}

    2.6 使用变量来保存系统命令参数

      可以用变量保存系统命令参数的替换信息。下面的例子使用变量保存文件拷贝的文件名信息。变量source保存passwd文件的路径。

    $ source=”/etc/passwd”
    $ cd $source

    2.7 设置只读变量

      如果设置变量时,不想再改变其值,可以将之设置为只读方式。如果有人包括用户本人想要改变它,则返回错误信息。格式如下:

    variable-name=value
    readonly variable-name
      设为只读后,任何改变其值的操作将返回错误信息。要查看所有只读变量,使用命令readonly即可。

    3 环境变量

      环境变量用于所有用户进程(经常称为子进程)。登录进程称为父进程。s h e l l中执行的用户进程均称为子进程。不像本地变量(只用于现在的s h e l l)环境变量可用于所有子进程,这包括编辑器、脚本和应用。
      环境变量可以在命令行中设置,但用户注销时这些值将丢失,因此最好在. profile文件中定义。系统管理员可能在/etc/profile文件中已经设置了一些环境变量。将之放入profile文件意味着每次登录时这些值 都将被初始化。传统上,所有环境变量均为大写。环境变量应用于用户进程前,必须用export命令导出。环境变量与本地变量设置方式相同。

    3.1 设置环境变量

    VARIABLE-NAME=value;export VARIABLE-NAME

      在两个命令之间是一个分号,也可以这样写:
     

    VARIABLE-NAME=value
    export VARIABLE-NAME

    3.2 显示环境变量

      显示环境变量与显示本地变量一样,用echo命令即可。使用env命令可以查看所有的环境变量。

    3.3 清除环境变量

      使用unset命令清除环境变量

    unset VARIABLE-NAME

    3.4 嵌入shell变量

      Brourne shell 有一些预留的环境变量名,这些变量名不能用作其他用途。通常在/etc/profile中建立这些嵌入的环境变量,但也不完全是,这取决于用户自己。以下是嵌入shell变量列表。
    1. CDPATH
      改变目录路径变量,保留一系列由冒号隔开的路径名,用于cd命令。如果设置了CDPATH,cd一个目录时,首先查找CDPATH,如果CDPATH指明此目录,则此目录成为当前工作目录。例子如下:

    $ CDPATH=:/home/dave/bin:/usr/local/apps ;export CDPATH.

    如果要

    $ cd apps

      cd命令首先在CDPATH中查找目录列表,如果发现apps,则它成为当前工作目录。
    2. EXINIT
      EXINIT变量保存使用vi编辑器时的初始化选项。例如,调用vi时,要显示行号,且在第10个空格加入tab键,命令为:

    $ EXINIT=’set nu tab=10’;export EXINIT

    1. HOME
        HOME目录,通常定位于passwd文件的倒数第2列,用于保存用户自身文件。设置了HOME目录,可以简单使用cd命令进入它。也可以用

      $ cd $HOME

    2. IFS
        IFS用作shell指定的缺省域分隔符。原理上讲域分隔符可以是任意字符,但缺省通常为空格、新行或tab键。IFS在分隔文件或变量中各域时很有用。 下面的例子将IFS设置为冒号,然后echo $PATH变量,给出一个目录分隔开来的可读性很强的路径列表。

      /sbin /bin /usr/bin /home/dave/bin

    要设置其返回初始设置:

    $ IFS=; export IFS

    这里为空格和tab键。
    5. LOGNAME
    此变量保存登录名,应该为缺省设置,但如果没有设置,可使用下面命令完成它:

    $ LOGNAME=’dave’; export LOGNAME

    1. MAIL
        MAIL变量保存邮箱路径名,缺省为/var/spool/mail/。shell周期性检查新邮件,如果有了新邮件,在命令行会出现一个提示信息。如果邮箱并不在以上指定位置,可以用MAIL设置。

      $ MAIL=/usr/mail/dave ;export MAIL

    2. MAILCHECK
        MAILCHECK缺省每60s检查新邮件,但如果不想如此频繁检查新邮件,比如设为每2m,使用命令:

      $ MAILCHECK=120 ;export MAILCHECK

    3. MAILPATH
        如果有多个邮箱要用到MAILPATH,此变量设置将覆盖MAIL设置。

      $ MAILPATH=/var/spool/dave:/var/spool/admin ;export MAILPATH

        上面的例子中,MAIL检测邮箱dave和admin。

    4. PATH
        PATH变量保存进行命令或脚本查找的目录顺序,正确排列这个次序很重要,可以在执行命令时节省时间。你一定不想在已知命令不存在的目录下去查找它。通常 情况,最好首先放在HOME目录下,接下来是从最常用到一般使用到不常用的目录列表次序。如果要在当前工作目录下查询,无论在哪儿,均可以使用句点操作。 目录间用冒号分隔,例如:

      $ PATH=$HOME/bin:.:/bin:/usr/bin ;export PATH

        使用上面的例子首先查找HOME/bin目录,然后是当前工作目录,然后是/bin,最后是
      /usr/bin。
        PATH可以在系统目录下/etc/profile中设置,也可以使用下面方法加入自己的查找目录。

      $PATH=$PATH:/$HOME/bin:.;export PATH

        这里使用了/etc/profile中定义的PATH,并加入$HOME/bin和当前工作目录。一般来说,在查找路径开始使用当前工作目录不是一个好办法,这样很容易被其他用户发现。

    5. PS1
      基本提示符包含shell提示符,缺省对超级用户为#,其他为$。可以使用任何符号作提示符.
    6. PS2
      PS2为附属提示符,缺省为符号>。PS2用于执行多行命令或超过一行的一个命令。
    7. SHELL
      SHELL变量保存缺省shell,通常在/etc/passwd中已设置,但是如有必要使用另一个shell,
      可以用如下方法覆盖当前shell:
    8. TERMINFO
      终端初始化变量保存终端配置文件的位置。通常在/usr/lib/terminfo或/usr/share/terminfo

      $ TERMINFO=/usr/lib/terminfo ;export TERMINFO

    9. TERM
        TERM变量保存终端类型。设置TERM使应用获知终端对屏幕和键盘响应的控制序列类型,常用的有vt100、vt200、vt220-8等。

      $ TERM=vt100 ;export TERM

    10. TZ
      时区变量保存时区值,只有系统管理员才可以更改此设置。例如:
      $echo $TZ
      GMT2EDT
      返回值表明正在使用格林威治标准时间,与GMT时差为2,并作EDT保存。

    3.5 其他环境变量

      还有一些预留的环境变量。其他系统或命令行应用将用到它们。以下是最常用的一些,注意这些值均未有缺省设置,必须显示说明。
    1. EDITOR
    设置编辑器,最常用。
    $ EDITOR=vi ;export EDITOR
    2. PWD
    当前目录路径名,用cd命令设置此选项。
    3. PAGER
    保存屏幕翻页命令,如pg、more,在查看man文本时用到此功能。
    $ PAGER=’pg -f -p%d’ ;export PAGER
    4. MANPATH
    保存系统上man文本的目录。目录间用冒号分隔。
    $ MANPATH=/usr/apps/man:/usr/local/man ;export MANPATH
    5. LPDEST或PRINTER
    保存缺省打印机名,用于打印作业时指定打印机名。
    $ LPDEST=hp3si-systems
    3.6 set命令
      在$HOME.profile文件中设置环境变量时,还有另一种方法导出这些变量。使用set命令- a选项,即set -a指明所有变量直接被导出。不要在/etc/profile中使用这种方法,最好只在自己的$HOME/.profile文件中使用。
    3.7 将变量导出到子进程
      shell 新用户碰到的问题之一是定义的变量如何导出到子进程。前面已经讨论过环境变量的工作方式,现在用脚本实现它,并在脚本中调用另一脚本(这实际上创建了一个 子进程)。以下是两个脚本列表father和child。father脚本设置变量film,取值为AFewGoodMen,并将变量信息返回屏幕,然后 调用脚本child,这段脚本显示第一个脚本里的变量film,然后改变其值为DieHard,再将其显示在屏幕上,最后控制返回father脚本,再次 显示这个变量。
    $more father

    #!/bin/sh
    #father script
    echo "this is the father"
    FILM="A Few Good Men"
    echo "I like the film :$FILM"
    #call the child script
    ./child
    echo "back to father"
    echo "and the film is :$FILM"
    $more child
    #!/bin/sh
    #child script
    echo "called from father..i am the child"
    echo "film is :$FILM"
    FILM="Die Hard"
    echo "changing film to :$FILM"

    看看脚本显示结果:

    this is the father
    I like the film :A Few Good Men
    ./child: line 1: child: command not found
    called from father..i am the child
    film is :
    changing film to :Die Hard
    back to father
    and the film is :A Few Good Men

      因为在father中并未导出变量film,因此child脚本不能将film变量返回。如果在father脚本中加入export命令,以便child脚本知道film变量的取值,这就会工作:
      

    $more father2
    #!/bin/sh
    #father2 script
    echo "this is the father"
    FILM="A Few Good Men"
    echo "I like the film :$FILM"
    #call the child script
    #but export varible first
    export FILM
    ./child
    echo "back to father"
    echo "and the film is :$FILM"
    $ ./father2
    this is the father
    I like the film :A Few Good Men
    called from father..i am the child
    film is :A Few Good Men
    changing film to :Die Hard
    back to father
    and the film is :A Few Good Men

      因为在脚本中加入了export命令,因此可以在任意多的脚本中使用变量film,它们均继承了film的所有权。

    4 位置变量参数

      本章开始提到有4种变量,本地、环境,还有两种变量被认为是特殊变量,因为它们是只读的。这两种变量即为位置变量和特定变量参数。先来看一看位置变量。
    如果要向一个shell脚本传递信息,可以使用位置参数完成此功能。参数相关数目传入脚本,此数目可以任意多,但只有前9个可以被访问,使用shift命 令可以改变这个限制(以后将讲到shift命令)。参数从第一个开始,在第9个结束;每个访问参数前要加$符号。第一个参数为0,表示预留保存实际脚本名 字。无论脚本是否有参数,此值均可用。
    如果向脚本传送Did You See Th e Full Moon信息,下面的表格讲解了如何访问每一个参数。
    \$0 \$1 \$2 \$3 \$4 \$5 \$6 \$7 \$8 \$9
    脚本名字 Did You See The Full Moon
    4.1 在脚本中使用位置参数
    在下面脚本中使用上面的例子。

    $more param
    #!/bin/sh
    #param
    echo "This is the script name    : $0"
    echo "This is the first parameter: $1"
    echo "This is the 2nd parameter : $2"
    echo "This is the third parameter: $3"
    echo "This is the 6th parameter : $6"
    echo "This is the 7th parameter : $7"
    $ ./param Did You See The Full Moon
    This is the script name    : ./param
    This is the first parameter: Did
    This is the 2nd parameter : You
    This is the third parameter: See
    This is the 6th parameter : Moon
    This is the 7th parameter :

      这里只传递6个参数,7、8、9参数为空,正像预计的那样。注意,第一个参数表示脚本名,当从脚本中处置错误信息时,此参数有很大作用。
    注意$0返回当前目录路径,如果只返回脚本名,在basename命令下参数设为$0,刚好得到脚本名字。

    $more param2
    #!/bin/sh
    echo "this is `basename $0`calling"

    $./param2
    this is param2 calling

    4.2 向系统命令传递参数

    可以在脚本中向系统命令传递参数。下面的例子中,在find命令里,使用$1参数指定查找文件名。

    $more findfile
    #!/bin/sh
    #findfile
    find / -name $1 -print

    另一个例子中,以$1向grep传递一个用户id号,grep使用此id号在passwd中查找用户全名。

    $more who_is
    #!/bin/sh
    #who_is
    grep $1 passwd | awk -F: {print $4}

    4.3 特定变量参数

      既然已经知道了如何访问和使用shell脚本中的参数,多知道一点相关信息也是很有用的,有必要知道脚本运行时的一些相关控制信息,这就是特定变量的由来。共有7个特定变量:
    $# 传递到脚本的参数个数
    $* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
    $$ 脚本运行的当前进程ID号
    $! 后台运行的最后一个进程的进程ID号
    $@ 与$ #相同,但是使用时加引号,并在引号中返回每个参数
    $- 显示shell使用的当前选项,与set命令功能相同
    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

      特定变量的输出使用户获知更多的脚本相关信息。可以检查传递了多少参数,进程相应的ID号,以免我们想杀掉此进程。
    4.4 最后的退出状态
      注意,$?返回0。可以在任何命令或脚本中返回此变量以获得返回信息。基于此信息,可以在脚本中做更进一步的研究,返回0意味着成功,1为出现错误。
    下面的例子拷贝文件到/tmp,并使用$?检查结果。
    $ cp ok.txt /tmp
    $ echo $?
    0
    现在尝试将一个文件拷入一个不存在的目录:
    $ cp ok.txt /usr/bin/aaa/bbb
    cp: cannot create regular file ‘/usr/bin/aaa/bbb’: No such file or directory
    $ echo $?
    1
      使 用$?检验返回状态,可知脚本有错误,但同时发现cp:cannot…,因此检验最后退出状态已没有必要。在脚本中可以用系统命令处理输出格式,要求 命令输出不显示在屏幕上。为此可以将输出重定向到/dev/null,即系统bin中。现在怎样才能知道脚本正确与否?好,这时可以用最后退出状态命令 了。请看上一个例子的此形式的实际操作结果。
    $ cp ok.txt /usr/bin/aaa/bbb >/dev/null 2>&1
    $ echo $?
    1
      通过将包含错误信息的输出重定向到系统bin中,不能获知最后命令返回状态,但是通过使用$!,(其返回值为1)可知脚本失败。检验脚本退出状态时,最好将返回值设置为一个有意义的名字,这样可以增加脚本的可读性。

    4.5 小结

      变量可以使shell编程更容易。它能够保存输入值并提高效率。shell变量几乎可以包含任
    何值。特定变量增强了脚本的功能并提供了传递到脚本的参数的更多信息。

    展开全文
  • Linux Shell变量类型

    千次阅读 2021-01-23 10:53:31
    Linux Shell 变量的类型 自定义变量类型 定义变量变量名=变量变量名必须以字母或者下划线开头,区分大小写 引用变量: $变量名 或者$(变量名) 查看变量: echo $ 变量名 set(包括自定义变量和环境变量) ...

    Linux Shell 变量的类型

    1. 自定义变量类型
      定义变量: 变量名=变量值 变量名必须以字母或者下划线开头,区分大小写
      引用变量: $变量名 或者$(变量名)
      查看变量: echo $ 变量名 set(包括自定义变量和环境变量)
      取消变量: unset环境变量
      作用范围: 仅在当前shell中有效
    [root@localhost ~]# vartest=123456
    [root@localhost ~]# echo $vartest
    123456
    [root@localhost ~]# echo ${vartest}  //在当前shell中起作用
    123456
    [root@localhost ~]# bash
    [root@localhost ~]# echo $vartest    //在子shell中不起作用
    
    [root@localhost ~]# exit
    exit
    [root@localhost ~]# echo ${vartest}
    123456
    
    
    1. 环境变量
      定义环境变量: 方法一 : export back_dir2=/home/test
      方法二 : export back_dir1 将自定义变量转换为环境变量
      引用环境变量: $变量名 或者$(变量名)
      查看环境变量: echo $ 变量名
      取消环境变量:unset 变量名
      变量作用范围:在当前shell和子shell有效
    [root@localhost ~]# export back_dir=/home/backup
    [root@localhost ~]# test_dir=/opt
    [root@localhost ~]# export test_dir
    [root@localhost ~]# echo $back_dir
    /home/backup
    [root@localhost ~]# echo $test_dir
    /opt
    [root@localhost ~]# env
    XDG_SESSION_ID=8
    HOSTNAME=localhost.localdomain
    SELINUX_ROLE_REQUESTED=
    HOME=/root
    back_dir=/home/backup
    [root@localhost ~]# unset back_dir   //取消环境变量
    [root@localhost ~]# unset test_dir
    [root@localhost ~]# echo $test_dir   //环境变量已取消 无输出
    
    [root@localhost ~]# echo $back_dir
    
    [root@localhost ~]# 
    
    
    展开全文
  • shell变量功能 sh和bash命令 两者都是shell,都是解析工具。...bash(Bourne Again SHell) 是Linux标准的默认shell ,它基于Bourne shell,吸收了C shell和Korn shell的一些特性。 sh(Bourne she...

    http://blog.csdn.net/pipisorry/article/details/43235263

    shell的变量功能

    sh和bash命令

    两者都是shell,都是解析工具。

    bash(Bourne Again SHell) 是Linux标准的默认shell ,它基于Bourne shell,吸收了C shell和Korn shell的一些特性。

    sh(Bourne shell )是UNIX标准的默认shell,它简洁(concise)、紧凑(compact)  、高效(fast) ,是由AT&T编写,属于系统管理shell。

    bash完全兼容Bourne shell,也就是说用Bourne shell的脚本不加修改可以在bash中执行。

    [bash命令查询 Bash Reference Manual]

    shell出现的问题

    Tab键不能补全的问题

    应该是在装某个软件的时候篡改了/etc/passwd文件,或者在创建用户的时候指定了shell为sh,导致tab键不能正常补全。

    解决办法

    root用户下修改/etc/passwd文件(该文件存储的是操作系统用户信息)

    正确的应该是如pika:x:1007:1007::/home/pika:/bin/bash

    可能是后面没有shell或者是/bin/sh导致的,修改或者加上去就可以了。

    Note: 没有指定为/bin/bash时使用ssh登录只显示$且不会加载.bashrc文件,而指定了就应该显示pika@bdi4-server:~$ 。

    变量的取用与设置:echo, 变量设置规则, unset

    echo输出重定向,echo命令向一个文件写入内容

    覆盖型写法 (文件里原来的内容被覆盖)
    echo "aaa" > a.txt
    echo aaa > a.txt
    添加型写法 (新内容添加在原来内容的后面)

    echo "aaa" >> a.txt

    Note: 如果echo "aaa" >> a.txt 1> /dev/null是不会追加到a.txt的,而echo "aaa" || tee -a a.txt 1> /dev/null可以

    echo显示多行字符串

    (echo "section: screens
            $(hostname):
            $client:
    end
    section: links
            $client:
                    right = $(hostname)
            $(hostname):
                    left = $client
    end
    ")

    注意括号不能去掉,如果括号去掉的话,那么只能写入最后一个! "也不能去掉!

    sudo对echo等命令提升权限

    sudo echo a > 1.txt
    -bash: 1.txt: Permission denied
    bash 拒绝这么做,说是权限不够.这是因为重定向符号 “>” 也是 bash 的命令。sudo 只是让 echo 命令具有了 root 权限,但是没有让 “>” 命令也具有root 权限,所以 bash 会认为这个命令没有写入信息的权限。

    解决:

    echo a |sudo tee -a 1.txt  // -a是追加的意思,等同于 >>

    将 sudo 的影响范围扩展到整条命令:sudo sh -c "echo a > 1.txt"

    [sudo对echo等命令提升权限]

    echo输出带颜色的字体

    echo要变换颜色的时候,要使用参数-e

    格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m"

     背景色:0 透明(使用终端颜色), 40 黑, 41 红, 42 绿, 43 黄, 44 蓝 45 紫, 46 青绿,47白(灰)
     前景色: 30 黑 31 红, 32绿, 33 黄, 34 蓝, 35 紫, 36 青绿, 37 白(灰)
     高亮度:高亮是1,不高亮是0。注意m后面紧跟字符串。

    如: echo -e "\033[31;1m wget export client=pika \033[0m"

    [echo输出带颜色的字体 ]

    环境变量的功能

    Shell script 的默认变量($0, $1...)

    /path/to/scriptname  opt1  opt2  opt3  opt4       $0             $1    $2    $3    $4
    

    执行的脚本文件名为 $0 这个变量,这些较为特殊的变量可以在 script 内使用来调用这些参数喔!

    • $# :代表后接的参数“个数”,以上表为例这里显示为“ 4 ”;
    • $@ :代表“ "$1" "$2" "$3" "$4" ”之意,每个变量是独立的(用双引号括起来);
    • $* :代表“ "$1<u>c</u>$2<u>c</u>$3<u>c</u>$4" ”,其中 <u>c</u> 为分隔字符,默认为空白键, 所以本例中代表“ "$1 $2 $3 $4" ”之意。

    那个 $@ 与 $* 基本上还是有所不同啦!不过,一般使用情况下可以直接记忆 $@ 即可。

    用 env 观察环境变量与常见环境变量说明

    用 set 观察所有变量 (含环境变量与自订变量)

    export: 自订变量转成环境变量

    所谓的环境变量与自订变量,那么这两者之间有啥差异呢?其实这两者的差异在于“ 该变量是否会被子程序所继续引用”啦!唔!那么啥是父程序?子程序? 这就得要了解一下指令的下达行为了。

    当你登陆 Linux 并取得一个 bash 之后,你的 bash 就是一个独立的程序,这个程序的识别使用的是一个称为程序识别码,被称为 PID 的就是。 接下来你在这个 bash 下面所下达的任何指令都是由这个 bash 所衍生出来的,那些被下达的指令就被称为子程序了。 我们可以用下面的图示来简单的说明一下父程序与子程序的概念:

    图10.2.3、程序相关性示意图

    因为子程序仅会继承父程序的环境变量, 子程序不会继承父程序的自订变量啦!所以你在原本 bash 的自订变量在进入了子程序后就会消失不见, 一直到你离开子程序并回到原本的父程序后,这个变量才会又出现!

    如果我能将自订变量变成环境变量的话,那不就可以让该变量值继续存在于子程序了? 呵呵!没错!此时,那个 export 指令就很有用。

    使用示例

    export ECLIPSE_URL='https://www.eclipse.org/downloads/download.php?file=/oomph/epp/neon/R1/eclipse-inst-linux64.tar.gz&mirror_id=1109'

    export a=string

    影响显示结果的语系变量 (locale)

    变量的有效范围

    变量键盘读取、阵列与宣告: read, array, declare

    与文件系统及程序的限制关系: ulimit

    变量内容的删除、取代与替换 (Optional)

    :符合取代文字的“最短的”那一个;:符合取代文字的“最长的”那一个

    配置$PATH

    Linux下环境变量path的配置,Linux系统中把***目录添加到PATH中。

    1.#   PATH=$PATH:/etc/apache/bin
    使用这种方法,只对当前会话有效,也就是说每当登出或注销系统以后(关闭terminal就会失效),PATH 设置就会失效
    2.$sudo  vi /etc/profile
    在适当位置添加 PATH=$PATH:/etc/apache/bin
    这种方法最好,除非你手动强制修改PATH的值,否则将不会被改变

    export JAVA_HOME=/opt/jdk1.8.0_73
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/
    export HADOOP_HOME=/usr/local/hadoop-2.6.4
    export SPARK_HOME=/opt/spark
    export PYSPARK_PYTHON=python3
    export PATH=$PATH:$JAVA_HOME/bin:$SPARK_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

    在/etc/profile中修改path,重启后path就成功设置了。如果用ssh localhost登录,不用重启自动设置了。直接新开terminal不重启则要source一下才生效。

    Note:

    1 包含需要用的其它变量时,PATH最好放最后,比如lz发现,ssh localhost登录时,如果乱序,PATH中有些值就是空的!

    2 $后面的变量应该可加{}也可不加{}。

    3 赋值时,应该可加""也可不加""。

    4 配置export的内容必须是实际目录,不能是ln -s软链接的目录。

    5 = 即等号两边不能有任何空格

    6 在修改了PATH值或任何环境变量后,都要用export将其输出,新的PATH值才能生效。

    3.#    vi ~/.bash_profile
    修改PATH行,把/etc/apache/bin添加进去
    这种方法是针对当前用户起作用的,ssh localhost并没有生效!

    当然也可以修改/etc/environment代替/etc/profile的修改

    pika:~$sudo vi /etc/environment

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
    PATH="$PATH:${JAVA_HOME}/bin:${SPARK_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin"
    export PATH
    export JAVA_HOME=/opt/jdk1.8.0_73
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/

    皮blog

     

     

    bash登录与欢迎信息

    bash 的进站与欢迎讯息

    /etc/issue

    虾密! bash 也有进站画面与欢迎讯息喔?真假?真的啊! 还记得在终端机接口 (tty1 ~ tty6) 登陆的时候,会有几行提示的字串吗?那就是进站画面啊! 那个字串写在哪里啊?呵呵!在 /etc/issue 里面啊!先来看看:
    [dmtsai@study ~]$ cat /etc/issue
    \S
    Kernel \r on an \m
    man issue 配合 man agetty 得到下面的结果:
    issue 内的各代码意义
    \d 本地端时间的日期;
    \l 显示第几个终端机接口;
    \m 显示硬件的等级 (i386/i486/i586/i686...);
    \n 显示主机的网络名称;
    \O 显示 domain name;
    \r 操作系统的版本 (相当于 uname -r)
    \t 显示本地端时间的时间;
    \S 操作系统的名称;
    \v 操作系统的版本。

    /etc/issue.net

    除了 /etc/issue 之外还有个 /etc/issue.net 呢!这是啥?这个是提供给 telnet 这个远端登陆程序用的。 当我们使用 telnet 连接到主机时,主机的登陆画面就会显示 /etc/issue.net 而不是 /etc/issue 呢!

    /etc/motd

    至于如果您想要让使用者登陆后取得一些讯息,例如您想要让大家都知道的讯息, 那么可以将讯息加入 /etc/motd 里面去

    皮blog

     

     

     

    bash的环境配置文件

    个人配置文件介绍

    环境配置文件: login, non-login shell, /etc/profile, ~/.bash_profile, source, ~/.bashrc, /etc/bash.bashrc

    login和non-login

    login 登录环境:指用户登录系统后的工作环境
    non-login 非登录环境:指用户调用子shell时所使用的用户环境
    login shell” 代表用户登入, 比如使用 “su -“ 命令, 或者用 ssh 连接到某一个服务器上, 都会使用该用户默认 shell 启动 login shell 模式。该模式下的 shell 会去自动执行 /etc/profile 和 ~/.profile 文件, 但不会执行任何的 bashrc 文件, 所以一般再 /etc/profile 或者 ~/.profile 里我们会手动去 source bashrc 文件。

    no-login shell 是我们在终端下直接输入 bash 或者 bash -c “CMD” 来启动的 shell。该模式下是不会自动去运行任何的 profile 文件。

    interactive shell 和 non-interactive shell

    interactive shell 是交互式shell, 顾名思义就是用来和用户交互的, 提供了命令提示符可以输入命令.

    该模式下会存在一个叫 PS1 的环境变量, 如果还不是 login shell 的则会去 source /etc/bash.bashrc 和 ~/.bashrc 文件

    non-interactive shell 则一般是通过 bash -c “CMD” 来执行的bash.

    该模式下不会执行任何的 rc 文件

    这些文件的的作用时机

        /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.此文件默认调用/etc/bash.bashrc文件。只有 Login 时,/etc/profile 文件才会被调用

        /etc/bashrc:为每一个运行bash shell的用户执行此文件.当bashshell被打开时,该文件被读取.

       ~/.profile    ~/.bash_profile ~/.bash_login:用户登录执行,source立即生效。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.~/.bash_profile 是交互式、login 方式进入 bash 运行的~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。

       ~/.bashrc(~/.bash_profile for OS X):每次打开新窗口时执行。该文件包含专用于你的bashshell的bash信息。与/etc/bashrc冲突则执行前者~。针对于用户的配置,应该将配置信息写入~/.bashrc文件。

       ~/.bash_logout:当每次退出系统(退出bashshell)时,执行该文件。
    Note: 编程中,如果你只是在terminal中运行代码,设置路径如SPARK_HOME时,可以只设置在~/.bashrc中;但是如果要在其它IDE如pycharm中执行,就要将SPARK_HOME设置在~/.profile中!!!

    Login shell的配置文件读取流程

    profile

    其实看名字就能了解大概了, profile 是某个用户唯一的用来设置环境变量的地方, 因为用户可以有多个 shell 比如 bash, sh, zsh 之类的, 但像环境变量这种其实只需要在统一的一个地方初始化就可以了, 而这就是 profile.

    bashrc

    bashrc 也是看名字就知道, 是专门用来给 bash 做初始化的比如用来初始化 bash 的设置, bash 的代码补全, bash 的别名, bash 的颜色. 以此类推也就还会有 shrc, zshrc 这样的文件存在了, 只是 bash 太常用了而已.


    /etc/enviroment
    /etc/profile 是所有用户的环境变量; /etc/enviroment是系统的环境变量
           登陆系统时shell读取的顺序应该是
                 /etc/profile ->/etc/enviroment -->$HOME/.profile   -->$HOME/.env
    如果同一个变量在用户环境(/etc/profile)和系统环境(/etc/environment)有不同的值那应该是以用户环境为准了。
    Note:
    奇怪的是,lz在/etc/enviroment中设置PATH后,每次重新打开terminal或者重启后必须执行. /etc/enviroment设置才会生效,无论是直接在linux系统中还是在docker中,所以如果想要设置所有用户的PATH变量,还是修改/etc/profile吧。
    修改/etc/profile source以后重新打开一个terminal并不会生效,要source一下;但是重启后打开terminal就会一直生效。
    修改~/.bashrc source以后重新打开一个terminal会生效,但是它切换用户后设置就无效了。

    工作环境设置文件

    环境设置文件有两种:系统环境设置文件 和 个人环境设置文件
    1.系统中的用户工作环境设置文件:
     登录环境设置文件:/etc/profile    
     非登录环境设置文件:/etc/bashrc

    2.用户个人设置的环境设置文件:
     登录环境设置文件: $HOME/.bash_profile   //这个是环境变量设置的地方,也定义别名的地方。打开关闭terminal立即生效。
     非登录环境设置文件:$HOME/.bashrc
    Note:
    1 ~/.bash_profile 都是在取得 login shell 的时候才会读取的配置文件,所以, 如果你将自己的偏好设定写入上述的档案后,通常都是得注销再登入后,该设定才会生效。
    2 直接读取配置文件而不注销登入:source 命令

    [root@www ~]# source ~/.bashrc 

    [root@www ~]# . ~/.bashrc

    利用 source 或小数点 (.) 都可以将配置文件的内容读取到目前的shell 环境中! 如我修改了 ~/.bashrc ,那么不需要注销,立即以 source ~/.bashrc 就可以将刚刚最新讴定的内容读取到目前环境中。

    这个方法的原理就是再执行一次/etc/profile shell脚本,注意如果用sh /etc/profile是不行的,因为sh是在子shell进程中执行的,即使PATH改变了也不会反应到当前环境中,但是source是在当前 shell进程中执行的,所以我们能看到PATH的改变。

    皮blog

    from:http://blog.csdn.net/pipisorry/article/details/43235263

    ref: SSH远程连接时环境变量问题

     

    展开全文
  • Linux shell 变量 数学 运算

    千次阅读 2017-02-22 20:36:14
    1) Linux shell 中使用 let , [ ] ,(( )) 三种运算符操作 shell 变量进行简单的基本运算; 2)Linux shell 中使用 expr 与 bc 两个程序实现高级运算; 1, Linux shell 变量的基本运算 数值作为常规变量...
    Abstract : 
    1)  Linux shell 中使用 let , [ ] ,(( )) 三种运算符操作 shell 变量进行简单的基本运算;
    2)Linux shell 中使用 expr 与 bc 两个程序实现高级运算;

    1, Linux shell 变量的基本运算

    数值作为常规变量直接赋值给变量,并且以字符串形式保存。

    1.1 let 命令可以用于直接执行基本操作:
            
    当我使用 let 的时候,我们不使用 $ 符号引用变量。

    1. no1=7;
    2. no2=8;

    3. echo "------------ let command -------------"
    4. let no1++;
    5. let no2--;
    6. let no1+=3;
    7. let no2-=5;
    8. let result=no1+no2;
    9. printf "let result=%d\n" $result;


    1.2 " [ ] "运算符跟 let 命令很相似:

    "[ ]" 运算符里面可以使用 $ 符号引用变量,同时支持变量名与运算符之间不带空格。

    1. echo "----------------- [] operator ----------------"
    2. printf "no1:%d no2:%d \n" $no1 $no2;
    3. result1=$[ no1 + no2 ];
    4. printf "result1 = %d \n" $result1;
    5. result2=$[no1+no2 + 7];
    6. printf "result2 = %d \n" $result2;
    7. result3=$[ $no1+$no2+];
    8. printf "result3 = %d \n" $result3;
    9. no2=$[ no2 + 1 ];
    10. printf "no1 = %d no2 = %d \n" $no1 $no2;


    1.3 " (( )) " 运算符跟 " [ ] " 运算符一样:
    同样支持使用 $ 符号引用变量进行基本运算,同时支持变量名与运算符之间不带空格
    1. echo "----------------- (( )) operator --------------"
    2. printf "no1: %d no2: %d \n" $no1 $no2;
    3. result1=$(( no1 + no2 ));
    4. printf "result1 = %d \n" $result1;
    5. result2=$((no1+no2+3));
    6. printf "result2 = %d \n" $result2;
    7. result3=$(( $no1+$no2 + 5))
    8. printf "result3 = %d \n" $result3;


    1.4 "expr" 命令同样可以用于变量的基本运算:
    "expr" 命令同样支持 $ 符号引用变量进行基本运算,但是变量与运算符之间必须使用空格作为分隔符;
    在使用 "expr" 命令对变量进行运算后,整个表达式必须使用 " · expression · " 的模式赋值给变量,即包含在 " ` " 符里面,
    并且等效于 " $( expression ) " 模式。


    1. echo "---------------- expr command ---------------"
    2. printf "no1: %d no2: %d \n" $no1 $no2;
    3. result1=`expr 3 + 4`;
    4. printf "result1 = %d \n" $result1;
    5. result2=`expr $no1 + 4`;
    6. printf "result2 = %d \n" $result2;
    7. result3=`expr $no1 + $no2`;
    8. printf "result3 = %d \n" $result3;
    9. result4=`expr $no1+$no2`;
    10. printf "result4 = %d \n" $result4;
    11. result5=$(expr $no1 + 3);
    12. printf "result5 = %d \n" $result5;
    13. result6=$(expr $no1+4);
    14. printf "result6 = %d \n" $result6;
    15. result7=$(expr $no1+$no2);
    16. printf "result7 = %d \n" $result7;

    由上图实验结果所示," expr " 命令的表达式中,变量与运算符之间必须使用空格作为分隔符,
    有一点我没搞明白的就是为什么42行的表达式已经错了,为什么在43行才报错。

    " expr " 还支持许多运算表达式,大家在终端打个 expr --help 命令看看吧,o(∩_∩)o 哈哈。。。

    上面所述的四种shell中执行变量运算的方式中不支持浮点运算!

    2, Linux shell 中使用 bc 命令实现高级数学运算:

    bc 命令使用 标准输入 stdin 作为输入;
    bc 是一个支持精确的浮点运算的高级计算器;
    bc 拥有相当多的输入选项,并且支持数学函数调用;
    执行 bc --help 自行查看 bc 所支持的输入选项;

    2.1 bc 命令使用标准输入 stdin 作为输入,并且支持浮点运算:
    1. echo "----------------- bc command ----------------"
    2. echo "4 * 0.56" | bc;
    3. no=48;
    4. result1=`echo "$no * 1.5" | bc`;
    5. echo "result1 = $result1";


    2.2 bc 命令支持运算精度设置:

    通过附加参数可以给 bc 指定运算精度;
    附加参数使用分号 " ; " 作为分隔符;

    1. result2=`echo "scale=9;$no / 3;" | bc`;
    2. echo "result2 = $result2";


    实验结果所示,使用分号 " ; " 加入附加参数 scale ,指定精度为 9 位小数;

    2.3 使用 bc 进行数值的记数进制间转换:

    通过 ibase=value 作为附加参数,指定输入变量的记数进制;
    通过 obase=value 作为附加参数,指定输出变量的记数进制;

    1. no=100;
    2. echo "echo \"obase=2;ibase=10;$no\" | bc = `echo "obase=2;ibase=10;$no" | bc`";
    3. no=1000;
    4. echo "echo \"scale=5;obase=10;ibase=2;$no/3\" | bc = `echo "scale=5;obase=10;ibase=2;$no/3" | bc`";


    2.4 使用 bc 调用数学公式进行高级数学运算:

    " sqrt(value) " 执行 value 的开方运算;
    " value^index " 执行 value 的幂运算;

    1. echo "sqrt(100) = `echo "sqrt(100)" | bc`";
    2. echo "sqrt(100) = $(echo "sqrt(100)" | bc)";
    3. echo "10^3 = `echo "10^3" | bc`";
    4. echo "10^3 = $(echo "10^3" | bc)";

    展开全文
  • Linux Shell变量

    千次阅读 2012-02-21 21:58:01
    转自:http://www.xxlinux.com/linux/article/development/shell/2006-07-16/2802.html 在Shell中有三种变量:系统变量,环境变量,用户变量。其中用户变量在编程过程中使用最多,系统变量在对参数...
  • ####################################################### ...1.定义变量时,变量名不加美元($)符号 2.变量名和等号之间不能有空格 3.变量名的命令遵循如下规则:  首个字符必须为字母(a-z / A-Z)
  • 命令: ./myshell.sh 后缀可以是任何,...set 显示当前shell中所有变量 $HOME、$PWD、$SHELL、$USER 变量=值 unset 变量 readonly 变量=值 命令的返回值: A=`ls -la` A=$(date) 一、为什么要学习Shell编程...
  • linux shell只读变量如何删除

    千次阅读 2019-10-24 15:23:22
    linux shell只读变量如何删除 source /etc/profile 出现 bash:PROMPT-COMMAND: 只读变量 利用unset命令是无法删除只读变量的 如果你linux中没有gdb命令的话,下载一下 sudo yum install gdb 下载好之后 ...
  • Linux系统shell脚本变量变量赋值

    千次阅读 2020-07-07 08:28:38
    a=100 c=a b=${a} 上面代码中, 第一行代码,将变量a赋值100; 第二行代码,将变量c赋值为字符a; 第三行代码,将变量b赋值为a的值100 。
  • Linux Shell变量使用

    千次阅读 2006-03-01 11:41:00
    一、本地变量的使用本地变量就如同局部变量一样,只在本SHELL中起作用。...显示所有本地SHELL变量SHELL中预定义了一些环境变量。要想显示这些命令,可以使用set命令。另外,用户自己已经定义过的本地变量也会在其中显示
  • Linux Shell变量的使用

    千次阅读 2010-10-26 14:03:00
    显示所有本地SHELL变量SHELL中预定义了一些环境变量。要想显示这些命令,可以使用set命令。另外,用户自己已经定义过的本地变量也会在其中显示。4。测试变量是否已经赋值${variable:-value}如果变量已经赋值,则使用...
  • linux超级基础系列——shell变量(本地变量和环境变量) 为使shell编程更有效,系统提供了一些shell变量shell变量可以保存诸如路径名、文件名或者一个数字这样的变量名。shell将其中任何设置都看做文本字符...
  • linux shell变量的使用规则

    千次阅读 2018-01-31 16:21:00
    1.变量变量内容以一个等号”=”连接 2.等号两边不能存在空格字符 3.变量名称只能是英文字母或者数字,但是开头字符不能是数字 4.变量内容若有空格符可使用双引号或者单引号将变量内容结合起来,但是 5.可以使用...
  • Linux Shell 变量自加

    万次阅读 2016-03-21 14:42:55
    Linux Shell中写循环时,常常要用到变量的自增,现在总结一下整型变量自增的方法。 我所知道的,bash中,目前有五种方法: 1. i=`expr $i + 1`; 2. let i+=1; 3. ((i++)); 4. i=$[$i+1]; 5. i=$(( $i
  • linux shell变量获取执行结果

    千次阅读 2017-07-01 16:02:13
    linux shell变量获取执行结果将一条命令的执行结果赋给一个变量的方法有:1、使用反引号`` (数字键1左边的键,tab键上面,英文方式输入)如:a=`echo "hello world"`;即将命令 echo "hello world"的输出赋给变量a2、...
  • 引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符,而不会有特殊符号。我们以底下的例子做说明:假设您定义了一个变量, name=VBird ,现在想以 name 这个变量的内容定义出 my...
  • linux shell 使用变量和环境变量

    千次阅读 2018-12-08 13:23:41
    1. 使用env或printenv命令查看当前shell中定义的全部环境变量 2. 查看进程相关环境变量。首先根据进程名获取进程ID: ps -ef | grep sshd  &gt;# root 1795 1 0 11:55 ? 00:00:00 /usr/sbin/sshd -D  ...
  • linuxshell变量$#,$@,$0,$1,$2的含义解释 linuxshell变量$#,$@,$0,$1,$2的含义解释:  变量说明:  $$  Shell本身的PID(ProcessID)  $!  Shell最后运行的后台Process的PID  $?  最后运行的...
  • linux shell脚本 变量变量赋值

    千次阅读 2016-08-24 13:11:41
    SPLIT_NAME=`expr $2`
  • a=0 方法1: 使用let结合 a++ let a++ let 'a++' let "a++" 方法2: 使用let结合+= let a=a+1 let a+=1 .../bin/bash a=0 ##6种shell变量+1方式 ((a++)) a=$(($a+1)) a=$[$a+1] let a++ let a+=1 a=`expr $a+1` echo $a
  • LINUX SHELL 变量的二次引用

    千次阅读 2019-02-13 10:16:40
    感叹号的使用 aaa=123 bbb=aaa echo $bbb echo ${!bbb} eval的使用 aaa=123 bbb=aaa echo $bbb eval ccc=\${$bbb} echo $ccc 输出结果都是下面的情况: aaa 123 参考:...
  • [Linux] :shell变量包括两种变量

    千次阅读 2011-09-25 10:29:55
    【注意】在赋值的时候,等号两边不能有空格,否则该语句被视为命令以及其...shell变量包括两种变量 1.本shell私有的变量:通过赋值语句定义好的变量,可以通过如下方法定义shell变量  A1="1234"  delcare A2=
  • linux shell环境变量总结

    千次阅读 2016-05-28 13:52:51
    用户登录时就是打开一个shell进程,其会加载profile和bashrc文件中的变量,其变量就是环境变量,是所有其子进程全局变量。 所以每次登陆一个终端都是重新打开一个shell进程,会重新加载环境变量,因此之前设置的...
  • Linux Shell 变量 字符串截取

    千次阅读 2014-06-02 09:37:10
    假设有变量 var=...其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符 即删除 http:// 结果是 :www.linuxidc.com/test.htm 二 ## 号截取,删除左边字符

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 249,461
精华内容 99,784
关键字:

linux查看shell变量

linux 订阅