Bash Shell 学习记录(二)

查看变量

  1. 仅查看环境变量: env 或 export (不带任何参数)

    部分环境变量的定义如下:

    1. HOME : 家目录
    2. SHELL : 目前这个环境使用的 SHELL 是哪支程序? (Linux 默认使用 /bin/bash
    3. HISTSIZE : 系统记录历史命令的容量
    4. PATH : 运行文件搜寻的路径啦~目录与目录中间以冒号(:)分隔, 由于文件的搜寻是依序由 PATH 的变量内的目录来查询,所以,目录的顺序也是重要的
    5. LANG : 系统那个当前的语言环境
  2. 查看环境变量和自定义变量: set 或 declare (不带任何参数)

    bash 不只有环境变量,还有一些与 bash 操作接口有关的变量,以及用户自己定义的变量存在的。 那么这些变量如何观察呢?这个时候就得要使用 set 这个命令了。 set 除了环境变量之外, 还会将其他在 bash 内的变量通通显示出来!

    与 bash 操作接口有关的变量举例(不是环境变量,也不是用户自定义变量):

    1. PS1 : 提示字符的配置,即:pc@pc-Lenovo:/work$ 。 当我们每次按下 [Enter] 按键去运行某个命令后,最后要再次出现提示字符时, 就会主动去读取这个变量值了。可以用 man bash 去查询一下 PS1 的相关说明。
    2. $ : 关于本 shell 的 PID,代表的是『目前这个 Shell 的线程代号』,亦即是所谓的 PID (Process ID)。 可以用:『 echo $$ 』查看PID 值。
    3. ? : 关于上个运行命令的回传值。当我们运行某些命令时, 这些命令都会回传一个运行后的代码。一般来说,如果成功的运行该命令, 则会回传一个 0 值,如果运行过程发生错误,就会回传『错误代码』。举例如下:

      [root@www ~]# echo $SHELL
      /bin/bash                                  <==可顺利显示!没有错误!
      [root@www ~]# echo $?
      0                                          <==因为没问题,所以回传值为 0
      [root@www ~]# 12name=VBird
      -bash: 12name=VBird: command not found     <==发生错误了!bash回报有问题
      [root@www ~]# echo $?
      127                                        <==因为有问题,回传错误代码(非为0)
      
      #错误代码回传值依据软件而有不同,我们可以利用这个代码来搜寻错误的原因喔!
      
      [root@www ~]# echo $?
      0
      
      # 咦!怎么又变成正确了?这是因为 "?" 只与『上一个运行命令』有关,所以,我们上一个命令是运行『 echo $? 』,当然没有错误,所以是 0 没错!
      
    4. OSTYPE, HOSTTYPE, MACHTYPE : 主机硬件与核心的等级信息相关变量

自定义变量转成环境变量(export

  1. 环境变量与自定义变量的差异在于『 该变量能否被子程序所继续引用』。因为子程序仅会继承父程序的环境变量, 不会继承父程序的自定义变量。

  2. 转化方法:[root@www ~]# export 变量名称

影响显示结果的语系变量

  1. 查看Linux 支持了多少语系:[root@www ~]# locale -a

  2. 查看相关语系变量的配置: [root@www ~]# locale 如下:

    [root@www ~]# locale  <==后面不加任何选项与参数即可!
    LANG=en_US                   <==主语言的环境
    LC_CTYPE="en_US"             <==字符(文字)辨识的编码
    LC_NUMERIC="en_US"           <==数字系统的显示信息
    LC_TIME="en_US"              <==时间系统的显示数据
    LC_COLLATE="en_US"           <==字符串的比较与排序等
    LC_MONETARY="en_US"          <==币值格式的显示等
    LC_MESSAGES="en_US"          <==信息显示的内容,如菜单、错误信息等
    LC_ALL=                      <==整体语系的环境
    
    当我们使用 locale 时,系统是列出目前 Linux 主机内保有的语系文件, 这些语系文件都放置在: /usr/lib/locale/ 这个目录中
    
    如果其他的语系变量都未配置, 且你有配置 LANG 或者是 LC_ALL 时,则其他的语系变量就会被这两个变量所取代! 这也是为什么我们在 Linux 当中,通常说明仅配置 LANG 这个变量而已,因为他是最主要的配置变量
  3. 使用者可以自己去调整自己喜好的语系,整体系统默认的语系定义位置如下:

    CentOS 5.x : /etc/sysconfig/i18n
    ubuntu : /etc/default/locale

变量键盘读取、数组与宣告: read, array, declare

  1. 从键盘读取变量值 :

    [root@www ~]# read [-pt] variable
    选项与参数:
    -p  :后面可以接提示字符!
    -t  :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!
    
    范例一:让用户由键盘输入一内容,将该内容变成名为 atest 的变量
    [root@www ~]\# read atest
    This is a test        <==此时光标会等待你输入!请输入左侧文字看看
    [root@www ~]\# echo $atest
    This is a test          <==你刚刚输入的数据已经变成一个变量内容!
    
    范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串作为名为 named  的变量内容
    [root@www ~]# read -p "Please keyin your name: " -t 30 named
    Please keyin your name: VBird Tsai   <==注意看,会有提示字符喔!
    [root@www ~]# echo $named
    VBird Tsai        <==输入的数据又变成一个变量的内容了!
  2. 宣告变量的类型 : declaretypeset 是一样的功能,就是在『宣告变量的类型』。举例:

    [root@www ~]# declare [-aixr] variable
    选项与参数:
    -a  :将后面名为 variable 的变量定义成为数组 (array) 类型
    -i  :将后面名为 variable 的变量定义成为整数数字 (integer) 类型
    -x  :用法与 export 一样,就是将后面的 variable 变成环境变量;
    -r  :将变量配置成为 readonly 类型,该变量不可被更改内容,也不能 unset
    
    范例一:让变量 sum 进行 100+300+50 的加总结果
    [root@www ~]# sum=100+300+50
    [root@www ~]# echo $sum
    100+300+50  <==咦!怎么没有帮我计算加总?因为这是文字型态的变量属性啊!
    [root@www ~]# declare -i sum=100+300+50
    [root@www ~]# echo $sum
    450         <==瞭乎??
    
    由于在默认的情况底下, bash 对于变量有几个基本的定义:
    1.变量类型默认为『字符串』,所以若不指定变量类型,则 1+2 为一个『字符串』而不是『计算式』。 所以上述第一个运行的结果才会出现那个情况的;
    2.bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0;
    
    范例二:将 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 啰!
  3. 数组 (array) 变量类型 :

    1. 在 bash 里头,数组的配置方式是:var[index]=content
    2. 举例:
      范例:配置上面提到的 var[1] ~ var[3] 的变量。
      [root@www ~]# var[1]="small min"
      [root@www ~]# var[2]="big min"
      [root@www ~]# var[3]="nice min"
      [root@www ~]# echo "${var[1]}, ${var[2]}, ${var[3]}"
      small min, big min, nice min

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

  1. 我们的 bash 是可以『限制用户的某些系统资源』的,包括可以开启的文件数量, 可以使用的 CPU 时间,可以使用的内存总量等等。举例:

    [root@www ~]# ulimit [-SHacdfltu] [配额]
    选项与参数:
    -H  :hard limit ,严格的配置,必定不能超过这个配置的数值;
    -S  :soft limit ,警告的配置,可以超过这个配置值,但是若超过则有警告信息。
      在配置上,通常 soft 会比 hard 小,举例来说,soft 可配置为 80 而 hard 
      配置为 100,那么你可以使用到 90 (因为没有超过 100),但介于 80~100 之间时,
      系统会有警告信息通知你!
    -a  :后面不接任何选项与参数,可列出所有的限制额度;
    -c  :当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除错用),
      这种文件就被称为核心文件(core file)。此为限制每个核心文件的最大容量。
    -f  :此 shell 可以创建的最大文件容量(一般可能配置为 2GB)单位为 Kbytes
    -d  :程序可使用的最大断裂内存(segment)容量;
    -l  :可用于锁定 (lock) 的内存量
    -t  :可使用的最大 CPU 时间 (单位为秒)
    -u  :单一用户可以使用的最大程序(process)数量。
    
    范例一:列出你目前身份(假设为root)的所有限制数据数值
    [root@www ~]# ulimit -a
    core file size          (blocks, -c) 0          <==只要是 0 就代表没限制
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited  <==可创建的单一文件的大小
    pending signals                 (-i) 11774
    max locked memory       (kbytes, -l) 32
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 1024       <==同时可开启的文件数量
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    real-time priority              (-r) 0
    stack size              (kbytes, -s) 10240
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 11774
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
    
    范例二:限制用户仅能创建 10MBytes 以下的容量的文件
    [root@www ~]# ulimit -f 10240
    [root@www ~]# ulimit -a
    file size               (blocks, -f) 10240 <==最大量为10240Kbyes,相当10Mbytes
    [root@www ~]# dd if=/dev/zero of=123 bs=1M count=20
    File size limit exceeded <==尝试创建 20MB 的文件,结果失败了!
  2. 想要复原 ulimit 的配置最简单的方法就是注销再登陆,否则就是得要重新以 ulimit 配置才行! 不过,要注意的是,一般身份使用者如果以 ulimit 配置了 -f 的文件大小, 那么他『只能继续减小文件容量,不能添加文件容量喔!』

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

  1. 变量内容的删除与取代

    变量配置方式        说明
    ${变量#关键词}      若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除
    ${变量##关键词}     若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除
    ${变量%关键词}      若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除
    ${变量%%关键词}     若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据删除
    ${变量/旧字符串/新字符串}    若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』
    ${变量//旧字符串/新字符串}   若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』
    
    范例一:先让小写的 path 自定义变量配置的与 PATH 内容相同
    [root@www ~]# path=${PATH}
    [root@www ~]# echo $path
    /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
    /usr/sbin:/usr/bin:/root/bin  <==这两行其实是同一行啦!
    
    范例二:假设我不喜欢 kerberos,所以要将前两个目录删除掉,如何显示?
    [root@www ~]# echo ${path#/*kerberos/bin:}
    /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    
    范例三:我想要删除前面所有的目录,仅保留最后一个目录
    [root@www ~]# echo ${path#/*:}
    /usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:
    /root/bin     <==这两行其实是同一行啦!
     # 由于一个 # 仅删除掉最短的那个,因此他删除的情况可以用底下的删除线来看:
     # /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
     # /usr/sbin:/usr/bin:/root/bin  <==这两行其实是同一行啦!
    
    [root@www ~]# echo ${path##/*:}
    /root/bin
     # 嘿!多加了一个 # 变成 ## 之后,他变成『删除掉最长的那个数据』!亦即是:
     # /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
     # /usr/sbin:/usr/bin:/root/bin  <==这两行其实是同一行啦!
    
    范例四:我想要删除最后面那个目录,亦即从 : 到 bin 为止的字符串
    [root@www ~]# echo ${path%:*bin}
    /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
    /usr/sbin:/usr/bin  <==注意啊!最后面一个目录不见去!
     # 这个 % 符号代表由最后面开始向前删除!所以上面得到的结果其实是来自如下:
     # /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
     # /usr/sbin:/usr/bin:/root/bin  <==这两行其实是同一行啦!
    
    范例五:那如果我只想要保留第一个目录呢?
    [root@www ~]# echo ${path%%:*bin}
    /usr/kerberos/sbin
     # 同样的, %% 代表的则是最长的符合字符串,所以结果其实是来自如下:
     # /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
     # /usr/sbin:/usr/bin:/root/bin  <==这两行其实是同一行啦!
    
    范例六:将 path 的变量内容内的 sbin 取代成大写 SBIN:
    [root@www ~]# echo ${path/sbin/SBIN}
    /usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
    /usr/sbin:/usr/bin:/root/bin
     # 这个部分就容易理解的多了!关键词在于那两个斜线,两斜线中间的是旧字符串
     # 后面的是新字符串,所以结果就会出现如上述的特殊字体部分啰!
    
    [root@www ~]# echo ${path//sbin/SBIN}
    /usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/SBIN/usr/local /bin:/SBIN:/bin:
    /usr/SBIN:/usr/bin:/root/bin 
     # 如果是两条斜线,那么就变成所有符合的内容都会被取代喔!
  2. 变量的测试与内容替换 :

    变量配置方式         str没有配置          str为空字符串         str已配置非为空字符串
    var=${str-expr}     var=expr            var=                 var=$str
    var=${str:-expr}    var=expr            var=expr             var=$str
    var=${str+expr}     var=                var=expr             var=expr
    var=${str:+expr}    var=                var=                 var=expr
    var=${str=expr}     str=expr;var=expr 	str不变;var=          str不变;var=$str
    var=${str:=expr}    str=expr;var=expr 	str=expr;var=expr    str不变;var=$str
    var=${str?expr}     expr输出至stderr     var=                 var=$str
    var=${str:?expr}    expr输出至stderr     expr输出至stderr      var=$str
    
    范例一:测试一下是否存在 username 这个变量,若不存在则给予 username 内容为 root
    [root@www ~]# echo $username
           <==由于出现空白,所以 username 可能不存在,也可能是空字符串
    [root@www ~]# username=${username-root}
    [root@www ~]# echo $username
    root       <==因为 username 没有配置,所以主动给予名为 root 的内容。
    [root@www ~]# username="vbird tsai" <==主动配置 username 的内容
    [root@www ~]# username=${username-root}
    [root@www ~]# echo $username
    vbird tsai <==因为 username 已经配置了,所以使用旧有的配置而不以 root 取代
    
    范例二:若 username 未配置或为空字符串,则将 username 内容配置为 root
    [root@www ~]# username=""
    [root@www ~]# username=${username-root}
    [root@www ~]# echo $username
      <==因为 username 被配置为空字符串了!所以当然还是保留为空字符串!
    [root@www ~]# username=${username:-root}
    [root@www ~]# echo $username
    root  <==加上『 : 』后若变量内容为空或者是未配置,都能够以后面的内容替换!
    
    测试:先假设 str 不存在 (用 unset) ,然后测试一下减号 (-) 的用法:
    [root@www ~]# unset str; var=${str-newvar}
    [root@www ~]# echo var="$var", str="$str"
    var=newvar, str=        <==因为 str 不存在,所以 var 为 newvar
    
    测试:若 str 已存在,测试一下 var 会变怎样?:
    [root@www ~]# str="oldvar"; var=${str-newvar}
    [root@www ~]# echo var="$var", str="$str"
    var=oldvar, str=oldvar  <==因为 str 存在,所以 var 等于 str 的内容
    
    测试:先假设 str 不存在 (用 unset) ,然后测试一下等号 (=) 的用法:
    [root@www ~]# unset str; var=${str=newvar}
    [root@www ~]# echo var="$var", str="$str"
    var=newvar, str=newvar  <==因为 str 不存在,所以 var/str 均为 newvar
    
    测试:如果 str 已存在了,测试一下 var 会变怎样?
    [root@www ~]# str="oldvar"; var=${str=newvar}
    [root@www ~]# echo var="$var", str="$str"
    var=oldvar, str=oldvar  <==因为 str 存在,所以 var 等于 str 的内容
    
    测试:若 str 不存在时,则 var 的测试结果直接显示 "无此变量"
    [root@www ~]# unset str; var=${str?无此变量}
    -bash: str: 无此变量    <==因为 str 不存在,所以输出错误信息 
    
    测试:若 str 存在时,则 var 的内容会与 str 相同!
    [root@www ~]# str="oldvar"; var=${str?novar}
    [root@www ~]# echo var="$var", str="$str"
    var=oldvar, str=oldvar  <==因为 str 存在,所以 var 等于 str 的内容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值