分类 技术 下的文章

多阶段构建是 Docker 17.05 及更高版本提供的新功能。这对致力于优化 Dockerfile 的人来说,使得 Dockerfile 易于阅读和维护。

致谢: 特别感谢 Alex Ellis 授权使用他的关于 Docker 多阶段构建的博客文章 Builder pattern vs. Multi-stage builds in Docker 作为以下示例的基础。

在多阶段构建之前

关于构建镜像最具挑战性的事情之一是保持镜像体积小巧。 Dockerfile 中的每条指令都会在镜像中增加一层,并且在移动到下一层之前,需要记住清除不需要的构件。要编写一个非常高效的 Dockerfile,你通常需要使用 shell 技巧和其它方式来尽可能地减少层数,并确保每一层都具有上一层所需的构件,而其它任何东西都不需要。

实际上最常见的是,有一个 Dockerfile 用于开发(其中包含构建应用程序所需的所有内容),而另一个裁剪过的用于生产环境,它只包含您的应用程序以及运行它所需的内容。这被称为“构建器模式”。但是维护两个 Dockerfile 并不理想。

下面分别是一个 Dockerfile.build 和遵循上面的构建器模式的 Dockerfile 的例子:

Dockerfile.build

FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN go get -d -v golang.org/x/net/html \
  && CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

注意这个例子还使用 Bash 的 && 运算符人为地将两个 RUN 命令压缩在一起,以避免在镜像中创建额外的层。这很容易失败,难以维护。例如,插入另一个命令时,很容易忘记继续使用 \ 字符。

Dockerfile

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY app .
CMD ["./app"]

build.sh

#!/bin/sh
echo Building alexellis2/href-counter:build

docker build --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy \
    -t alexellis2/href-counter:build . -f Dockerfile.build

docker create --name extract alexellis2/href-counter:build
docker cp extract:/go/src/github.com/alexellis/href-counter/app ./app
docker rm -f extract

echo Building alexellis2/href-counter:latest

docker build --no-cache -t alexellis2/href-counter:latest .
rm ./app

当您运行 build.sh 脚本时,它会构建第一个镜像,从中创建一个容器,以便将该构件复制出来,然后构建第二个镜像。 这两个镜像会占用您的系统的空间,而你仍然会一个 app 构件存放在你的本地磁盘上。

多阶段构建大大简化了这种情况!

使用多阶段构建

在多阶段构建中,您需要在 Dockerfile 中多次使用 FROM 声明。每次 FROM 指令可以使用不同的基础镜像,并且每次 FROM 指令都会开始新阶段的构建。您可以选择将构件从一个阶段复制到另一个阶段,在最终镜像中,不会留下您不需要的所有内容。为了演示这是如何工作的,让我们调整前一节中的 Dockerfile 以使用多阶段构建。

Dockerfile

FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]

您只需要单一个 Dockerfile。 不需要另外的构建脚本。只需运行 docker build 即可。

$ docker build -t alexellis2/href-counter:latest .

最终的结果是和以前体积一样小的生产镜像,复杂性显著降低。您不需要创建任何中间镜像,也不需要将任何构件提取到本地系统。

它是如何工作的呢?第二条 FROM 指令以 alpine:latest 镜像作为基础开始新的建造阶段。COPY --from=0 这一行将刚才前一个阶段产生的构件复制到这个新阶段。Go SDK 和任何中间构件都被留在那里,而不会保存到最终的镜像中。

命名您的构建阶段

默认情况下,这些阶段没有命名,您可以通过它们的整数来引用它们,从第一个 FROM 指令的 0 开始。但是,你可以通过在 FROM 指令中使用 as <NAME> 来为阶段命名。以下示例通过命名阶段并在 COPY 指令中使用名称来改进前一个示例。这意味着,即使您的 Dockerfile 中的指令稍后重新排序,COPY 也不会出问题。

FROM golang:1.7.3 as builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go    .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]

via: https://docs.docker.com/engine/userguide/eng-image/multistage-build/

作者:docker 译者:iron0x 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

你的设备的 MAC 地址可以在不同的 WiFi 网络中记录你的活动。这些信息能被共享后出售,用于识别特定的个体。但可以用随机生成的伪 MAC 地址来阻止这一行为。

每一个诸如 WiFi 或者以太网卡这样的网络设备,都有一个叫做 MAC 地址的唯一标识符,如:b4:b6:76:31:8c:ff。这就是你能上网的原因:每当你连上 WiFi,路由器就会用这一地址来向你接受和发送数据,并且用它来区别你和这一网络的其它设备。

这一设计的缺陷在于唯一性,不变的 MAC 地址正好可以用来追踪你。连上了星巴克的 WiFi? 好,注意到了。在伦敦的地铁上? 也记录下来。

如果你曾经在某一个 WiFi 验证页面上输入过你的真实姓名,你就已经把自己和这一 MAC 地址建立了联系。没有仔细阅读许可服务条款、你可以认为,机场的免费 WiFi 正通过出售所谓的 ‘顾客分析数据’(你的个人信息)获利。出售的对象包括酒店,餐饮业,和任何想要了解你的人。

我不想信息被记录,再出售给多家公司,所以我花了几个小时想出了一个解决方案。

MAC 地址不一定总是不变的

幸运的是,在不断开网络的情况下,是可以随机生成一个伪 MAC 地址的。

我想随机生成我的 MAC 地址,但是有三个要求:

  1. MAC 地址在不同网络中是不相同的。这意味着,我在星巴克和在伦敦地铁网络中的 MAC 地址是不相同的,这样在不同的服务提供商中就无法将我的活动系起来。
  2. MAC 地址需要经常更换,这样在网络上就没人知道我就是去年在这儿经过了 75 次的那个人。
  3. MAC 地址一天之内应该保持不变。当 MAC 地址更改时,大多数网络都会与你断开连接,然后必须得进入验证页面再次登陆 - 这很烦人。

操作 网络管理器 NetworkManager

我第一次尝试用一个叫做 macchanger 的工具,但是失败了。因为 网络管理器 NetworkManager 会根据它自己的设置恢复默认的 MAC 地址。

我了解到,网络管理器 1.4.1 以上版本可以自动生成随机的 MAC 地址。如果你在使用 Ubuntu 17.04 版本,你可以根据这一配置文件实现这一目的。但这并不能完全符合我的三个要求(你必须在 随机 random 稳定 stable 这两个选项之中选择一个,但没有一天之内保持不变这一选项)

因为我使用的是 Ubuntu 16.04,网络管理器版本为 1.2,不能直接使用高版本这一新功能。可能网络管理器有一些随机化方法支持,但我没能成功。所以我编了一个脚本来实现这一目标。

幸运的是,网络管理器 1.2 允许模拟 MAC 地址。你在已连接的网络中可以看见 ‘编辑连接’ 这一选项。

网络管理器也支持钩子处理 —— 任何位于 /etc/NetworkManager/dispatcher.d/pre-up.d/ 的脚本在建立网络连接之前都会被执行。

分配随机生成的伪 MAC 地址

我想根据网络 ID 和日期来生成新的随机 MAC 地址。 我们可以使用网络管理器的命令行工具 nmcli 来显示所有可用网络:

> nmcli connection
NAME                 UUID                                  TYPE             DEVICE
Gladstone Guest      618545ca-d81a-11e7-a2a4-271245e11a45  802-11-wireless  wlp1s0
DoESDinky            6e47c080-d81a-11e7-9921-87bc56777256  802-11-wireless  --
PublicWiFi           79282c10-d81a-11e7-87cb-6341829c2a54  802-11-wireless  --
virgintrainswifi     7d0c57de-d81a-11e7-9bae-5be89b161d22  802-11-wireless  --

因为每个网络都有一个唯一标识符(UUID),为了实现我的计划,我将 UUID 和日期拼接在一起,然后使用 MD5 生成 hash 值:

# eg 618545ca-d81a-11e7-a2a4-271245e11a45-2017-12-03

> echo -n "${UUID}-$(date +%F)" | md5sum

53594de990e92f9b914a723208f22b3f  -

生成的结果可以代替 MAC 地址的最后八个字节。

值得注意的是,最开始的字节 02 代表这个地址是自行指定的。实际上,真实 MAC 地址的前三个字节是由制造商决定的,例如 b4:b6:76 就代表 Intel。

有可能某些路由器会拒绝自己指定的 MAC 地址,但是我还没有遇到过这种情况。

每次连接到一个网络,这一脚本都会用 nmcli 来指定一个随机生成的伪 MAC 地址。

最后,我查看了 ifconfig 的输出结果,我发现 MAC 地址 HWaddr 已经变成了随机生成的地址(模拟 Intel 的),而不是我真实的 MAC 地址。

> ifconfig
wlp1s0    Link encap:Ethernet  HWaddr b4:b6:76:45:64:4d
          inet addr:192.168.0.86  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::648c:aff2:9a9d:764/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12107812 errors:0 dropped:2 overruns:0 frame:0
          TX packets:18332141 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:11627977017 (11.6 GB)  TX bytes:20700627733 (20.7 GB)

脚本

完整的脚本也可以在 Github 上查看

#!/bin/sh

# /etc/NetworkManager/dispatcher.d/pre-up.d/randomize-mac-addresses

# Configure every saved WiFi connection in NetworkManager with a spoofed MAC
# address, seeded from the UUID of the connection and the date eg:
# 'c31bbcc4-d6ad-11e7-9a5a-e7e1491a7e20-2017-11-20'

# This makes your MAC impossible(?) to track across WiFi providers, and
# for one provider to track across days.

# For craptive portals that authenticate based on MAC, you might want to
# automate logging in :)

# Note that NetworkManager >= 1.4.1 (Ubuntu 17.04+) can do something similar
# automatically.

export PATH=$PATH:/usr/bin:/bin

LOG_FILE=/var/log/randomize-mac-addresses

echo "$(date): $*" > ${LOG_FILE}

WIFI_UUIDS=$(nmcli --fields type,uuid connection show |grep 802-11-wireless |cut '-d ' -f3)

for UUID in ${WIFI_UUIDS}
do
    UUID_DAILY_HASH=$(echo "${UUID}-$(date +F)" | md5sum)

    RANDOM_MAC="02:$(echo -n ${UUID_DAILY_HASH} | sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5/')"

    CMD="nmcli connection modify ${UUID} wifi.cloned-mac-address ${RANDOM_MAC}"

    echo "$CMD" >> ${LOG_FILE}
    $CMD &
done

wait

更新:使用自己指定的 MAC 地址可以避免和真正的 intel 地址冲突。感谢 @\_fink


via: https://www.paulfurley.com/randomize-your-wifi-mac-address-on-ubuntu-1604-xenial/

作者:Paul M Furley 译者:wenwensnow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果仓库不再活跃开发或者你不想接受额外的贡献,但这并不意味着你想要删除它。现在可以在 Github 上归档仓库让它变成只读。

归档一个仓库会让它对所有人只读(包括仓库拥有者)。这包括对仓库的编辑、 问题 issue 合并请求 pull request (PR)、标记、里程碑、项目、维基、发布、提交、标签、分支、反馈和评论。谁都不可以在一个归档的仓库上创建新的问题、合并请求或者评论,但是你仍可以 fork 仓库——以允许归档的仓库在其它地方继续开发。

要归档一个仓库,进入仓库设置页面并点在这个仓库上点击“ 归档该仓库 Archive this repository ”。

在归档你的仓库前,确保你已经更改了它的设置并考虑关闭所有的开放问题和合并请求。你还应该更新你的 README 和描述来让它让访问者了解他不再能够对之贡献。

如果你改变了主意想要解除归档你的仓库,在相同的地方点击“ 解除归档该仓库 Unarchive this repository ”。请注意归档仓库的大多数设置是隐藏的,你需要解除归档才能改变它们。

要了解更多,请查看这份文档中的归档仓库部分。归档快乐!


via: https://github.com/blog/2460-archiving-repositories

作者:MikeMcQuaid 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

最近,我们介绍过 gnome-screenshot 工具,这是一个很优秀的屏幕抓取工具。但如果你想找一个在命令行运行的更好用的截屏工具,你一定要试试 Scrot。这个工具有一些 gnome-screenshot 没有的独特功能。在这篇文章里,我们会通过简单易懂的例子来详细介绍 Scrot。

请注意一下,这篇文章里的所有例子都在 Ubuntu 16.04 LTS 上测试过,我们用的 scrot 版本是 0.8。

关于 Scrot

ScrotSCReenshOT) 是一个屏幕抓取工具,使用 imlib2 库来获取和保存图片。由 Tom Gilbert 用 C 语言开发完成,通过 BSD 协议授权。

安装 Scrot

scort 工具可能在你的 Ubuntu 系统里预装了,不过如果没有的话,你可以用下面的命令安装:

sudo apt-get install scrot

安装完成后,你可以通过下面的命令来使用:

scrot [options] [filename]

注意:方括号里的参数是可选的。

Scrot 的使用和特点

在这个小节里,我们会介绍如何使用 Scrot 工具,以及它的所有功能。

如果不带任何选项执行命令,它会抓取整个屏幕。

使用 Scrot

默认情况下,抓取的截图会用带时间戳的文件名保存到当前目录下,不过你也可以在运行命令时指定截图文件名。比如:

scrot [image-name].png

获取程序版本

你想的话,可以用 -v 选项来查看 scrot 的版本。

scrot -v

这是例子:

获取 scrot 版本

抓取当前窗口

这个工具可以限制抓取当前的焦点窗口。这个功能可以通过 -u 选项打开。

scrot -u

例如,这是我在命令行执行上边命令时的桌面:

用 scrot 截取窗口

这是另一张用 scrot 抓取的截图:

用 scrot 抓取的图片

抓取选定窗口

这个工具还可以让你抓取任意用鼠标点击的窗口。这个功能可以用 -s 选项打开。

scrot -s

例如,在下面的截图里你可以看到,我有两个互相重叠的终端窗口。我在上层的窗口里执行上面的命令。

选择窗口

现在假如我想抓取下层的终端窗口。这样我只要在执行命令后点击窗口就可以了 —— 在你用鼠标点击之前,命令的执行不会结束。

这是我点击了下层终端窗口后的截图:

窗口截图

注意:你可以在上面的截图里看到,下层终端窗口的整个显示区域都被抓去下来了,甚至包括了上层窗口的部分叠加内容。

在截屏时包含窗口边框

我们之前介绍的 -u 选项在截屏时不会包含窗口边框。不过,需要的话你也可以在截屏时包含窗口边框。这个功能可以通过 -b 选项打开(当然要和 -u 选项一起)。

scrot -ub

下面是示例截图:

截屏时包含窗口边框

注意:截屏时包含窗口边框同时也会增加一点额外的背景。

延时截屏

你可以在开始截屏时增加一点延时。需要在 --delay-d 选项后设定一个时间值参数。

scrot --delay [NUM]

scrot --delay 5

例如:

延时截屏

在这例子里,scrot 会等待 5 秒再截屏。

截屏前倒数

这个工具也可以在你使用延时功能后显示一个倒计时。这个功能可以通过 -c 选项打开。

scrot –delay [NUM] -c

scrot -d 5 -c

下面是示例截图:

延时截屏示例

图片质量

你可以使用这个工具来调整截图的图片质量,范围是 1-100 之间。较大的值意味着更大的文件大小以及更低的压缩率。默认值是 75,不过最终效果根据选择的文件类型也会有一些差异。

这个功能可以通过 --quality-q 选项打开,但是你必须提供一个 1 - 100 之间的数值作为参数。

scrot –quality [NUM]

scrot –quality 10

下面是示例截图:

截屏质量

你可以看到,-q 选项的参数更靠近 1 让图片质量下降了很多。

生成缩略图

scort 工具还可以生成截屏的缩略图。这个功能可以通过 --thumb 选项打开。这个选项也需要一个 NUM 数值作为参数,基本上是指定原图大小的百分比。

scrot --thumb NUM

scrot --thumb 50

注意:加上 --thumb 选项也会同时保存原始截图文件。

例如,下面是我测试的原始截图:

原始截图

下面是保存的缩略图:

截图缩略图

拼接多显示器截屏

如果你的电脑接了多个显示设备,你可以用 scort 抓取并拼接这些显示设备的截图。这个功能可以通过 -m 选项打开。

scrot -m

下面是示例截图:

拼接截屏

在保存截图后执行操作

使用这个工具,你可以在保存截图后执行各种操作 —— 例如,用像 gThumb 这样的图片编辑器打开截图。这个功能可以通过 -e 选项打开。下面是例子:

scrot abc.png -e 'gthumb abc.png'

这个命令里的 gthumb 是一个图片编辑器,上面的命令在执行后会自动打开。

下面是命令的截图:

截屏后执行命令

这个是上面命令执行后的效果:

示例截图

你可以看到 scrot 抓取了屏幕截图,然后再启动了 gThumb 图片编辑器打开刚才保存的截图图片。

如果你截图时没有指定文件名,截图将会用带有时间戳的文件名保存到当前目录 —— 这是 scrot 的默认设定,我们前面已经说过。

下面是一个使用默认名字并且加上 -e 选项来截图的例子:

scrot -e 'gthumb $n'

scrot 截屏后运行 gthumb

有个地方要注意的是 $n 是一个特殊字符串,用来获取当前截图的文件名。关于特殊字符串的更多细节,请继续看下个小节。

特殊字符串

scrot 的 -e(或 --exec)选项和文件名参数可以使用格式说明符。有两种类型格式。第一种是以 % 加字母组成,用来表示日期和时间,第二种以 $ 开头,scrot 内部使用。

下面介绍几个 --exec 和文件名参数接受的说明符。

$f – 让你可以使用截图的全路径(包括文件名)。

例如:

scrot ashu.jpg -e ‘mv $f ~/Pictures/Scrot/ashish/’

下面是示例截图:

示例

如果你没有指定文件名,scrot 默认会用日期格式的文件名保存截图。这个是 scrot 的默认文件名格式:%yy-%mm-%dd-%hhmmss_$wx$h_scrot.png

$n – 提供截图文件名。下面是示例截图:

scrot $n variable

$s – 获取截图的文件大小。这个功能可以像下面这样使用。

scrot abc.jpg -e ‘echo $s’

下面是示例截图:

scrot $s 变量

类似的,你也可以使用其他格式字符串 $p$w$h$t$$ 以及 \n 来分别获取图片像素大小、图像宽度、图像高度、图像格式、输入 $ 字符、以及换行。你可以像上面介绍的 $s 格式那样使用这些字符串。

结论

这个应用能轻松地安装在 Ubuntu 系统上,对初学者比较友好。scrot 也提供了一些高级功能,比如支持格式化字符串,方便专业用户用脚本处理。当然,如果你想用起来的话有一点轻微的学习曲线。


via: https://www.howtoforge.com/tutorial/how-to-take-screenshots-in-linux-with-scrot/

作者:Himanshu Arora 译者:zpl1025 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

netstat 是一个告诉我们系统中所有 tcp/udp/unix socket 连接状态的命令行工具。它会列出所有已经连接或者等待连接状态的连接。 该工具在识别某个应用监听哪个端口时特别有用,我们也能用它来判断某个应用是否正常的在监听某个端口。

netstat 命令还能显示其它各种各样的网络相关信息,例如路由表, 网卡统计信息, 虚假连接以及多播成员等。

本文中,我们会通过几个例子来学习 netstat。

(推荐阅读: 通过示例学习使用 CURL 命令 )

1 - 检查所有的连接

使用 a 选项可以列出系统中的所有连接,

$ netstat -a

这会显示系统所有的 tcp、udp 以及 unix 连接。

2 - 检查所有的 tcp/udp/unix socket 连接

使用 t 选项只列出 tcp 连接,

$ netstat -at

类似的,使用 u 选项只列出 udp 连接,

$ netstat -au

使用 x 选项只列出 Unix socket 连接,

$ netstat -ax

3 - 同时列出进程 ID/进程名称

使用 p 选项可以在列出连接的同时也显示 PID 或者进程名称,而且它还能与其他选项连用,

$ netstat -ap

4 - 列出端口号而不是服务名

使用 n 选项可以加快输出,它不会执行任何反向查询(LCTT 译注:这里原文有误),而是直接输出数字。 由于无需查询,因此结果输出会快很多。

$ netstat -an

5 - 只输出监听端口

使用 l 选项只输出监听端口。它不能与 a 选项连用,因为 a 会输出所有端口,

$ netstat -l

6 - 输出网络状态

使用 s 选项输出每个协议的统计信息,包括接收/发送的包数量,

$ netstat -s

7 - 输出网卡状态

使用 I 选项只显示网卡的统计信息,

$ netstat -i

8 - 显示 多播组 multicast group 信息

使用 g 选项输出 IPV4 以及 IPV6 的多播组信息,

$ netstat -g

9 - 显示网络路由信息

使用 r 输出网络路由信息,

$ netstat -r

10 - 持续输出

使用 c 选项持续输出结果

$ netstat -c

11 - 过滤出某个端口

grep 连用来过滤出某个端口的连接,

$ netstat -anp | grep 3306

12 - 统计连接个数

通过与 wcgrep 命令连用,可以统计指定端口的连接数量

$ netstat -anp | grep 3306 | wc -l

这会输出 mysql 服务端口(即 3306)的连接数。

这就是我们简短的案例指南了,希望它带给你的信息量足够。 有任何疑问欢迎提出。


via: http://linuxtechlab.com/learn-use-netstat-with-examples/

作者:Shusain 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

所谓“子字符串”就是出现在其它字符串内的字符串。 比如 “3382” 就是 “this is a 3382 test” 的子字符串。 我们有多种方法可以从中把数字或指定部分字符串抽取出来。

How to Extract substring in Bash Shell on Linux or Unix

本文会向你展示在 bash shell 中如何获取或者说查找出子字符串。

在 Bash 中抽取子字符串

其语法为:

## 格式 ## 
${parameter:offset:length} 

子字符串扩展是 bash 的一项功能。它会扩展成 parameter 值中以 offset 为开始,长为 length 个字符的字符串。 假设, $u 定义如下:

## 定义变量 u ##
u="this is a test"

那么下面参数的子字符串扩展会抽取出子字符串:

var="${u:10:4}"
echo "${var}"

结果为:

test

其中这些参数分别表示:

  • 10 : 偏移位置
  • 4 : 长度

使用 IFS

根据 bash 的 man 页说明:

IFS (内部字段分隔符)用于在扩展后进行单词分割,并用内建的 read 命令将行分割为词。默认值是。

另一种 POSIX 就绪 POSIX ready 的方案如下:

u="this is a test"
set -- $u
echo "$1"
echo "$2"
echo "$3"
echo "$4"

输出为:

this
is
a
test

下面是一段 bash 代码,用来从 Cloudflare cache 中去除带主页的 url。

#!/bin/bash
####################################################
## Author - Vivek Gite {https://www.cyberciti.biz/}
## Purpose - Purge CF cache
## License - Under GPL ver 3.x+
####################################################
## set me first ##
zone_id="YOUR_ZONE_ID_HERE"
api_key="YOUR_API_KEY_HERE"
email_id="YOUR_EMAIL_ID_HERE"

## hold data ##
home_url=""
amp_url=""
urls="$@"

## Show usage 
[ "$urls" == "" ] && { echo "Usage: $0 url1 url2 url3"; exit 1; }

## Get home page url as we have various sub dirs on domain
## /tips/
## /faq/

get_home_url(){
    local u="$1"
    IFS='/'
    set -- $u
    echo "${1}${IFS}${IFS}${3}${IFS}${4}${IFS}"
}

echo
echo "Purging cache from Cloudflare。.。"
echo
for u in $urls
do
     home_url="$(get_home_url $u)"
     amp_url="${u}amp/"
     curl -X DELETE "https://api.cloudflare.com/client/v4/zones/${zone_id}/purge_cache" \
          -H "X-Auth-Email: ${email_id}" \
          -H "X-Auth-Key: ${api_key}" \
          -H "Content-Type: application/json" \
          --data "{\"files\":[\"${u}\",\"${amp_url}\",\"${home_url}\"]}"
     echo
done
echo

它的使用方法为:

~/bin/cf.clear.cache https://www.cyberciti.biz/faq/bash-for-loop/ https://www.cyberciti.biz/tips/linux-security.html

借助 cut 命令

可以使用 cut 命令来将文件中每一行或者变量中的一部分删掉。它的语法为:

u="this is a test"
echo "$u" | cut -d' ' -f 4
echo "$u" | cut --delimiter=' ' --fields=4
##########################################
## WHERE
##   -d' ' : Use a whitespace as delimiter
##   -f 4  : Select only 4th field
##########################################
var="$(cut -d' ' -f 4 <<< $u)"
echo "${var}"

想了解更多请阅读 bash 的 man 页:

man bash
man cut

另请参见: Bash String Comparison: Find Out IF a Variable Contains a Substring


via: https://www.cyberciti.biz/faq/how-to-extract-substring-in-bash/

作者:Vivek Gite 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出