美文网首页
认识Bash

认识Bash

作者: 南风nanfeng | 来源:发表于2018-11-26 10:11 被阅读15次

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』
    1. 变量名称只能是英文字母与数字,且开头字符不能是数字。
  • 4.变量内容若有空格,可用双引号『"』或单引号『'』连接起来,但有特别之处:
第一、双引号内的特殊字符如$等,可以保有原本的特性,如下所示:
『var="lang is $LANG"』则『echo $var』可得『lang is en_US』
第二、单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』
    1. 可用跳脱字符『\ 』 将特殊符号(如 [Enter], $, , 空格符, '等)转成一般字符
    1. 在一串指令中,还需要借由其他的指令提供的信息,可以使用反单引号『指令』或 『$(指令)』 。特别注意,那个 ` 是键盘上方的数字键 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
    1. 若该变量为扩增变量内容时,则可用 "变量名称" 或{变量} 累加内容,如下所示:
『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. 路径与指令搜寻顺序

  1. 以相对/绝对路径执行命令,例如『/bin/ls 』或『./ls 』;
  2. 由alias找到该命令执行;
  3. 由 bash 内建的(builtin)命令执行;
  4. 透过 $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

相关文章

  • 认识Bash

    1. 取用变量 你可以利用echo命令取用变量, 但是,变量在被取用时,前面必须要加上符号『$ 』才行,举例来说,...

  • 第11章 认识与学习 bash

    第11章 认识与学习 bash 标签: 鸟哥的linux私房菜 [toc] 11.1认识bash这个shell 什...

  • Linux 之 Bash -- 认识Bash这个shell

    如果经常接触“使用Linux的大神们”,听他们的讨论,就应该不会对“shell”陌生,它是我们下达命令的一种方式。...

  • 认识bash这个shell

    认识bash这个shell 1.硬件 内核和shell 我们必须通过shell将我们输入的命令与内核通信,好让内核...

  • 认识Bash这个Shell

    介绍 shell(壳) 首先要明白shell是用户和计算机打交道的一个入口,用户给shell发命令,shell和内...

  • 1.认识Bash

    1.什么是shell Shell是内核和用户操作沟通的桥梁,用于用户和内核沟通 2.Bash Bash 【Bour...

  • 认识与学习bash

  • 软件安全-ShellShock攻击

    Shellshock Attack 概述认识环境变量&&bash1.普通shell变量和bash 从上述实验中我们...

  • day02-Linux学习 Bash基础

    一、Bash Shell初步认识 1.什么是Bash Shell(壳)? 命令解释器, 将用户输入的命令,翻译给内...

  • Linux学习日记——BASH

    一、认识BASH BASH是目前Linux系统应用最多的shell,也是大多数Linux系统默认的shell. s...

网友评论

      本文标题:认识Bash

      本文链接:https://www.haomeiwen.com/subject/zkmjsftx.html