156. 【Linux】shell-脚本进阶(一)

重要回顾

  1. 在创建 shell 脚本文件时,必须在文件的第一行指定要使用的 shell。其格式为,
# !/bin/bash

shell 脚本的关键在于输入多个命令并处理每个命令的结果,甚至需要将一个命令的结果传给另一个命令。shell 可以让你将多个命令串起来,一次执行完成。如果要两个命令一起运行,可以把它放在同一行中,彼此间用分号隔开。

  1. 用户变量

用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过 20 个,用户变量区分大小写,所以变量 Var1 和变量 var1 是不同的。这个小规矩经常让脚本编程初学者感到头疼。

使用等号将值赋给用户变量。在变量、等号和值之间不能出现空格(另一个困扰初学者的用法)。

shell 脚本会自动决定变量值的数据类型。在脚本的整个生命周期里,shell 脚本中定义的变量会一直保持着它们的值,但在 shell 脚本结束时会被删除掉。

进阶内容

1. 命令替换

shell 脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋值给变量。把输出赋给变量之后,就可以随意在脚本中使用了。这个特性在处理脚本数据时尤为方便。有两种方法可以将命令输出赋给变量:

  1. 反引号(`)
testing=`date`
  1. $()格式
testing=$(date)

PS:在命令行提示符下使用路径 ./ 运行命令的话,也会创建出子 shell;要是运行命令的时候不加入路径,就不会创建子 shell。如果你使用的是内建的 shell 命令,并不会涉及子 shell。在命令行提示符下运行脚本时一定要留心!

2. 输出重定向

最基本的重定向将命令的输出发送到一个文件中。bash shell 用大于号(>)来完成这项功能。

date > test6

如果输出文件已经存在,重定向操作符会用新的文件数据覆盖已有文件。

有时,你可能并不想覆盖文件原有内容,而是想要将命令的输出追加到已有文件中,比如你正在创建一个记录系统上某个操作的日志文件。在这种情况下,可以用双大于号(>>)来追加数据。

who >> test6

PS:原来双大于号(>>)是用来追加数据的。

3. 输入重定向

内联输入重定向符号是远小于(<<)。除了这个符号,你必须指定一个文本标记来划分输入数据的开始和结尾。任何字符串都可作为文本标记,但在数据的开始和结尾文本标记必须一致。

在命令行上使用内联输入重定向时,shell 会用 PS2 环境变量中定义的次提示符来提示输入数据。次提示符会持续提示,以获取更多的输入数据,知道你输入了作为文本标记的那个字符串。

wc << EOF
> test string 1
> test string 2
> test string 3
> EOF

这里用到的 wc 命令的作用是对数据中的文本进行计数。默认情况下,它会输出 3 个值:

  • 文本的行数
  • 文本的词数
  • 文本的字节数

PS:以前在看技术博客时,一直对【<< EOF】的用法很不解,然后又不知道是什么意思,也不知道怎么百度(当然了,也不想百度,毕竟一般来说找技术博客时是为了更重要更紧急的工作上的事)。现在算是彻底明白了,以下是内联输入重定向(inline input redirection)(好了,知道这叫啥了)的命令格式:

command << marker
data
marker

也就是说,EOF 可以替换成任意其他字符串。它的作用只是作为一个结束的标记。比如,

可以看到结果【3 9 42】和上面是一样的,都是 3 行,9 个单词,42 个字节。

4. 管道

和命令替换所用的反引号(`)一样,管道符号在 shell 编程之外也很少用到。管道被放在命令之间,将一个命令的输出重定向到另一个命令中:

command1 | command2

不要以为由管道串起的两个命令会依次执行。Linux 系统实际上会同时运行这两个命令,在系统内部将它们连接起来。在第一个命令产生输出的同时,输出回被立即送给第二个命令。数据传输不会用到任何中间文件或缓冲区。

5. 执行数学运算

bash shell 为了保持跟 Bourne shell 的兼容而包含了 expr 命令,但它同样也提供了一种更简单的方法来执行数学表达式。

在 bash 中,在将一个数学运算符结果赋给某个变量时,可以用美元符合方括号($[ operation ])将数学表达式围起来。注意在使用方括号来计算公式时,不用担心 shell 会误解乘号或其他符号。shell 知道它不是通配符,因为它在方括号内。

var1=$[ 1 + 5 ]
echo $var1
var2=$[ ${var1} * 2 ]
echo ${var2}

PS:bash shell 数学运算支持整数运算。若要进行任何实际的数学运算,这是一个巨大的限制。

一点废话,技术党略过

最近在学习《Linux 命令行与 shell 脚本编程大全》,花了两天时间把最基础的那部分过完了,之前学习过,这次过知识点时,很轻松,巩固了下知识,也从中学习到了以前遗漏的,和掌握的不好的知识。比如 vim 的一些高级用法,详见上一篇155. 【Linux】 vim 文本编辑器

这次学习到“构建基本脚本”时,收获同样很大,可能是之前学习的不牢固,但我更觉得这正是证明了自己的学习方法是非常契合自己的!这块以后有机会再好好聊聊。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值