分类 技术 下的文章

这个多功能的 VLC 媒体播放器还可以旋转视频方向。在桌面上观看智能手机录制的视频相当方便。

有时,你会遇到以显示方向错误的视频。使用智能手机摄像头拍摄的视频很可能会以这种方式出现。

如果你可以将其旋转到方便的方向,那么效果会更好。

功能丰富的 VLC 媒体播放器提供了一种旋转视频的方法。你可以:

  • 暂时旋转视频(下次播放时需要再次旋转)
  • 永久旋转视频(视频将始终以新方向播放)

让我们看看如何实现这两者之一。

在 VLC 中暂时旋转视频

让我们看看如何在 VLC 中临时旋转视频。也就是说,完成该过程后,它不会反映在实际文件上。这对于查看文件或测试文件很有用。

使用预设值旋转视频

在此方法中,你可以将视频旋转 90 度、180 度和 270 度。这是你大多数时候所需要的。

打开 VLC 并选择要旋转的视频。

Open File in VLC

单击主菜单上的 “ 工具 Tools ”,然后转到 “ 效果和滤镜 Effects and Filters ”。你也可以按快捷键 CTRL + E

Tools > Effects and Filters

在 “效果和滤镜” 页面上,选择 “ 视频效果 Video Effects ” 选项卡,然后进入 “ 几何 Geometry ”。现在,选中 “ 变换 Transform ” 复选框。

Set the Rotation

这将激活一个下拉菜单。从那里,选择你需要的适当旋转,如 90 度、180 度、水平翻转等。你可以在 VLC 窗口中查看变化。

对更改感到满意后,按 “ 保存 Save ” 按钮以所选方向保存配置。

使用自定义值旋转视频

需要将视频旋转到可用预设以外的方向? VLC 也有一个选项。

首先,像上一步一样,打开媒体,然后转到 “工具 > 效果和滤镜 > 视频效果 > 几何”。

现在,单击 “ 旋转 Rotate ” 复选框,你可以看到交互式圆形滑块现已激活。

? 对于不规则的旋转值(例如 230 度等),某些部分都会从视频中删除。

Irregular rotation

移动滑块以获得正确的旋转。你可以在 VLC 窗口中看到视频出现的变化。确定更改后,请按 “保存” 按钮保存该配置。

? 请记住,此配置在此阶段不会永久应用于视频。但是,如果你按 “保存”,方向也会暂时应用于 VLC 中播放的其他视频。

永久旋转视频

你知道了如何临时旋转文件。永久保存视频文件更改也需要该步骤。

第 1 步:转换视频

这是前一部分。打开视频文件,然后进行所需的旋转。确认特定视频所需的旋转后,按照上一步中的说明保存该配置。

第 2 步:保存视频

现在,打开 VLC 并单击 “ 媒体 Media > 转换/保存 Convert/Save ”。这可以在没有打开任何视频文件的情况下进行,因为无论如何我们都不会处理当前打开的视频。

Click on Convert/Save

在下一个对话框中,使用 “添加Add” 按钮选择要旋转的文件(在上一步中测试以确认所需旋转的文件)。然后按 “ 转换并保存 Convert and Save ”。

Add Files to convert

接下来,选择所需的视频输出,然后单击相邻的设置按钮,如下所示。

Click on Configuration button

出现了配置文件设置窗口。在其上,进入 “ 视频编解码器 Video Codec ”,然后转到 “ 过滤器 Filters ” 选项卡。在这里,你必须根据需要应用过滤器。一个是 “ 旋转视频过滤器 Rotate Video Filter ”,另一个是 “ 视频转换过滤器 Video transformation Filter ”。

如果你已使用 “变换” 按钮对视频应用固定变换,请选择 “ 视频变换过滤器 Video transformation Filter ”。另一方面,如果你对视频进行了一些不规则的旋转,请选择 “旋转视频过滤器”。

Apply the Filters

检查后,按 “保存”按钮。

现在,选择输出文件位置,我们要在其中保存转换后的文件。

Select Output file location

应给出一个新的文件名,这可以通过进入你选择的目录并只需在顶部栏上输入你选择的名称来完成。

? 建议提供一个新的唯一名称,以避免文件覆盖和数据丢失。

Give file name

按 “ 开始 Start ” 开始转换。

转换将需要一些时间,具体取决于你的视频。完成后,你将获得旋转的视频,可以在任何视频播放器上查看。

? 转换视频后(无论是永久的还是临时的),最好在 “工具 > 效果和滤镜 > 视频效果 > 几何” 中关闭应用的旋转。否则,以后使用 VLC 播放的视频将出现旋转。

我希望你喜欢这个 VLC 技巧。欢迎你提出建议和反馈。

同时,你还可以学习这个很酷的 VLC 自动下载字幕的技巧。

在 VLC 中自动下载字幕

(题图:MJ/b604f181-660a-4f05-bdd2-49b5b6da0bae)


via: https://itsfoss.com/rotate-video-vlc/

作者:Sreenath 选题:lujun9972 译者:geekpi 校对:wxy

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

使用 Podman 启动 GitLab 执行器有多种方法,我在本文中概述了其中两种。

GitLab 执行器 Runner 是一个与 GitLab CI/CD 配合使用的应用,可在 GitLab 基础设施上的流水线中运行作业。它们通常用于在提交代码后自动编译应用或在代码库上运行测试。你可以将它们视为基于云的 Git 钩子

主要的公共 GitLab 实例 提供了许多易于访问的共享执行器,可供你在 CI 流水线中使用。你可以在 GitLab 上仓库的 设置 Settings -> CI/CD -> 执行器 Runners 中找到共享执行器的列表。

Display available GitLab runners in your repository's settings

你可能不想依赖共享执行器,而是选择自己的执行器,原因有很多。例如,控制执行器运行的基础设施以实现额外的安全性和/或隐私、灵活的执行器配置或分配给你的 GitLab 用户帐户的有限 CI 分钟数。

GitLab 执行器依赖于 执行环境 executor 工具来运行 CI 作业。执行环境有许多选项可用:Docker、Kubernetes、VirtualBox 等。

那么,Podman 作为执行环境呢?

v4.2.0 起,Podman 对 GitLab 执行器提供了原生支持。以下是使用 Podman 作为 GitLab 执行器的 执行环境 的两种方法的快速浏览。

Docker 执行环境

你可以在 GitLab 执行器中使用 Podman 作为 Docker 的直接替代品。就是这样:

本示例使用 2023 年 2 月的 CentOS Stream 9 环境,使用 Podman v4.4.0。它应该可以在任何具有足够新的 Podman 的 RHEL/CentOS Stream/Fedora 环境中正常工作。查看 GitLab 文档 了解先决条件。

首先,安装 Podman:

$ sudo dnf -y install podman

接下来安装 gitlab-runner 包:

# 添加 GitLab 执行器仓库
$ curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash

# 安装 gitlab-runner 包
$ sudo dnf -y install gitlab-runner

最后,允许用户在注销后执行任务:

$ sudo loginctl enable-linger gitlab-runner

配置并注册执行器

使用以下步骤配置 Docker 运行环境。

安装 gitlab-runner 包会创建一个 gitlab-runner 用户帐户,但你需要 root 访问权限才能操作该用户帐户。gitlab-runner 可以在用户模式下运行,但需要一些手动干预来进行构建处理。在此示例中,我使用 sudo 在系统模式下运行它。它看起来是这样的:

$ sudo gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=7978 revision=d540b510 version=15.9.1
Running in system-mode.

Enter the GitLab instance URL (for example, https://gitlab.com/):
https://gitlab.com
Enter the registration token:
xxxxxxxxxxxxxxxxx
Enter a description for the runner:
[lmandvek-c9s-gitlab-runner]:
Enter tags for the runner (comma-separated):

Enter optional maintenance note for the runner:

WARNING: Support for registration tokens and runner parameters in the 'register' command has been deprecated in GitLab Runner 15.6 and will be replaced with support for authentication tokens. For more information, see https://gitlab.com/gitlab-org/gitlab/-/issues/380872
Registering runner... succeeded                     runner=GR13489419oEPYcJ8
Enter an executor: custom, docker, ssh, docker-ssh+machine, docker-ssh, parallels, shell, virtualbox, docker+machine, instance, kubernetes:
docker
Enter the default Docker image (for example, ruby:2.7):
registry.gitlab.com/rhcontainerbot/pkg-builder
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"

你将需要一些额外的配置才能使用 Podman。配置执行器为每个作业创建一个网络。有关更多信息,请参阅 GitLab 文档

首先,启用 Podman 系统服务并修改 /etc/gitlab-runner/config.toml 中的环境:

[[runners]]
    environment = ["FF_NETWORK_PER_BUILD=1"]
    [runners.docker]
        host = "unix:///run/user/1001/podman/podman.sock"

重启执行器以实施更改:

$ sudo gitlab-runner restart

验证新的执行器在 GitLab 项目的 设置 Settings -> CI/CD -> 执行器 Runners 中可见:

Restart the GitLab runner

接下来,验证你的 CI 流水线正在使用执行器。你的 CI 任务日志将提及正在使用的执行器的名称以及任何其他配置信息,例如 执行器的执行环境的功能标志和容器镜像。

View CI tasklogs to display the runner

Podman-in-Podman(pipglr)

Chris Evich 创建了 pipglr,这是一个 Podman-in-Podman 设置,用于使用免 root 的 Podman 来支持你自己的免 root 的 GitLab 执行器。此方法不需要对 .gitlab-ci.yaml 配置进行任何更改,因此你可以继续按原样使用现有设置。

以下是帮助你运行此程序的快速设置指南。

配置步骤

容器镜像是从 pipglr Containerfile 自动构建的,因此将镜像设置为该仓库:

$ IMAGE="registry.gitlab.com/qontainers/pipglr:latest"

接下来,使用你的 GitLab 注册令牌创建 Podman 密钥:

$ echo '<actual registration token>' | podman secret create REGISTRATION_TOKEN -

创建一个空白的 config.toml,稍后将包含你的所有执行器设置。你必须执行此步骤才能使以下 podman container register runlabel $IMAGE 步骤成功:

$ touch ./config.toml  # 重要:文件必须存在,即使是空的。

注册你的执行器。你可以重复此步骤来注册多个执行器。如果你想使用可能不同的标签或配置选项集并行运行多个 CI 任务,这非常有用。

$ podman container runlabel register $IMAGE

使用你选择的编辑器编辑 config.toml。这是可选的,但通常需要更改用于实际 CI 任务的容器镜像。默认情况下,镜像设置为:registry.fedoraproject.org/fedora:latest

$ $EDITOR ./config.toml  # if desired

最后,配置对卷的访问。容器卷内使用多个用户,因此你必须专门配置它们以允许访问。再次使用 runlabel 来完成:

$ podman container runlabel setupstorage $IMAGE

$ podman container runlabel setupcache $IMAGE

测试执行器

是时候检查配置了。首先启动 GitLab 执行器容器:

$ podman container runlabel run $IMAGE

允许执行器用户在注销后运行服务:

$ sudo loginctl enable-linger $(id -u)

验证你的新执行器在 GitLab 项目的 设置 Settings -> CI/CD -> 执行器 Runners 中可见:

Verify the new runner is visible

最后,验证你的 CI 流水线正在使用你的执行器:

Verify the CI pipeline

总结

使用 Podman 启动 GitLab 执行器有多种方法,我在此处概述了其中两种。尝试一下,然后让我知道哪一个最适合你。如果 Docker 执行环境方法有任何问题,请登录并通过 Podman 上游GitLab 支持 提交问题。如果 pipglr 方法出现问题,请在 pipglr 上游 提交问题

GitLab 与 Podman 一起运行愉快 ?

(题图:MJ/97e0ff4d-b769-4e20-990f-8c1e89e48434)


via: https://opensource.com/article/23/3/podman-gitlab-runners

作者:Lokesh Mandvekar 选题:lkxed 译者:geekpi 校对:wxy

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

初学者们,让我们在这个大型的教程中来认识一下 Bash 脚本编程。

Shell 是 Linux 的核心部分,它允许你使用各种诸如 cdlscat 等的命令与 Linux 内核进行交互。

Bash 是 Linux 上众多可用的 Shell 中的一个。这些 Shell 主要的语法基本相同,但并非完全一样。Bash 是目前最受欢迎的 Shell,并在大多数 Linux 发行版中被设为默认 Shell。

当你打开一个终端或 SSH 会话时,即使你无法真切地看到它,你其实已经在运行着一个 Shell。

当你输入一个命令,它会被 Shell 解释。如果命令和语法是正确的,它就会被执行,否则你会看到一个错误。

当你可以直接运行 Linux 命令时,为什么还需要 Bash 脚本?

你可以直接在终端输入命令,它们就会被执行。

$ echo "hello world"
hello world

并且,同样的操作也可以在脚本中进行:

$ cat >> script.sh
#!/bin/bash

echo "hello world"
$ bash script.sh
hello world

那么,为什么我们需要 Shell 脚本呢?因为你不必一遍又一遍地输入同一个命令,你只需运行 Shell 脚本即可。

此外,如果你的脚本中有复杂的逻辑,把所有的命令都输入到终端中可能并不是一个好主意。

例如,如果你输入下面的命令,它会奏效,但这并不容易理解。不断地输入相同的命令(甚至要在 Bash 历史记录中搜索)会造成困扰。

if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi

相反,你可以把命令放进 shell 脚本中,这样就更容易理解并且可以轻松运行了:

#!/bin/bash

if [ $(whoami) = 'root' ]; then
    echo "You are root"
else
    echo "You are not root"
fi

这还是比较简单的情况。尝试想象一下,一个复杂的脚本可能有五十行或一百行!

你将会学到什么?

在这个 Bash 脚本教程中,有九个部分。你将会学到:

  • 创建并运行你的第一个 Bash Shell 脚本
  • 使用变量
  • 在你的 Bash 脚本中传递参数和接受用户输入
  • 进行数学计算
  • 操作字符串
  • 使用条件语句,例如 if-else
  • 使用 forwhileuntil 循环
  • 创建函数
? 所有的部分都会给你一个简单的例子。如果你愿意,你可以通过访问每个部分的详细章节来更深入地学习。这些章节也都包含了实践练习。

这个教程的目标读者是谁?

这个教程适合任何想要开始学习 Bash Shell 脚本的人。

如果你是一名学生,而你的课程里包括了 Shell 脚本,那么这个系列就是为你准备的。

如果你是一个常规的桌面 Linux 用户,这个系列将会帮助你理解在探索各种软件和修复问题时遇到的大多数 Shell 脚本。你也可以使用它来自动化一些常见的、重复的任务。

在这个 Bash 脚本教程结束时,你应该可以编写简单的 Bash 脚本。

? 希望你已经拥有 Linux 命令行和编程语言的基础知识。

如果你对 Linux 命令行完全不熟悉,我建议你先掌握基础知识。

19 个你应该知道的基础而重要的 Linux 终端技巧

你应该了解如何在命令行中进入特定的位置。为了做到这一点,你需要理解 Linux 文件系统中的路径是如何工作的。

Linux 中的绝对路径和相对路径有什么不同

接下来,这个教程系列会给你介绍目录导航和文件操作的基本知识。

终端基础:Linux 终端入门

1、编写你的第一个 Bash Shell 脚本

创建一个名为 hello.sh 的新文件:

nano hello.sh

这将在终端中打开 nano 编辑器。在其中输入以下几行代码:

#!/bin/bash
echo "Hello World"

通过按 Ctrl+X 键可以保存并退出 nano 编辑器。

现在,你可以以以下方式运行 Bash Shell 脚本:

bash hello.sh

你应该可以看到以下的输出:

Hello World

另一种方式是首先赋予脚本执行权限:

chmod u+x hello.sh

然后这样运行它:

./hello.sh
? 你也可以使用基于图形用户界面的文本编辑器来编写脚本。这可能更适合编写较长的脚本。然而,你需要切换到保存脚本的目录中才能运行它。

恭喜!你刚刚运行了你的第一个 Bash 脚本。

Bash 基础知识系列 #1:创建并运行你的第一个 Bash Shell 脚本

2、在 Bash 脚本中使用变量

变量的声明方式如下:

var=some_value

然后可以像这样访问变量:

$var
? 在声明变量时,等号(=)前后不能有空格。

我们通过添加一个变量来修改前面的脚本。

#!/bin/bash
message="Hello World"
echo $message

如果运行这个脚本,输出仍然会保持不变。

Hello World
Bash 基础知识系列 #2:在 Bash 中使用变量

3、向 Bash 脚本传递参数

你可以在运行 Bash 脚本时以以下方式传递参数:

./my_script.sh arg1 arg2

在脚本中,你可以使用 $1 来代表第 1 个参数,用 $2 来代表第 2 个参数,以此类推。$0 是一个特殊变量,它代表正在运行的脚本的名字。

现在,创建一个新的 shell 脚本,命名为 arguments.sh,并向其中添加以下几行代码:

#!/bin/bash

echo "Script name is: $0"
echo "First argument is: $1"
echo "Second argument is: $2"

使其可执行并像这样运行它:

$ ./argument.sh abhishek prakash
Script name is: ./argument.sh
First argument is: abhishek
Second argument is: prakash

让我们快速看一下特殊变量:

特殊变量描述
$0脚本名称
$1$2...$9脚本参数
${n}10 到 255 的脚本参数
$#参数数量
$@所有参数一起
$$当前 shell 的进程 id
$!最后执行命令的进程 id
$?最后执行命令的退出状态

你也可以通过接受键盘输入使你的 Bash 脚本变得交互式。

为此,你必须使用 read 命令。你还可以使用 read -p 命令提示用户进行键盘输入,而不需要 echo 命令。

#!/bin/bash

echo "What is your name, stranger?"
read name
read -p "What's your full name, $name? " full_name
echo "Welcome, $full_name"

现在,如果你运行这个脚本,当系统提示你输入“参数”时,你必须输入。

$ ./argument.sh
What is your name, stranger?
abhishek
What's your full name, abhishek? abhishek prakash
Welcome, abhishek prakash
Bash 基础知识系列 #3:传递参数和接受用户输入

4、执行算术运算

在 Bash Shell 中执行算术运算的语法是这样的:

$((arithmetic_operation))

下面是你可以在 Bash 中执行的算术运算的列表:

操作符描述
+加法
-减法
*乘法
/整数除法(没有小数)
%模运算(只余)
**指数(a 的 b 次方)

以下是在 Bash 脚本中进行加法和减法的示例:

#!/bin/bash

read -p "Enter first number: " num1
read -p "Enter second number: " num2

sum=$(($num1+$num2))
sub=$(($num1-$num2))
echo "The summation of $num1 and $num2 is $sum"
echo "The substraction of $num2 from $num1 is $sub"

你可以执行 Shell 脚本,使用你选择的任意数字作为参数。

如果你尝试除法,会出现一个大问题。Bash 只使用整数。默认情况下,它没有小数的概念。因此,你会得到 10/3 的结果为3,而不是 3.333。

对于浮点数运算,你需要这样使用 bc 命令:

#!/bin/bash

num1=50
num2=6

result=$(echo "$num1/$num2" | bc -l)

echo "The result is $result"

这个时候,你将看到准确的结果。

    The result is 8.33333333333333333333

Bash 基础知识系列 #4:算术运算

5、在 Bash 脚本中使用数组

你可以使用 Bash 中的数组来存储同一类别的值,而不是使用多个变量。

你可以像这样声明一个数组:

distros=(Ubuntu Fedora SUSE "Arch Linux" Nix)

要访问一个元素,使用:

${array_name[N]}

像大多数其他的编程语言一样,数组的索引从 0 开始。

你可以像这样显示数组的所有元素:

${array[*]}

这样获取数组长度:

${#array_name[@]}
Bash 基础知识系列 #5:在 Bash 中使用数组

6、Bash 中的基础字符串操作

Bash 能够执行许多字符串操作。

你可以使用这种方式获取字符串长度:

${#string}

连接两个字符串:

str3=$str1$str2

提供子字符串的起始位置和长度来提取子字符串:

${string:$pos:$len}

这里有一个例子:

你也可以替换给定字符串的一部分:

${string/substr1/substr2}

并且你也可以从给定字符串中删除一个子字符串:

    ${string/substring}

Bash 基础知识系列 #6:处理字符串操作

7、在 Bash 中使用条件语句

你可以通过使用 ifif-else 语句为你的 Bash 脚本添加条件逻辑。这些语句以 fi 结束。

单个 if 语句的语法是:

if [ condition ]; then
  your code
fi

注意使用 [ ... ];then

if-else 语句的语法是:

if [ expression ]; then
    ## execute this block if condition is true else go to next
elif [ expression ]; then
    ## execute this block if condition is true else go to next
else
    ## if none of the above conditions are true, execute this block
fi

这里有一个使用 if-else 语句的 Bash 脚本示例:

#!/bin/bash

read -p "Enter the number: " num
mod=$(($num%2))

if [ $mod -eq 0 ]; then
    echo "Number $num is even"
else
    echo "Number $num is odd"
fi

运行它,你应该能看到这样的结果:

-eq 被称为测试条件或条件操作符。有许多这样的操作符可以给你不同类型的比较:

这些是你可以用来进行数值比较的测试条件操作符:

条件当...时,等同于 true
$a -lt $b$a < $b$a 是小于 $b
$a -gt $b$a > $b$a 是大于 $b
$a -le $b$a <= $b$a 是小于或等于 $b
$a -ge $b$a >= $b$a 是大于或等于 $b
$a -eq $b$a == $b$a 等于 $b
$a -ne $b$a != $b$a 不等于 $b

如果你在进行字符串比较,你可以使用以下这些测试条件:

条件当...时,等同于 true
"$a" = "$b"$a 等同于 $b
"$a" == "$b"$a 等同于 $b
"$a" != "$b"$a 不同于 $b
-z "$a"$a 是空的

还有些条件用于检查文件类型:

条件当...时,等同于 true
-f $a$a 是一个文件
-d $a$a 是一个目录
-L $a$a 是一个链接
? 要特别注意空格。开括号和闭括号、条件之间必须有空格。同样地,条件操作符(-le== 等)之前和之后必须有空格。
Bash 基础知识系列 #7:If-Else 语句

8、使用 Bash 脚本中的循环

Bash 支持三种类型的循环:forwhileuntil

这是 for 循环的一个例子:

#!/bin/bash

for num in {1..10}; do
    echo $num
done

运行它,你将看到以下输出:

1
2
3
4
5
6
7
8
9
10

如果你选择使用上面的示例,可以使用 while 循环这样重写:

#!/bin/bash

num=1
while [ $num -le 10 ]; do
    echo $num
    num=$(($num+1))
done

同样,可以使用 until 循环来重写:

#!/bin/bash

num=1
until [ $num -gt 10 ]; do
    echo $num
    num=$(($num+1))
done
? while 循环和 until 循环非常相似。区别在于:while 循环在条件为真时运行,而 until 循环在条件为假时运行。
Bash 基础知识系列 #8:For、While 和 Until 循环

9、在 Bash 脚本中使用函数

Bash Shell 支持使用函数,这样你不必反复编写相同的代码片段。

这是声明 Bash 函数的通用语法:

function_name() {
  commands
}

这是一个使用带参数的函数的 Bash 脚本样例:

#!/bin/bash

sum() {
    sum=$(($1+$2))
    echo "The sum of $1 and $2 is: $sum"
}

echo "Let's use the sum function"
sum 1 5

如果你运行该脚本,你将看到以下输出:

Let's use the sum function
The sum of 1 and 5 is: 6
Bash 基础知识系列 #9:Bash 中的函数

接下来呢?

这只是一个初窥。这个 Bash 脚本教程只是一篇引言。Bash 脚本的内容还有很多,你可以慢慢地、逐渐地探索。

GNU Bash 参考是一份优秀的在线资源,可以解答你的 Bash 疑问。

GNU Bash 参考

除此之外,你可以下载这本免费书籍来学习更多在此未涵盖的 Bash 内容:

下载 Bash 初学者指南

一旦你具有足够的 Bash 基础知识,你可以通过这本免费书籍来学习高级 Bash 脚本:

下载高级 Bash 编程指南

这两本书至少都有十年的历史,但你仍然可以使用它们来学习 Bash。

? 希望你喜欢这个作为学习 Bash 脚本起点的教程。请在评论区提供你的反馈。

(题图:MJ/98f47121-7426-4297-9242-8683ccf0496d)


via: https://itsfoss.com/bash-scripting-tutorial/

作者:Abhishek Prakash 选题:lujun9972 译者:ChatGPT 校对:wxy

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

在 Bash 基础系列的最后一章中学习函数的全部知识。

大多数编程语言都支持函数的概念。

函数帮助你避免在同一个程序中反复编写同一段代码。你只需将代码写为一个函数,然后在需要特定代码片段的地方使用这个函数。

在 Bash 基础知识系列的最后一章中,你将学习在 Bash 脚本中使用函数。

Bash 中的函数

下面是声明 Bash 函数的通用语法:

function_name() {
    commands
}

只有在 “调用函数” 的脚本中,函数内的命令才会被执行。

这里有一个伪代码来演示这个情况:

function_name() {
    commands
}

some_other_commands

# 函数调用
function_name argument;
? 函数定义必须在你调用函数之前。

让我们通过一个简单的例子来看看这个:

#!/bin/bash

fun() {
    echo "This is a function"
}

echo "This is a script"
fun

当你运行脚本时,你应该看到这样的输出:

This is a script
This is a function

函数是在没有任何参数的情况下被调用的。接下来,让我们看看在 bash 中如何处理函数的参数。

向函数传递参数

向函数传递参数和向 Bash 脚本传递参数是一样的。你在调用函数时,可以在函数名旁边写上参数。

function_name argument;

让我们用一个例子来看看这个:

#!/bin/bash

sum() {
    sum=$(($1+$2))
    echo "The sum of $1 and $2 is: $sum"
}

echo "Let's use the sum function"
sum 1 5

如果你运行这个脚本,你会看到以下输出:

Let's use the sum function
The sum of 1 and 5 is: 6

请记住,传递给脚本的参数和传递给函数的参数是不同的。

在下面的例子中,我在调用函数时交换了参数。

#!/bin/bash

arg() {
    echo "1st argument to function is $1 and 2nd is $2"
}

echo "1st argument to script is $1 and 2nd is $2"
arg $2 $1

当你运行这个脚本时,你会看到这样的交换:

$ ./function.sh abhi shek
1st argument to script is abhi and 2nd is shek
1st argument to function is shek and 2nd is abhi

Bash 中的递归函数

一个递归函数会调用它自己。这就是递归的含义。这个梗图可能会帮助你理解它。

递归功能非常强大,可以帮助你编写复杂的程序。

让我们用一个计算阶乘的样本脚本来看看它的应用。如果你忘记了,阶乘的定义是这样的。

n 的阶乘:

(n!) = 1 * 2 * 3 * 4 *...  * n

所以,5 的阶乘是 1 * 2 * 3 * 4 * 5,计算结果是 120。

这是我用递归计算给定数字的阶乘的脚本。

#!/bin/bash

factorial() {

    if [ $1 -gt 1 ]; then
        echo $(( $1 * $(factorial $(( $1 -1 ))) ))
    else
        echo 1
    fi

}

echo -n "Factorial of $1 is: "
factorial $1

注意到 echo $(( $1 * $(factorial $(( $1 -1 ))) )),代码使用比输入值小 1 的值调用了函数自身。这个过程会一直持续到值变为 1。所以,如果你运行脚本并输入参数 5,它最终会返回 5 * 4 * 3 * 2 *1 的结果。

$ ./factorial.sh 5
Factorial of 5 is: 120

非常好。现在,让我们来做些练习吧。

?️ 练习时间

以下是一些示例编程挑战,用来帮助你实践你所学。

练习 1:写一个 Bash 脚本,使用一个名为 is_even 的函数来检查给定的数字是否是偶数。

练习 2:类似的练习,你需要编写一个脚本,该脚本具有一个名为 is_prime 的函数,并检查给定数字是否是质数。如果你还不知道,质数只能被 1 和它自身整除。

练习 3:编写一个生成给定数字的斐波那契序列的脚本。序列从 1 开始,脚本必须接受大于 3 的数字。

所以,如果你运行 fibonacci.sh 5,它应该输出 “1 1 2 3 5”。

就这些了,伙计们!这是 Bash 基础系列的最后一节。当然,你在这里学到的只是冰山一角;Bash 编程还有更多需要学习的内容。

但是现在,你应该对 Bash Shell 有了一定的理解。你应该能够理解大多数 Bash 脚本,并能编写简单的脚本,即便不能编写复杂的。

如果你想深入学习,没有什么比阅读 GNU Bash 手册更好的了。

GNU Bash 手册

? 希望你喜欢这个 Bash 基础知识系列。我们正在创建更多的教程系列,以给你提供更流畅的学习体验。请提供你的反馈,帮助我们帮助其他人学习 Linux。

(题图:MJ/f0022a50-85fe-40cc-afdd-285d976ec98c)


via: https://itsfoss.com/bash-function/

作者:Abhishek Prakash 选题:lujun9972 译者:ChatGPT 校对:wxy

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

在 Bash 基础知识系列的倒数第二章节,学习 forwhileuntil 循环。

循环是任何编程语言中的一个强大功能。如果你还不知道,循环其实是一种根据某些条件重复代码的方式。

例如,想象一下你需要打印从 1 到 10 的数字。你可以使用 echo 命令写十次,但那太原始了。你使用一个循环,在 3 到 4 行代码内,就能完成。

这是我能想到的最简单的例子。我将在讨论 Bash 循环时,分享一些实际有用的例子。

在 Bash 中有三种类型的循环:

  • for
  • while
  • until

我将在教程中展示所有三种类型的循环。让我们从最常见的一种开始。

Bash 中的 For 循环

以下是 Bash 中的 for 循环语法:

for arg in LIST; do
    commands
done

这里的 LIST 可能是一个数组或者一个项目列表。括号扩展 也是进行循环的常用手段。

考虑一下我在开始提到的最简单的场景。让我们使用 for 循环打印从 1 到 10 的数字:

#!/bin/bash

for num in {1..10}; do
    echo $num
done

如果你运行它,你应该会看到像这样的输出:

$ ./for-loop.sh
1
2
3
4
5
6
7
8
9
10

你也可以使用 for num in 1 2 3 4 5 6 7 8 9 10; do ,但是使用括号扩展使得代码看起来更短且更智能。

{..} 是用于扩展模式的。你使用 {d..h} ,它等同于 d e f g h 。关于括号扩展的更多信息,可以在这篇文章中找到。

在 Bash 中使用括号扩展

? 如果你熟悉 C 语言编程,你可能会喜欢在 bash 中使用 C 风格的 for 循环:

for ((i = 0 ; i < 10 ; i++)); do
  echo $i
done

让我们看另一个例子,显示 Bash 数组 的所有内容:

#!/bin/bash

distros=(Ubuntu Fedora Debian Alpine)

for i in "${distros[@]}"; do
    echo $i
done

如果你运行脚本,它将显示数组中定义的所有发行版:

Ubuntu
Fedora
Debian
Alpine

Bash 中的 While 循环

while 循环测试一个条件,然后只要条件为真,就继续循环。

while [ condition ]; do
    commands
done

如果你考虑前一个例子,它可以使用 while 循环进行重写:

#!/bin/bash

num=1
while [ $num -le 10 ]; do
    echo $num
    num=$(($num+1))
done

如你所见,你首先需要将变量 num 定义为 1,然后在循环体内,你增加 num 的值。只要 num 小于或等于 10,while 循环就会检查条件并运行脚本。

因此,现在运行脚本将会显示出和之前 for 循环中看到的完全相同的结果。

1
2
3
4
5
6
7
8
9
10

让我们看另一个例子。这是一个 Bash 脚本,它接受一个数字作为参数 并显示该表。

#!/bin/bash

echo "Table for $1 is:"
index=1
while [ $index -le 10 ]; do
    echo $(($1*$index))
    index=$(($index+1))
done

如果你对 $1 的使用感到困惑,它代表传递给脚本的第一个参数。更多的细节可以参考这个系列的 第三章

如果你运行这个脚本,它应该会显示以下的输出:

$ ./table.sh 2
Table for 2 is:
2
4
6
8
10
12
14
16
18
20

Bash 中的 Until 循环

这是一个使用较少的循环格式。它的行为和 while 循环类似。这里的区别是,循环运行直到它检查的条件为真为止。意味着为了在循环中执行代码,[ ] 中的条件必须为假。

我马上会解释一下。让我们先看一下它的语法。

until [ condition ]; do
    commands
done

现在,如果我要使用相同的示例,即使用 until 循环打印从 1 到 10 的数字,它看起来会是这样:

#!/bin/bash

num=1
until [ $num -gt 10 ]; do
    echo $num
    num=$(($num+1))
done

区别在于条件;其余部分保持不变。

  • 当变量 num 小于或等于 10 时,while 循环就会运行。[ ] 中的条件必须为真,循环才会执行。
  • 知道变量 num 变得大于 10 时,until 循环才会运行。[ ] 中的条件必须为假,循环才会执行。

这都是做同样事情的两种不同方式。while 更受欢迎,因为你会在大多数编程语言中找到类似 while 的循环语法。

?️ 练习时间

那是有趣的。现在是做一些练习的时候了。

练习 1:编写一个脚本,该脚本接受一个数字作为参数并打印其表格。如果脚本在没有参数的情况下运行,你的脚本还应显示一个消息。

预期输出

$: ./table.sh
You forgot to enter a number

$: ./table.sh 3
3
6
9
12
15
18
21
24
27
30

练习 2 : 编写一个脚本,列出目录 /var 中的所有文件。

提示 : 对于循环,使用 /var/* 作为 “列表”。

Bash 基础知识系列即将结束。作为该系列的最后一章,你将在下周学习在 Bash 脚本中使用函数。敬请期待。

(题图:MJ/945241d6-6a73-432c-9bcd-e0948b3fadc0)


via: https://itsfoss.com/bash-loops/

作者:Abhishek Prakash 选题:lujun9972 译者:ChatGPT 校对:wxy

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

OpenCost 是一款与 Kubernetes 无缝集成的云成本监控工具,可让您实时跟踪云支出,从而相应地优化资源。

Kubernetes 是一个强大的平台,用于管理云中的动态容器化应用,但可能很难理解成本发生在哪里。管理 Kubernetes 资源的成本效率可能是一个挑战。这就是 OpenCost 的用武之地。OpenCost 是一种云成本监控工具,与 Kubernetes 无缝集成,让你可以实时跟踪云支出,以便相应地优化资源。

OpenCost 是一个开源 CNCF 沙盒项目规范,用于实时监控与 Kubernetes 部署相关的云成本。该规范按服务、部署、命名空间、标签等对当前和历史 Kubernetes 云支出和资源分配进行建模。这些数据对于理解和优化 Kubernetes 从应用到基础设施的成本和性能至关重要。

要求和安装

开始使用 OpenCost 是一个相对简单的过程。OpenCost 使用 Prometheus 进行监控和指标存储。你可以从 Prometheus 社区的 Kubernetes Helm Chart 安装它。

安装 Prometheus

首先使用以下命令安装 Prometheus:

$ helm install my-prometheus --repo https://prometheus-community.github.io/helm-charts prometheus \
 --namespace prometheus --create-namespace \
 --set pushgateway.enabled=false --set alertmanager.enabled=false -f \
https://raw.githubusercontent.com/opencost/opencost/develop/kubernetes/prometheus/extraScrapeConfigs.yaml

安装 OpenCost

接下来,使用 kubectl 命令安装 OpenCost:

$ kubectl apply --namespace opencost -f \
https://raw.githubusercontent.com/opencost/opencost/develop/kubernetes/opencost.yaml

此命令将 OpenCost 部署到你的集群并开始收集数据。这就是大多数安装所需的全部内容。你可以使用你自己的 Prometheus 安装或使用 OpenCost Helm Chart 自定义部署。

测试和访问

OpenCost 会自动检测它是否在 AWS、Azure 还是 GCP 上运行,你可以将其配置为为本地 Kubernetes 部署提供定价。首先转发 API 和 UI 访问的端口:

$ kubectl port-forward --namespace opencost service/opencost 9003 9090

大约五分钟内,你可以验证 UI 和服务器是否正在运行,并且你可以通过 http://localhost:9090 访问 OpenCost UI。

监控成本

你已准备好开始使用部署到 Kubernetes 集群的 OpenCost 来监控云成本。OpenCost 仪表板提供对云支出的实时可见性,使你能够识别成本异常并优化云资源。你可以按节点、命名空间、pod、标签等查看云支出。

OpenCost monitoring console

kubectl cost 插件提供了对 Kubernetes 成本分配指标的简单 CLI 查询。它允许开发人员、运营商和其他人快速确定任何 Kubernetes 工作负载的成本和效率。

$ kubectl cost --service-port 9003 \
--service-name opencost --kubecost-namespace opencost \
--allocation-path /allocation/compute pod \
--window 5m --show-efficiency=true

+-------+---------+-------------+----------+---------------+
|CLUSTER|NAMESPACE|POD          |MONTH RATE|COST EFFICIENCY|
+-------+---------+-------------+----------+---------------+
|cl-one |kube-syst|coredns-db...| 1.486732 |      0.033660 |
|       |         |coredns-...dm| 1.486732 |      0.032272 |
|       |         |kube-prox...7| 1.359577 |      0.002200 |
|       |         |kube-prox...x| 1.359577 |      0.002470 |
|       |opencost |opencost...5t| 0.459713 |      0.187180 |
|       |kube-syst|aws-node-cbwl| 0.342340 |      0.134960 |
|       |         |aws-node-gbfh| 0.342340 |      0.133760 |
|       |prometheu|my-prome...pv| 0.000000 |      0.000000 |
|       |         |my-prome...hn| 0.000000 |      0.000000 |
|       |         |my-prome...89| 0.000000 |      0.000000 |
+-------+---------+-------------+----------+---------------+
| SUMMED|         |             | 6.837011 |               |
+-------+---------+-------------+----------+---------------+

你还可以集成 API,以编程方式将数据提取到你选择的平台中。

Kubernetes 优化策略

现在你已经掌握了云成本,是时候优化你的 Kubernetes 环境了。优化是一个迭代过程。从栈的顶部(容器)开始并遍历每一层。每一步的效率都会复合。有很多方法可以优化 Kubernetes 以提高成本效率,例如:

  • 查找废弃的工作负载和未申明的卷:不再使用或断开连接的容器荚和存储会继续消耗资源而不提供价值。
  • 调整你的工作负载大小:确保你为你的工作负载使用正确大小的容器。调查分配过多和分配不足的容器。
  • 自动扩展:自动扩展可以帮助你仅在需要时使用资源来节省成本。
  • 调整集群大小:节点过多或过大可能会导致效率低下。在容量、可用性和性能之间找到适当的平衡可能会大大降低成本。
  • 研究更便宜的节点类型:CPU、RAM、网络和存储有很多变化。切换到 ARM 架构可能会带来更大的节省。
  • 投资 FinOps 团队:组织内的专门团队可以通过协调预留实例、现货实例和节省计划来寻找实现更大节省的方法。

从今天开始

监控 Kubernetes 环境中的成本可能具有挑战性,但使用 OpenCost 则不必如此。要开始使用 OpenCost 并控制你的云支出,请访问 OpenCost 网站,在 GitHub 中获取代码,查看 OpenCost 文档,并参与 CNCF Slack 中的 #opencost 频道。

(题图:MJ/5de557f1-464c-480c-8698-130748f60b20)


via: https://opensource.com/article/23/3/kubernetes-cloud-cost-monitoring

作者:Matt Ray 选题:lkxed 译者:geekpi 校对:wxy

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