Linuxshell学习笔记(8)

  1. 单引号变量,不识别特殊语法;
  2. 双引号变量,能识别特殊符号;

 1.每次调用bash/sh解释器执行脚本,都会开启一个子shell,因此不保留当前的shell变量,通过pstree命令可检查进程树;

2.调用source是在当前shell环境加载脚本,因此保留变量

环境变量设置 

        检查系统环境变量的指令

  1. set,输出所有变量,包括全局变量、局部变量(sh脚本中定义的变量);
  2. env,只显示全局变量;
  3. export,显示和设置变量值;
  4. declare,输出所有的变量,如同set;
  • 使用declare事先设定变量a的属性为“整数”
  • 特殊符号不必使用\转义
  • 算式中,可包含其他变量,变量之前不必加上$.

        撤销环境变量 

        unset 变量名,删除变量或函数

        设置可读变量

        readonly,只有shell结束,只读变量才会失效;

        declare [选项] 变量名

选项用途范例释例
-p显示变量的属性declare -p x显示变量x的属性
-a变量是一个数组declare -a array设定变量array是一个数组
-f搜寻命令时,只找函数declare -f showit寻找showit,只由函数式列表中寻找,不搜寻其他别名或外部命令进程序
-i变量是一个整数declare -i a设定变量a是整数形态
-F显示所有的函数式名称及其属性declare -F显示所有的函数式名称和其属性
-r设定只读变量declare -r a设定a是只读的变量
-t设定变量具trace属性declare -t xyz=11设定变量xyz具trace的属性,利于排错
-x设为环境变量declare -x PATH设定PATH为环境变量
命令行程序

which

找某一部分程序的文件位置

which -a

找出所有符合的程序路径

locate

数据库中找出关键词文件路径

date

显示设定系统的日期和时间 date +'%d%H%M' 日 时 分

who

显示现在谁登陆主机

ls -a

列出目录内容 包括隐藏文件

ls -A

只显示目录信息

cat d1 d2

连接d1 d2内容,并显示出来

cat d1 d2 > result.txt

转向输出,存成result.txt

cat >文件

利用cat创建一个新文件

测试变量是否“不存在”或其值为空:提示错误信息

  1. 语法:${待测变量:?提示信息}
  2. 判断条件:若变量不存在或空值,则符合判断。
  3. 解释:若变量不存在或空值,则显示变量名称和:?后面的提示信息,并立即停止执行script.

测试变量的“存在性”

  1. 语法:${待测变量:+真值}
  2. 判断条件:若变量存在且其值非空(存在),则符合判断。
  3. 解释:若变量存在且其值非空,则传回“真值”:若不然,传回空值。
  4. 这里的真值,只要是非空字符串或数字都可以 整理
    条件式目的判断条件符合的处置方式不符合的处置方式
    ${待测变量:-替换字符串}回传的结果一定要有非空值测不存在或空值传回“默认值”(即替换字符串)传回变量值
    ${待测变量:=替换字符串}给空值变量设一个默认值测不存在或空值把变量值设为“默认值”传回变量值
    ${待测变量:?错误信息检查条件是否完备测不存在或空值显示变量名称:提示信息,停止执行script传回变量值
    ${待测变量:+替换字符串}判断某事是否为真测试存在且非空传回“默认值”传回空值
  • 1.命令行第一个参数用$1表示
  • 2.命令本身用$0表示
  • 3.$@代表所有的参数

取字符串切片

取字符串切片的语法有两种:

  • 语法一:${变量:位置起点} 解释:由指定的位置开始,街区字字符串到字符串结束。
  • 语法二:${变量:位置起点:长度} 解释:由指定的位置开始,截取指定长度的字符串。

算术运算

符号名称语法范例
1算术扩展$((算术式))r=$((2+5*8))
2使用外部程序exprexpr算术式r=expr 4 + 5
3使用$[]$[算术式]r=$[ 4 + 5 ]
4使用内置命令declaredeclare -i 变量=算术式declare -i r=8+16
5使用内置命令letlen 算术式let r=8+16

let就是让变量重新赋值

注:

  • 在求值时,如果算术式中变量不存在或空值,则该变量的值为0。
  • 如果数字以0开头,则视为八进制数字。
  • 以0x或0X开头,视为16进制数字。
  • 不同进制的数字,可使用“基底#数字”的表示法,其中基底范围为2~64。
  • 小括号可改变运算的优先级,小括号优先级最高。

使用外部程序expr做算术运算

  • r=expr 参数1 \| 参数2
  1. \代表“或”的意思。
  2. 如果“参数1”存在,非空,不是0,则传回“参数1”的值,否则,传回“参数2”的值。
  3. 由于|是特殊字符,所以要写出转义字符|。

注:expr没有乘幂功能,换言之expr 2 ** 3是错误的语法,无法执行。

  • 找出子字符串的位置(zsh中第一位为1,而不是0)  expr index

  • 取子字符串(片切) expr substr

  • 字算字符串长度 expr length

  • 视关键词为一般字符串

        +后方接要视为一般字符串的关键词或运算符。

模式扩展

Bash 是先进行扩展,再执行命令。因此,扩展的结果是由 Bash 负责的,与所要执行的命令无关。命令本身并不存在参数扩展,收到什么参数就原样执行。

模式扩展与正则表达式的关系是,模式扩展早于正则表达式出现,可以看作是原始的正则表达式。它的功能没有正则那么强大灵活,但是优点是简单和方便。

波浪线扩展

  • 波浪线~会自动扩展成当前用户的主目录。
  • ~+会扩展成当前所在的目录,等同于pwd命令。

? 字符扩展

  • ?字符代表文件路径里面的任意单个字符,不包括空字符。比如,Data???匹配所有Data后面跟着三个字符的文件名。
  • ? 字符扩展属于文件名扩展,只有文件确实存在的前提下,才会发生扩展。如果文件不存在,扩展就不会发生。

* 字符扩展

  • *字符代表文件路径里面的任意数量任意字符,包括零个字符;
  • *.txt代表后缀名为.txt的所有文件;

  • 如果想输出当前目录的所有文件,直接用*即可;

  • 注意,*不会匹配隐藏文件(以.开头的文件),即ls *不会输出隐藏文件;如果要匹配隐藏文件,需要写成.*

  • *只匹配当前目录,不会匹配子目录。

方括号扩展

  • 方括号扩展的形式是[...],只有文件确实存在的前提下才会扩展。如果文件不存在,就会原样输出:括号之中的任意一个字符。比如,[aeiou]可以匹配五个元音字母中的任意一个。
  • 方括号扩展还有两种变体:[^...][!...]。它们表示匹配不在方括号里面的字符,这两种写法是等价的。比如,[^abc][!abc]表示匹配除了abc以外的字符。

[start-end] 扩展

方括号扩展有一个简写形式[start-end]表示匹配一个连续的范围。比如,[a-c]等同于[abc][0-9]匹配[0123456789]

下面是一些常用简写的例子。

  • [a-z]:所有小写字母。
  • [a-zA-Z]:所有小写字母与大写字母。
  • [a-zA-Z0-9]:所有小写字母、大写字母与数字。
  • [abc]*:所有以abc字符之一开头的文件名。
  • program.[co]:文件program.c与文件program.o
  • BACKUP.[0-9][0-9][0-9]:所有以BACKUP.开头,后面是三个数字的文件名。

这种简写形式有一个否定形式[!start-end],表示匹配不属于这个范围的字符。比如,[!a-zA-Z]表示匹配非英文字母的字符。

大括号扩展

大括号扩展{...}表示分别扩展成大括号里面的所有值,各个值之间使用逗号分隔。比如,{1,2,3}扩展成1 2 3

注意,大括号扩展不是文件名扩展。它会扩展成所有给定的值,而不管是否有对应的文件存在

另一个需要注意的地方是,大括号内部的逗号前后不能有空格。否则,大括号扩展会失效

  • 逗号前面可以没有值,表示扩展的第一项为空。
  • 大括号可以嵌套。
  • 大括号也可以与其他模式联用,并且总是先于其他模式进行扩展。

{start..end} 扩展

大括号扩展有一个简写形式{start..end}表示扩展成一个连续序列。比如,{a..z}可以扩展成26个小写英文字母。这种简写形式支持逆序

注意,如果遇到无法理解的简写,大括号模式就会原样输出,不会扩展。

  • 大括号扩展的常见用途为新建一系列目录,另一个常见用途,是直接用于for循环。
  • 这种简写形式还可以使用第二个双点号(start..end..step),用来指定扩展的步长
  • 多个简写形式连用,会有循环处理的效果。

变量扩展

  • Bash 将美元符号$开头的词元视为变量,将其扩展成变量值。
  • 变量名除了放在美元符号后面,也可以放在${}里面。
  • ${!string*}${!string@}返回所有匹配给定字符串string的变量名。

子命令扩展

  • $(...)可以扩展成另一个命令的运行结果,该命令的所有输出都会作为返回值。
  • $(...)可以嵌套,比如$(ls $(pwd))

算术扩展

$((...))可以扩展成整数运算的结果;

字符类

[[:class:]]表示一个字符类,扩展成某一类特定字符之中的一个。常用的字符类如下。

  • [[:alnum:]]:匹配任意英文字母与数字
  • [[:alpha:]]:匹配任意英文字母
  • [[:blank:]]:空格和 Tab 键。
  • [[:cntrl:]]:ASCII 码 0-31 的不可打印字符。
  • [[:digit:]]:匹配任意数字 0-9。
  • [[:graph:]]:A-Z、a-z、0-9 和标点符号。
  • [[:lower:]]:匹配任意小写字母 a-z。
  • [[:print:]]:ASCII 码 32-127 的可打印字符。
  • [[:punct:]]:标点符号(除了 A-Z、a-z、0-9 的可打印字符)。
  • [[:space:]]:空格、Tab、LF(10)、VT(11)、FF(12)、CR(13)。
  • [[:upper:]]:匹配任意大写字母 A-Z。
  • [[:xdigit:]]:16进制字符(A-F、a-f、0-9)。

通配符使用注意点 

  1. 通配符是先解释,再执行。  Bash 接收到命令以后,发现里面有通配符,会进行通配符扩展,然后再执行命令。
  2. 文件名扩展在不匹配时,会原样输出。
  3. 只适用于单层路径。    ?*这样的通配符,不能匹配路径分隔符(/)。
  4. 文件名可以使用通配符。Bash 允许文件名使用通配符,即文件名包括特殊字符。这时引用文件名,需要把文件名放在单引号或双引号里面。
    $ touch 'fo*'
    $ ls
    fo*
    

    上面代码创建了一个fo*文件,这时*就是文件名的一部分。

 

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值