鱼C论坛

 找回密码
 立即注册
查看: 2656|回复: 0

[学习笔记] 认识bash shell2

[复制链接]
发表于 2017-8-3 17:48:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Zbrel 于 2017-8-5 11:22 编辑

2.Shell的变量功能
① 变量就是以一组文字或符号等,来取代一些设定或者是一串保留的数据。

② 变量的取用与设定:echo,变量设定规则,unset
变量的取用:echo,可以利用 echo 这个指令来取用变量, 但是,变量在被取用时,前面必须要加上钱字号『$ 』才行,或是以${变量}的方式来取用,如echo $PATH或echo ${PATH}。

变量的设定规则:在 bash 当中,当一个变量名称尚未被设定时,预设的内容是『空』的。 另外,变量在设定时,还是需要符合某些规定的,否则会设定失败。
a.变量不变量内容以一个等号『=』来连结,如:myname=VBird
b.等号两边不能直接接空格符,如下为错误:
myname = VBird或myname=VBird Tsai
c.变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:2myname=VBird
d.变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但双引号内的特殊字符如 $ 等,可以保有原本的特性,如:
var="lang is $LANG"则echo $var可得lang is en_US
单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
var='lang is $LANG'则echo $var可得lang is $LANG
e.可用跳脱字符『\ 』 将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;
f.在一串指令中,还需要藉由其他的指令提供的信息,可以使用反单引号『`指令`』或 『$(指令)』 。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的设定:
version=$(uname -r)再echo $version可得『2.6.18-128.el5』
g.若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如:PATH="$PATH":/home/bin
h.若该变量需要在其他子程序执行,则需要以 export 来使变量发成环境变量:
export PATH
i.通常大写字符为系统默认变量,自行设定变量可以使用小写字符,方便判断 ;
j.取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的设定:unset myname

③ 环境变量的功能:包括家目录的发换、提示字符的显示、执行文件搜寻的路径等。可以利用env与export两个指令来查阅目前shell环境中的默认环境变量
用env观察环境变量与常见环境变量说明,如列出所有的环境变量$env,如果使用export输出的也会是一样的内容,只是,export还有其他额外的功能。
输出来的变量有:
HOME代表用户的家目录。可以使用 cd ~去到自己的家目录或者利用 cd 就可以直接回到用户家目录就是取用这个变量,有很多程序都可能会取用到这个变量的值!
SHELL当前这个环境使用的 SHELL 是哪支程序? Linux 预设使用 /bin/bash。         HISTSIZE这个与『历史命令』有关,即曾经下达过的指令可以被系统记录下来,而记录的『笔数』则是由这个值来设定的。
MAIL当我们使用 mail 这个指令在收信时,系统会去读取的邮件信箱档案 (mailbox)。
PATH就是执行文件搜寻的路径啦~目录与目录中间以冒号(:)分隔, 由于档案的搜寻是依序由 PATH 的变量内的目录来查询,所以,目录的顺序也是重要的喔。
LANG这个就是语系数据
RANDOM这个就是『随机随机数』的变量!目前大多数的 distributions 都会有随机数生成器,那就是 /dev/random 这个档案。 我们可以通过这个随机数档案相关的变量 ($RANDOM) 来随机取得随机数值。在 BASH 的环境下,这个 RANDOM 变量的内容,介于 0~32767 之间,所以,echo $RANDOM 时,系统就会主劢的随机取出一个介于 0~32767 的数值。

用set观察所有变量(含环境变量与自定义变量)
set除了环境变量之外,还会将其他在bash内的变量通通显示出来。基本上,在 Linux 预设的情况中,使用{大写的字母}来设定的变量一般为系统内定需要的变量。结果中的那些变量当中,重要的有:
a. PS1:提示符的设定,当我们每次按下[Enter] 键去执行某个指令后,最后要再次出现提示字符时, 就会主动去读取这个变数值了。
\d :可显示出『星期 月 日』的日期格式,如:"Mon Feb 2"
\H :完整的主机名
\h :仅取主机名在第一个小数点之前的名字
\t :显示时间,为 24 小时格式的『HH:MM:SS』
\T :显示时间,为 12 小时格式的『HH:MM:SS』
\A :显示时间,为 24 小时格式的『HH:MM』
\@ :显示时间,为 12 小时格式的『am/pm』样式
\u :目前使用者者账号名称,如『root』;
\v :BASH 的版本信息
\w :完整的工作目录名称,由根目录写起的目录名称。但家目录会以 ~ 取代;
\W :利用 basename 凼数取得工作目录名称,所以仅会列出最后一个目录名。
\# :下达的第几个指令。
\$ :提示字符,如果是 root 时,提示字符为 # ,其他用户就是 $
例如:如果想要有类似底下的提示字符:
[root@www /home/dmtsai 16:50 #12]#
则设定PS1为PS1=’[\u@\h \w\A#\#]\$’

b. $:钱字号本身也是个变量,代表的是目前这个Shell的线程代号,即PID(Process ID)。想知道我们的shell的PID,可以用echo $$,出现的数字就是你的PID号码。

c. ?是上一个执行的指令所回传的值。当我们执行某些指令时, 这些指令都会回传一个执行后的代码。一般来说,如果成功的执行该指令, 则会回传一个 0 值,如果执行过程发生错误,就会回传错误代码。

export:自定义变量转成环境变量
环境变量与自定义变量的差异在于该变量是否会被子程序继续引用。而export这个指令可以让自定义变量变成环境变量,从而继续在子程序中使用。在启动shell的时候,系统给shell分配一块内存,用来存储系统环境变量,export可以将用户自定义变量移动到该内存中,当进入子shel,子shell将父shell的系统环境变量读入到子shell的内存中。

影响显示结果的语系变量locale
locale -a 显示系统支持的所有语系,改变系统支持的语系,可修改/etc/sysconfig/i18n

变量键盘读取、数组与宣告:read, array, declare
变量的设定功能不仅可以由指令列直接设定,还可以让用户经由键盘输入。此外还可以宣告这个变量的属性,如数组或数字等。
① read 读取来自键盘输入的变量
read [-pt] 变量
-p 后面可接提示符
-t 后面可接秒数,限制等待的时间
例如:提示使用者30秒内输入自己的名字,并将输入的字符串作为name的变量内容
read -p “Please input your name:” -t 20 name
read之后不加任何参数,直接加上变量名称,底下就会出现一空白行等待用户输入。如果加上-t后面接秒数n,n秒之内没有任何动作的话,该指令就会自动略过了;如果加上-p,在输入的光标钱就会有提示符可供参考。

② delcare/typeset功能一样,就是在宣告变量的类型。如果declare后面没接任何参数,那么bash就会主动的将所有的变量名称与内容通通叫出来,就好像使用set一样。declare还有其他的语法:
delcare/typeset [-airx] 变量
-a 声明的变量为数组(array)类型
-i 声明的变量为整数数字(integer)类型
-r 将变量设定为readonly只读类型,该变量不可被更改内容,也不能unset
-x 用法与export一样,将变量变成系统环境变量
例如:sum=100+300+50后echo $sum得到100+300+50,而
declare -i sum=100+300+50后echo $sum得到450,这是因为在默认的情况下,bash默认变量类型为字符串,所以若不指定变量类型,则1+2为一个字符串而不是计算式;另外bash环境中的数值运算,预设最多仅能到达整数形态,所以1/3的结果是0。因此如果需要非字符串类型的变量,就得进行变量的宣告。

③ 数组(array)变量类型
数组的设定方式是:var[index]=content,var为数组名,index为数字
例如:var[1]=”small”
  var[2]=”medium”
  var[3]=“big”
  echo “${var[1]},${var[2]},${var[3]}”得到small,medium,big
与文件系统及程序的限制关系ulimit:bash可以通过ulimit设定来限制用户的某些系统资源,包括可以开启的档案数量,可以使用的CPU时间,可以使用的内存总量等等。
ulimit [-SHacdfltu] [配额]
-H hard limit,严格的设定,必定不能超过这个设定的数值
-S soft limit,警告的设定,可以超过这个设定值,但是若超过则有警告讯息
-a 后面不接任何选项和参数,可列出所有的限制额度
-c 当某些程序发生错误时,系统可能会将该程序在内存中的信息写成档案(除错用),这种档案就被称为核心档案(core file)。此为限制每个核心档案的最大容量。
-f 此shell可以建立的最大档案容量(一般可能设定为2GB)单位为Kbytes
-d 程序可使用的最大断裂内存(segment)容量
-l 可用于锁定(lock)的内存量
-t 可使用的最大CPU时间(单位为秒)
-u 单一用户可以使用的最大程序(process)数量
例如:列出目前身份的所有限制资料数值:ulimit -a
  限制用户仅能建立10MBytes以下的容量的档案:ulimit -f 10240

变量内容的删除、取代与替换:变量除了可以直接设定来修改原本的内容之外,还可以通过几个简单的小步骤来进行变量内容的微调。
① 变量内容的删除与取代
变量设定方式                                    说明
${变量#关键词}                           若变量内容从头开始的数据符合关键词,则将符合的最短的数据删除
${变量##关键词}                          若变量内容从头开始的数据符合关键词,则将符合的最长的数据删除
${变量%关键词}                            若变量内容从尾向前的数据符合关键词,则将符合的最短的数据删除
${变量%%关键词}                          若变量内容从尾向前的数据符合关键词,则将符合的最长的数据删除
${变量/旧字符串/新字符串}         若变量内容符合旧字符串则第一个旧字符串会被新字符串取代
${变量//旧字符串/新字符串}         若变量内容符合旧字符串则全部的旧字符串会被新字符串取代

② 变量的测试与内容替换
下面,var与str为变量

变量设定方式                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                        str不变                        str不变
                                var=expr                        var=                                var=$str
var=${str:=expr}        str=expr                        str=expr                        str不变
                                var=expr                        var=expr                        var=$str
var=${str?expr}        expr输出至stderr        var=                                var=$str
var=${str:?expr}        expr输出至stderr        expr输出至stderr        var=$str

例如:假设str不存在(用unset),然后测试一下减号(-)的用法:
  unset str;var=${str-newvar}
  echo var=”$var”,str=”$str”
  输出var=newvar,str=

若str已存在,var会变怎样呢:
str=”oldvar”;var=${str-newvar}
echo var=”$var”,str=”$str”
输出var=oldvar,str=oldvar

评分

参与人数 1鱼币 +2 收起 理由
小甲鱼 + 2

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 12:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表