第1章
1.1 终端打印
echo
printf
1.2 玩转变量和环境变量
1.2.1 做好准备
查看运行环境变量:
1
2
3
cat /proc/$PID/environ
PID获取: pgrep gedit
cat /proc/12501/environ | tr '\0' '\n'
1.2.2 怎么做
1
2
3
4
var=value
var 是变量的名称,value是要分配的值。如果value不包含任何空格字符(如空格),则不必将其括在引号中,
否则必须将其括在单引号或双引号中。请注意,var = value和var=value 是不同的。
后者是赋值运算,而前者是相等运算。
通过使用 + 变量名称的前缀来打印变量的内容
1
2
3
var='value'
echo $var
OR echo ${var}
1
2
3
4
#!/bin/bash
fruit=apple
count=5
echo "We have $count ${fruit}(s)"
1.2.3 补充内容
- 获取字符串长度:
length=${#var},echo ${#var} - 识别当前shell版本:
echo $0 / echo $SHELL - 检查是否为超级用户:root用户的UID是0
- 修改BAsh提示字符串
1.3 通过shell进行数学运算
1
2
3
4
5
#!/bin/bash
no1=4;
no2=5;
let result=no1+no2
echo $result
1
2
let result=no1+no2
echo $result
递增运算:
1
let no1++
递减运算:
1
let no1--
1
2
let no+=6
let no-=6
它们分别等于let no=no+6和let no=no-6。
替代方法:
1
result=$[ no1 + no2 ]
$在[]运算符内部使用前缀是合法的,例如:
1
result=$[ $no1 + 5 ]
(( ))也可以使用。$ 使用(( ))运算符时,将使用带有变量名的前缀,如下所示:
1
result=$(( no1 + 50 ))
expr 也可以用于基本操作:
1
2
result=`expr 3 + 4`
result=$(expr $no1 + 5)
以上所有方法都不支持浮点数,并且仅对整数进行操作。
bc精度计算器是用于数学运算的高级实用程序。它具有多种选择。我们可以执行浮点运算并使用高级功能,如下所示:
1
2
3
4
5
6
echo "4 * 0.56" | bc
2.24
no=54;
result=`echo "$no * 1.5" | bc`
echo $result
81.0
可以通过将bc分号作为定界符的附加参数传递给带有前缀的操作stdin。
指定小数精度(小数位数):在以下示例中,该scale=2 参数将小数位数设置为2。因此,的输出bc将包含一个带两位小数的数字:
1
2
echo "scale=2;3/8" | bc
0.37
使用bc进行基数转换:我们可以从一种基数系统转换为另一种基数系统。让我们将十进制转换为二进制,然后将二进制转换为八进制:
1
2
3
4
5
6
7
#!/bin/bash
no=100
echo "obase=2;$no" | bc
1100100
no=1100100
echo "obase=10;ibase=2;$no" | bc
100
平方和平方根的计算可以如下进行:
1
2
echo "sqrt(100)" | bc #Square root
echo "10^10" | bc #Square
1.4 播放文件描述符和重定向
文件描述符是与文件输入和输出关联的整数。他们跟踪打开的文件。最著名的文件描述符是stdin , stdout 和 stderr 。我们可以将一个文件描述符的内容重定向到另一个文件描述符。以下食谱将提供有关如何使用文件描述符进行操作和重定向的示例。
做好准备
在编写脚本时,我们经常使用标准输入(stdin),标准输出(stdout)和标准错误(stderr)。通过过滤内容将输出重定向到文件是我们需要执行的基本操作之一。命令输出一些文本时,它可以是错误消息,也可以是输出(非错误)消息。仅仅看一下就无法区分是输出文本还是错误文本。但是,我们可以使用文件描述符来处理它们。我们可以提取附加到特定描述符的文本。
1.5 数组和关联数组
数组是使用索引将数据集合存储为独立实体的非常重要的组件。
做好准备 Bash支持常规数组以及关联数组。常规数组是只能使用整数作为其数组索引的数组。但是关联数组是可以将字符串作为其数组索引的数组。
关联数组在许多类型的操作中非常有用。Bash 4.0版附带了对数组的关联支持。因此,较旧的Bash版本将不支持关联数组。
1.6 访问别名
别名基本上是一种快捷方式,可以代替键入长命令序列的位置。
做好准备
别名可以通过多种方式实现,方法是使用函数或使用alias命令。
1.7 抓取有关终端的信息
在编写命令行外壳脚本时,我们经常需要大量操作有关当前终端的信息,例如列数,行数,光标位置,掩码的密码字段等。此食谱有助于了解有关收集和操作终端设置的信息。
做好准备
tput 和 stty 是可用于终端操作的实用程序。让我们看看如何使用它们执行不同的任务。
1.8 获取,设置日期和延迟
许多应用程序要求以不同的格式打印日期,设置日期和时间以及根据日期和时间执行操作。延迟通常用于在程序执行期间提供等待时间(例如1秒)。脚本上下文(例如每五秒钟执行一次监视任务)需要了解程序中的写入延迟。此食谱将向您展示如何处理日期和时间延迟。
做好准备
日期可以多种格式打印。我们还可以从命令行设置日期。在类似UNIX的系统中,日期从1970-01-01 00:00:00 UTC开始以秒为单位存储为整数。这称为时代或UNIX时间。让我们看看如何读取日期并进行设置。
1.9 调试脚本
调试是每一种编程语言都应实现的重要功能之一,以便在发生意外情况时产生竞赛信息。调试信息可用于读取和了解导致程序崩溃或意外行为的原因。Bash提供了每个系统管理员都应该知道的某些调试选项。还有其他一些棘手的调试方法。
做好准备
调试shell脚本不需要任何特殊的实用程序。Bash带有某些标志,这些标志可以打印脚本采用的参数和输入。让我们来看看如何做。