1. 取用变量
你可以利用echo命令取用变量, 但是,变量在被取用时,前面必须要加
上符号『$ 』才行,举例来说,要知道 PATH 的内容,该如何是好:
# echo $PATH
/root/perl5/bin:/root/software/jdk1.8.0_144/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# echo ${PATH}
/root/perl5/bin:/root/software/jdk1.8.0_144/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
变量的取用如上,利用echo命令可读取变量,还是一种取用方式是『${PATH}』。
那么我要如何『设定』或者是『修改』某个变量的内容呢?
很简单啦!用『等号(=)』连接变量与他的内容就好啦!举例来说: 我要将 myname 这个变量名称的内容讴定为 James ,那么:
#myname=James
#echo $myname
James
另外,变量在设定时,需要符合规格,否则会设定失败! 规则如下所示:
- 1.变量与变量的内容以一个等号『=』连结,如上所示。
- 2.等号两边不能直接接空格符,如下所示为错误:
『myname = VBird』或『myname=VBird Tsai』
- 变量名称只能是英文字母与数字,且开头字符不能是数字。
- 4.变量内容若有空格,可用双引号『"』或单引号『'』连接起来,但有特别之处:
第一、双引号内的特殊字符如$等,可以保有原本的特性,如下所示:
『var="lang is $LANG"』则『echo $var』可得『lang is en_US』
第二、单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』
- 可用跳脱字符『\ 』 将特殊符号(如 [Enter], $, , 空格符, '等)转成一般字符
- 在一串指令中,还需要借由其他的指令提供的信息,可以使用反单引号『
指令
』或 『$(指令)』 。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的设定:
- 在一串指令中,还需要借由其他的指令提供的信息,可以使用反单引号『
[root@localhost ~]# version=`uname -r`
[root@localhost ~]# echo $version
3.10.0-327.el7.x86_64
[root@localhost ~]# version=$(uname -r)
[root@localhost ~]# echo $version
3.10.0-327.el7.x86_64
- 若该变量为扩增变量内容时,则可用 "
{变量} 累加内容,如下所示:
- 若该变量为扩增变量内容时,则可用 "
『PATH="$PATH":/home/bin』
- 8.若该变量需要在其他子程序执行,则需要以 export 使变量变成环境变量:
『export PATH』
-9.取消变量,使用unset。
# unset version
2. 环境变量的功能
- 用 env 观察环境变量与常见环境变量说明
- 用 set 观察所有变量 (包含环境变量和自定义变量):
bash不只有环境变量,还有一些与bash操作接口有关的变量,以及用户自己定义的变量。那么这些变量如何观察呢?这个时候就得要使用 set 这个命令了。 set 除了环境变量之外, 还会将其他在 bash内的变量通通显示。 -
export: 自定义变量转成环境变量:
谈了 env、set 现在知道有所谓的环境变量与自定义变量,那么这两者有啥差异呢?其实这两者的差异在于『该变量是否会被子程序所继续引用』那么什么是父程序?子程序? 这就得要了解一下。
当你登入 Linux 并取得一个 bash之后,你的bash 就是一个独立的程序,被称为PID的就是。 接下来你在这个 bash 底下所下达的任何命令都是由这个 bash 所衍生出来的,那些被下达癿命令就被称为子程序。 我们可以用底下的图示简单的说明一下父程序与子程序的概念。
父程序与子程序.jpg
这个程序概念与变量有啥关系?关系可大了!因为子程序仅会继承父程序的环境变量,子程序不会继承父程序的自定义变量啦!所以你在原本bash的自定义变量在进入了子程序后就会消失不见,一直等你离开子程序并回到原本的父程序后,这个变量才会又出现!
换个角度想,如果我能将自定义变量变成环境变量,那么就可以让该变量值继续存在于子程序了? 呵呵!没错!此时,那个export命令就很有用啦!如你想要让该变量内容继续的在子程序中使用,那么就请执行:
export 变量名称
如果仅仅输入【export】,不接任何变量时,那么系统把所以的变量秀出来:
[nubiadmin@sell130 ~]$ export
declare -x CLASSPATH=".:/usr/java/jdk1.8.0_161/lib:/usr/java/jdk1.8.0_161/jre/lib"
declare -x COBBLER_SERVER="172.17.12.1"
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/home/nubiadmin"
declare -x HOSTNAME="sell130"
declare -x JAVA_HOME="/usr/java/jdk1.8.0_161"
declare -x JRE_HOME="/usr/java/jdk1.8.0_161/jre"
declare -x LANG="en_US.UTF-8"
declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="nubiadmin"
declare -x LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:"
declare -x MAIL="/var/spool/mail/nubiadmin"
declare -x OLDPWD
declare -x PATH="/usr/java/jdk1.8.0_161/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/nubiadmin/.local/bin:/home/nubiadmin/bin"
declare -x PWD="/home/nubiadmin"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_CLIENT="10.206.16.68 54227 32768"
declare -x SSH_CONNECTION="10.206.16.68 54227 10.206.2.130 32768"
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm"
declare -x USER="nubiadmin"
declare -x XDG_RUNTIME_DIR="/run/user/1002"
declare -x XDG_SESSION_ID="1826"
那如何将环境变量转成自定义变量呢?可以使用本章后续介绍的declare呢!
3. 变量键盘读取、数组与宣告: read, array, declare
- read
要读取来自键盘输入的变量,就是用 read 。这个命令最常被用在 shell script 的撰写当中。
[root@www ~]# read [-pt] variable
选项与参数:
-p :后面可以接提示字符!
-t :后面可以接等待的『秒数!』
variable 接收大变脸名
[root@localhost ncdc]# read -p "Please keyin your name: " -t 30 named
Please keyin your name: Melody
[root@localhost ncdc]# echo $named
Melody
- declare / typeset
declare 与 typeset 是一样的功能,就是在『宣告变量的类型』。如果使用 declare 后面没有接任何参数,那么 bash 就会主动的将所有的变量名称与内容通通读出来,就好像使用 set 一样啦! 那么declare 还有什么用户呢?看看先:
[root@www ~]# declare [-aixr] variable
选项与参数:
-a :将后面名为 variable的变量定义成为数组 (array) 类型
-i :将后面名为 variable的变量定义成为整数数字 (integer) 类型
-x :用法与export一样,就是将后面的variable变成环境变量;
-r :将变量设定成为 readonly 类型,该变量不可被更改内容,也不能 unset
[root@localhost ncdc]# sumVal=1+1
[root@localhost ncdc]# echo $sumVal
[root@localhost ncdc]# declare | grep sumVal //sumVal默认是文本类型的取值
sumVal=1+1
[root@localhost ncdc]# declare -i sumVal=1+1
[root@localhost ncdc]# echo $sumVal
2
由于在默认的情况底下, bash对于变量有几个基本的定义:
第一、 变量类型默认为『字符串』,所以若不设定变量类型,则 1+2 为一个『字符串』而不是『计算式』。 所以上述第一个执行的结果才会出现那个情况癿;
第二、 bash 环境中的数值运算,预设最多仅能够达整数形态,所以 1/3 结果是 0;
现在你晓得为啥你需要变量宣告了吧?如果需要非字符串类型的变量,那就得要进行变量的宣告才行啦! 底下继续来玩些其他的declare功能:
范例二:将 sum变成环境变量
[root@www ~]# declare -x sum
[root@www ~]# export | grep sum
declare -ix sum="450" <==果然出现了!包括有 i 与 x 的宣告!
范例三:将sum 变成只读属性,不可更改!
[root@www ~]# declare -r sum
[root@www ~]# sum=tesgting
-bash: sum: readonly variable
范例四:将 sum 变成非环境变量的自定义变量吧!
[root@www ~]# declare +x sum <== 将 - 变成 + 可以进行『取消』动作
[root@www ~]# declare -p sum <== -p 可以单独列出变量的类型
declare -ir sum="450" <== 看吧!叧剩下 i, r 癿类型,不具有 x 啰!
- 数据(array)变量类型
在bash中,数组的设定:
var[index]=content
数组的变量类型比较有趣的地方在于『读取』,一般来说,建议直接以 ${数组} 的方式。
- 与文件系统及程序的限制关系: ulimit
4. 路径与指令搜寻顺序
- 以相对/绝对路径执行命令,例如『/bin/ls 』或『./ls 』;
- 由alias找到该命令执行;
- 由 bash 内建的(builtin)命令执行;
- 透过 $PATH 这个变量的顺序搜寻到的第一个命令。
5. 特殊符号释义
- $:(关于当前shell的PID)
$本身具有含有含义,代表当前shell线程id,即所谓的PID,【echo $$】可以查看。 - ?:(关于上个执行指令的回传指)
?也是一个bash变量,且非常重要。当我们执行一个指令的时候,会得到一个回传的代码,一般来说如果成功执行指令,回传值为0,如果执行错误,则会回传错误代码,一般为非0值。【echo $?】
6.变量的删除与取代
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
网友评论