分类 技术 下的文章

通过使用网络绑定磁盘加密(NBDE),无需手动输入密码即可打开加密磁盘。

从安全的角度来看,对敏感数据进行加密以保护其免受窥探和黑客的攻击是很重要的。 Linux 统一密钥设置 Linux Unified Key Setup LUKS)是一个很好的工具,也是 Linux 磁盘加密的通用标准。因为它将所有相关的设置信息存储在分区头部中,所以它使数据迁移变得简单。

要使用 LUKS 配置加密磁盘或分区,你需要使用 cryptsetup 工具。不幸的是,加密磁盘的一个缺点是,每次系统重启或磁盘重新挂载时,你都必须手动提供密码。

然而, 网络绑定磁盘加密 Network-Bound Disk Encryption (NBDE) 可以在没有任何用户干预的情况下自动安全地解锁加密磁盘。它可以在一些 Linux 发行版中使用,包括从 Red Hat Enterprise Linux 7.4、CentOS 7.4 和 Fedora 24 开始,以及之后的后续版本。

NBDE 采用以下技术实现:

  • Clevis 框架:一个可插拔的框架工具,可自动解密和解锁 LUKS 卷
  • Tang 服务器:用于将加密密钥绑定到网络状态的服务

Tang 向 Clevis 客户端提供加密密钥。据 Tang 的开发人员介绍,这为密钥托管服务提供了一个安全、无状态、匿名的替代方案。

由于 NBDE 使用客户端-服务器架构,你必须同时配置客户端和服务器。你可以在你的本地网络上使用一个虚拟机作为 Tang 服务器。

服务器安装

用 sudo 安装 Tang:

sudo yum install tang -y

启用 Tang 服务器:

sudo systemctl enable tangd.socket --now

Tang 服务器工作在 80 端口,需加入到 firewalld 防火墙。添加相应的 firewalld 规则:

sudo  firewall-cmd --add-port=tcp/80 --perm
sudo firewall-cmd --reload

现在安装好了服务器。

客户端安装

在本例中,假设你已经添加了一个名为 /dev/vdc 的新的 1GB 磁盘到你的系统中。

使用 fdiskparted 创建主分区:

sudo fdisk /dev/vdc

完成以下步骤来安装客户端:

Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x4a6812d4.

Command (m for help):

输入 n 来创建新的分区:

Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended  
Select (default p):

按下回车键选择主分区:

Using default response p
Partition number (1-4, default 1):

按下回车键选择默认分区号:

First sector (2048-2097151, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151):

按回车键选择最后一个扇区:

Using default value 2097151
Partition 1 of type Linux and of size 1023 MiB is set

Command (m for help): wq

输入 wq 保存更改并退出 fdisk

The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

运行 partprobe 通知系统分区表的变化:

sudo partprobe

使用 sudo 安装 cryptsetup 软件包:

sudo yum install cryptsetup -y

使用 cryptsetup luksFormat 命令对磁盘进行加密。当提示时,你需要输入大写的 YES,并输入密码来加密磁盘:

sudo cryptsetup luksFormat /dev/vdc1
WARNING!
========
This will overwrite data on /dev/vdc1 irrevocably.

Are you sure? (Type uppercase yes):

Enter passphrase for /dev/vdc1:
Verify passphrase:

使用 cryptsetup luksOpen 命令将加密的分区映射到一个逻辑设备上。例如,使用 encryptedvdc1 作为名称。你还需要再次输入密码:

sudo cryptsetup luksOpen /dev/vdc1 encryptedvdc1
Enter passphrase for /dev/vdc1:

加密分区现在在 /dev/mapper/encryptedvdc1 中可用。

在加密的分区上创建一个 XFS 文件系统:

sudo mkfs.xfs /dev/mapper/encryptedvdc1

创建一个挂载加密分区的目录:

sudo mkdir /encrypted

使用 cryptsetup luksClose 命令锁定分区:

cryptsetup luksClose encryptedvdc1

使用 sudo 安装 Clevis 软件包:

sudo yum install clevis clevis-luks clevis-dracut -y

修改 /etc/crypttab,在启动时打开加密卷:

sudo vim /etc/crypttab

增加以下一行:

encryptedvdc1       /dev/vdc1  none   _netdev

修改 /etc/fstab,在重启时或启动时自动挂载加密卷:

sudo vim /etc/fstab

增加以下一行:

/dev/mapper/encryptedvdc1   /encrypted       xfs    _netdev        1 2

在这个例子中,假设 Tang 服务器的 IP 地址是 192.168.1.20。如果你喜欢,也可以使用主机名或域名。

运行以下 clevis 命令:

sudo clevis bind luks -d /dev/vdc1 tang '{"url":"http://192.168.1.20"}'
The advertisement contains the following signing keys:

rwA2BAITfYLuyNiIeYUMBzkhk7M

Do you wish to trust these keys? [ynYN] Y
Enter existing LUKS password:

输入 Y 接受 Tang 服务器的密钥,并提供现有的 LUKS 密码进行初始设置。

通过 systemctl 启用 clevis-luks-askpass.path,以防止非根分区被提示输入密码。

sudo systemctl enable clevis-luks-askpass.path

客户端已经安装完毕。现在,每当你重启服务器时,加密后的磁盘应该会自动解密,并通过 Tang 服务器取回密钥进行挂载。

如果 Tang 服务器因为任何原因不可用,你需要手动提供密码,才能解密和挂载分区。


via: https://opensource.com/article/20/11/nbde-linux

作者:Curt Warfield 选题:lujun9972 译者:geekpi 校对:wxy

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

作为一个工程师,我们经常与命令行打交道,但除了工作用的命令,你是否尝试过让命令来替代你生活中方方面面?

为了让更多的爱好者可以用命令行作为自己的有效工具,Linux 中国特别邀请了三位作者,撰写了《命令行生存指南》,希望可以通过这个系列的文章,让你换一个视角,来看待命令行的存在。如果你想体验一下不一样的命令行,那就不妨来看看今天的《命令行生存指南》。

本次的内容为试读内容,也欢迎你针对今天的内容提出自己的意见和建议。

操作概述

备份文件时常常涉及到大文件传输的问题,遇到网络质量不佳或者其他问题常常会导致传输中断,而不得不进行重传。如果采用先将大文件拆分成多个小文件进行传输、待全部传输完成后合并所有文件的方式,往往可以改善传输体验。

这一节将会介绍 Linux 命令行下的文件拆分与合并操作。

概念和术语

拆分,顾名思义,就是将一个大的文件分割成若干个较小的文件,这些小文件按次序拼接后可以还原大文件。通常情况下,根据文件大小进行拆分是较为常见的方式;但由于文本文件具有行数特征,所以除了按大小拆分之外,也可以按行数拆分。

合并,就是将若干个较小的文件拼接成一个较大文件。通常只需要按次序连接即可,相对比较简单。

通常情况下,为确保拆分前和合并后的两个文件相同,需要进行验证。

操作实战

场景一:使用 split 拆分文件

难度
演示用发行版Fedora 32
涉及命令split

split 是 Linux 环境提供的文件拆分实用程序,同时支持二进制文件和文本文件。通常情况下已经随 coreutils 内置于系统中,无需另行安装。

按大小拆分

二进制文件和文本文件按大小拆分时使用的选项不同:

  • 二进制文件使用 -b 选项指定分割后的文件大小。
  • 文本文件则使用 -C 选项指定分割后的文件大小。

二者用法类似,只需要:

split [选项] [大小] [待拆分文件] [拆分后的前缀(可选)]

以将 debian-live-10.5.0-amd64-lxqt.iso(约 2.4 GB)按 100MB 大小进行拆分为例:

> split -b 100M debian-live-10.5.0-amd64-lxqt.iso debian-live-

可以看到原文件被拆分成 25 个更小的文件,从 aa 到 ay:

debian-live-aa  debian-live-ad  debian-live-ag  debian-live-aj  debian-live-am  debian-live-ap  debian-live-as  debian-live-av  debian-live-ay
debian-live-ab  debian-live-ae  debian-live-ah  debian-live-ak  debian-live-an  debian-live-aq  debian-live-at  debian-live-aw
debian-live-ac  debian-live-af  debian-live-ai  debian-live-al  debian-live-ao  debian-live-ar  debian-live-au  debian-live-ax

场景二:使用 cat 合并文件

难度
演示用发行版Fedora 32
涉及命令catdiff

cat 是 linux 环境提供的文件连接实用程序,能够连接文件并将其输出到标准输出。通常情况下已经随 coreutils 内置于系统中,无需另行安装。

值得注意的是,为了保证合并后的文件和原始文件一致,在有条件的情况下,可以用 diff 命令验证。

合并拆分后的文件

使用 cat 合并文件可以采用 cat [文件...] > [合并后的文件名] 的格式,此方法对二进制文件和文本文件均有效。

以之前的 debian-live-aa 到 debian-live-ay 为例,合并时可以使用此命令:

> cat debian-live-* > debian-live.iso

可以看到目录下会生成合并后的 debian-live.iso 文件。

debian-live-aa  debian-live-ad  debian-live-ag  debian-live-aj  debian-live-am  debian-live-ap  debian-live-as  debian-live-av  debian-live-ay
debian-live-ab  debian-live-ae  debian-live-ah  debian-live-ak  debian-live-an  debian-live-aq  debian-live-at  debian-live-aw  debian-live.iso
debian-live-ac  debian-live-af  debian-live-ai  debian-live-al  debian-live-ao  debian-live-ar  debian-live-au  debian-live-ax

使用 diff 验证文件

只需要按 diff [原文件] [现文件] 的格式执行即可。如果没有输出,则证明两个文件之间没有差异。

以对比 debian-live-10.5.0-amd64-lxqt.isodebian-live.iso 为例:

> diff debian-live-10.5.0-amd64-lxqt.iso debian-live.iso
> # 无输出,表示二者是相同的。

小练习

  • 尝试以不同方式拆分系统中的日志文件。

拓展阅读

Etcher 是一款流行的 USB 烧录应用,可用于创建可启动的 Linux USB。让我来告诉你如何安装它,以及如何使用它来制作一个 Linux 临场盘。

Etcher:一个用于在 SD 卡和 USB 驱动器中烧录 Linux ISO 的开源工具

Etcher 是一个由 Balena 开发的开源项目,来用于为树莓派烧录 SD 卡。事实上,我们在如何在 SD 卡上安装 Raspbian OS 的教程中就使用了它。

它不仅仅局限于 SD 卡,你还可以使用 Etcher 来制作一个可启动的 USB 驱动器,我们就通过它的帮助在 Linux 中制作了一个 Manjaro 的临场 USB

自首次发布以来,Etcher 就以其整洁的界面和简单的使用方式引起了人们的注意。

在本文中,我将重点介绍帮助你在 Linux 上安装 Etcher 的步骤。然后,我还将展示如何使用它。在这之前,让我先给大家介绍一下它的功能。

Etcher 的功能

  • 在烧录前验证驱动器
  • 漂亮的用户界面
  • 自动检测 USB 驱动器/SD 卡,防止电脑上的硬盘被擦除。
  • 跨平台支持(Windows、macOS 和 Linux)。
  • 快速烧录
  • 简单的三步过程

理论上,你已经有了在 SD 卡和 USB 驱动器上烧录操作系统镜像所需的一切。同样令人激动的是,根据他们的路线图,他们计划增加对多个设备的同步写入支持。

在 Linux 上安装 Etcher

要开始使用,你需要从它的官方网站上下载它提供的 AppImage 文件(适用于任何 Linux 发行版)。

你只需要前往它的主页,并根据你的系统(32 位/64 位)下载一个程序:

在我的例子中,我下载了 Ubuntu 的 64 位 AppImage 文件。你可以通过我们的指南来了解在 Linux 上使用 AppImage文件,但我会让你先知道下一步需要做什么。

你需要给文件执行权限,你可以右击AppImage 文件 -> 属性来实现。

接下来,点击权限选项卡下的“允许作为程序执行”,如下图所示。

现在,只需双击 AppImage 文件即可启动 Etcher!

这应该可以在任何 Linux 发行版上运行。在任何情况下,如果你想从源码构建或者直接使用 .rpm 或 .deb 文件安装,你也可以前往它的 Github 发布页找到 RPM、DEB 和源码。

你也可以参考我们的在 Ubuntu 中使用 deb 文件来安装应用。

注意!

我们注意到,当你使用 Etcher 创建 Linux 发行版的临场 USB 时,它会使 USB 处于明显的不可使用状态,即它只有几 MB 的空闲空间,并且不能直接格式化。在 Linux 上,你可以使用磁盘工具手动删除分区,然后格式化它

在 Linux 上使用 Etcher

只需三步就可以开始使用 Etcher。在你启动它之后,根据屏幕上的提示应该是清晰的,但为了给你一个好的开始,以下是你要做的事情:

步骤 1: 选择合适的 ISO 镜像文件或你需要烧录的文件的 URL(如下图所示)。

步骤 2: 接下来,你需要选择目标设备。它会自动检测并高亮显示可移动设备,以防止你选择任何内部存储位置。

在这里,我连接了一个 USB 驱动器,我也选择了它(如下图所示)。

步骤 3: 现在,你所有需要做的就是烧录镜像并等待它成功完成。

这是进度的样子:

完成了!

总结

Etcher 是一个有用的工具,可以为 SD 卡和 USB 驱动器烧录操作系统镜像。我倾向于主要使用它来创建临场 USB 驱动器来测试 Linux 发行版,我对它很满意。

你更喜欢用什么来创建可启动驱动器?你是否已经尝试过 Etcher?请在下面的评论中告诉我你的想法。


via: https://itsfoss.com/install-etcher-linux/

作者:Ankush Das 选题:lujun9972 译者:geekpi 校对:wxy

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

如果你像我一样,你可能会发现自己因为各种原因而运行 Windows,无论是因为工作还是游戏。当然,你可以在虚拟机或容器中运行 Fedora,但这些并不像 Windows 的 Linux 子系统(WSL)那样容易融合到普通的 Windows 体验中。通过 WSL 使用 Fedora 可以让你将这两种环境融合在一起,创造一个奇妙的开发环境。

先决条件

为了达成这一目标,你需要一些基本条件。你应该运行 Windows 10,并且已经安装了 WSL2。如果没有,请查看微软文档说明,完成后再回来这里。微软建议为了简单起见,将 WSL2 设置为发行版的默认设置。本指南假设你已经这样做了。

接下来,你将需要一些解压 xz 压缩文件的方法。你可以用另一个基于 WSL 的发行版来解压,或者使用 7zip

下载 Fedora 33 rootfs

由于 Fedora 并没有提供实际的 rootfs 存档,所以我们将借用一个用于生成 Dockerhub 容器镜像的存档。你需要从 fedora-cloud 的 GitHub 仓库下载该 tar.xz 文件 。一旦你有了这个 tar.xz 文件,解压它,但不要展开 tar 包。你会得到一个类似 fedora-33-时间标签.tar 的文件。有了这个文件,你就可以构建镜像了。

组合 WSL Fedora 的构建版本

我喜欢使用 c:\distros 目录,但你可以选择几乎任何你想要的位置。无论你选择什么目录,在你导入该构建版本之前,确保其顶层路径存在。现在打开一个 CMD 或 Powershell 提示符,因为是时候导入了:

wsl.exe --import Fedora-33 c:\distros\Fedora-33 $HOME\Downloads\fedora-33.tar

你会看到 Fedora-33 显示在 WSL 的列表当中:

PS C:\Users\jperrin> wsl.exe -l -v
  NAME                   STATE           VERSION
  Fedora-33                 Stopped         2

下面,你就可以开始在 WSL 中摆弄 Fedora 了,但我们还需要做一些事情来使它真正成为一个有用的 WSL 发行版。

wsl -d Fedora-33

这将以 root 用户的身份启动 Fedora 的 WSL 实例。下面,你将安装一些核心包并设置一个新的默认用户。你还需要配置 sudo,否则你将无法在以后需要安装其他东西时轻松提升权限。

dnf update
dnf install wget curl sudo ncurses dnf-plugins-core dnf-utils passwd findutils

wslutilites 使用 curlwget 来实现与 VS Code 的集成,所以它们很有用。由于你需要使用 COPR 仓库,你需要增加 dnf 功能。

添加你的用户

现在是时候添加你的用户,并将其设置为默认用户。

useradd -G wheel 用户名
passwd 用户名

现在,你已经创建了你的用户名,并添加了密码,确保它们可以工作。退出 WSL 实例,并再次启动它,这次指定用户名。你还要测试 sudo,并检查你的 uid。

wsl -d Fedora-33 -u 用户名
$id -u
1000
$ sudo cat /etc/shadow

假设一切正常,你现在已经准备好在 Windows 中为你的 Fedora 环境设置默认用户。要做到这一点,请退出 WSL 实例并回到 Powershell 中。这个 Powershell 单行代码可以正确配置你的用户:

Get-ItemProperty Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\\*\ DistributionName | Where-Object -Property DistributionName -eq Fedora-33  | Set-ItemProperty -Name DefaultUid -Value 1000

现在你应该可以再次启动 WSL,而不需要指定就可以成为自己的用户而不是 root。

自定义!

至此,你已经有了可以在 WSL 中运行的基本 Fedora 33 环境,但它还没有 Windows 集成的部分。如果你想要这个,有一个 COPR 仓库可以启用。如果你选择添加这部分,你就可以直接在 shell 里面运行 Windows 应用,也可以轻松地将你的 Linux 环境与 VS Code 集成。需要注意的是,COPR 并没有得到 Fedora 基础架构的官方支持。使用该软件包,风险自担。

dnf copr enable trustywolf/wslu

现在你可以去配置终端、设置一个 Python 开发环境,或者其它你想使用 Fedora 33 的方式。享受吧!


via: https://fedoramagazine.org/wsl-fedora-33/

作者:Jim Perrin 选题:lujun9972 译者:wxy 校对:wxy

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

微软基于服务器的 Linux 保护计划的公开预览现在提供了改进的端点检测和响应功能。

我知道你们中的一些人还很难接受,但微软最近确实在支持 Linux。一个案例是:早在 6 月份,微软就发布了面向 Linux 的 Microsoft Defender Advanced Threat Protection(ATP),供普通用户使用。现在,微软改进了 Linux 版本的 Microsoft Defender,公开预览版增加了端点检测和响应(EDR)功能

这并不是一个你可以在独立的 Linux 桌面上运行的 Microsoft Defender 版本。它的主要工作仍然是保护 Linux 服务器免受服务器和网络威胁。如果你想为你的独立桌面提供保护,可以使用 ClamAVSophos Antivirus for Linux 等程序。

但对于企业来说,由于现在在家上班的人在各种地方使用他们的 Mac 和 Windows PC,这就是另外一个需求了。虽然基于 Linux 服务器,但你能够使用它来保护运行 macOS、Windows 8.1 和 Windows 10 的 PC

通过这些新的 EDR 功能,Linux Defender 用户可以检测到涉及 Linux 服务器的高级攻击,利用丰富的经验,并快速补救威胁。这是在现有的预防性防病毒功能和通过 Microsoft Defender 安全中心提供的集中报告基础上发展起来的。

具体来说,它包括:

  • 丰富的调查体验,包括机器时间线、进程创建、文件创建、网络连接、登录事件和高级狩猎。
  • 在编译过程和大型软件部署中优化了性能增强的 CPU 利用率。
  • 上下文反病毒检测。就像 Windows 版一样,你可以深入了解威胁的来源以及恶意进程或活动是如何创建的。

要运行更新后的程序,你需要以下 Linux 服务器之一:RHEL 7.2+、CentOS Linux 7.2+、Ubuntu 16.04 或更高的 LTS 版本、SLES 12+、Debian 或更高版本、或 Oracle Linux 7.2。

接下来,要尝试这些公共预览功能,你需要在 Microsoft Defender 安全中心里打开预览功能。在这样做之前,请确保你运行的是 101.12.99 或更高版本。你可以通过命令找出你正在运行的版本:

mdatp health

在任何情况下,你都不应该将在 Linux 上运行 Microsoft Defender for Endpoint 的所有服务器都切换到预览模式。相反,微软建议你仅将部分 Linux 服务器配置为预览模式,使用以下命令切换:

$ sudo mdatp edr early-preview enable 

这样做了之后,如果你觉得自己很勇敢,想亲自看看它是否有效,微软提供了一种运行模拟攻击的方法。要做到这一点,请按照下面的步骤在你的 Linux 服务器上模拟检测,并调查情况:

  • 验证在场的 Linux 服务器是否出现在 Microsoft Defender 安全中心中。如果这是该机器的第一次上线,可能需要长达 20 分钟才能出现。
  • aka.ms/LinuxDIY 这里下载并解压脚本文件到已在场的 Linux 服务器上,并运行以下命令:./mde_linux_edr_diy.sh
  • 几分钟后,应该会在 Microsoft Defender 安全中心发出警报。
  • 查看警报详情、机器时间线,并执行典型的调查步骤。

祝你好运!


via: https://www.zdnet.com/article/microsoft-defender-for-linux-adds-new-security-feature/

作者:Steven J. Vaughan-Nichols 译者:wxy 校对:wxy

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

只需一点编程经验,你就可以在短短几天内(有时更少)学会一种新编程语言。

有些人喜欢学习新的编程语言,也有一些人觉得学习一种都是可望不可及的事情。在本文中,我将向你展示如何像程序员一样思考,这样你就可以自信地学习任何一门你想要学习的编程语言。

事实上,一旦你学会了如何编程,你使用的编程语言就不再是一个障碍,而更像是一种形式。实际上,这就是教育家们倡导 让孩子尽早学习编程 的众多原因之一。不管他们的入门语言有多简单,这种编程的逻辑和儿童们(或成人学习者)以后可能遇到的其他语言的逻辑有着想通之处。

只需有一点编程经验(你可以从我们这里的几篇介绍性文章中获得),你就可以在短短几天内(有时更短)学习任何编程语言。这并不是魔法,你也确实要为此付出一些努力。诚然,学习一种编程语言每个的可用库,或者学习打包代码以及进行交付的细微差别,需要的时间远远不止几天。但是,就入门来说,比你想像中的要容易许多,剩下的则要通过不断练习来完成。

当有经验的程序员静下心来学习一门新的编程语言时,他们会寻找五样东西。只要你知道了这五件事,你就可以开始编码了。

1、语法

 title=

语言的语法描述了代码的结构。这包括如何逐行编写代码,以及用于构造代码语句的实际单词。

例如,Python 以使用缩进来指示一个代码块在哪里结束以及另一代码块在哪里开始而闻名:

while j < rows:
    while k < columns:
        tile = Tile(k * w)
        board.add(tile)
        k += 1
    j += 1
    k = 0

Lua 只是使用关键字 end

for i,obj in ipairs(hit) do
  if obj.moving == 1 then
     obj.x,obj.y = v.mouse.getPosition()
  end
end

JavaC、C++ 之类的编程语言使用花括号:

while (std::getline(e,r)) {
  wc++;
  }

编程语言的语法还包括包括库、设置变量和终止行等内容。通过练习,你将学会在阅读示例代码时下意识地识别语法需求(和惯例)。

实践

当学习一门新的编程语言时,要努力理解它的语法。你不需要去记住它,只需要知道如果忘记了以后去哪里查找。使用好的 IDE 也很有帮助,因为很多 IDE 在出现语法错误时会提醒你。

2、内置函数和条件

 title=

就像自然语言一样,编程语言可以识别的合法单词是有限的。这个词汇表可以使用其他库进行扩展,但是核心语言知道一组特定的关键字。大多数语言并没有你想的那么多关键字。即使在像 C 语言这样非常低级的语言中,也只有 32 个关键字,比如 fordowhileintfloatcharbreak 等等。

了解了这些关键字,你就可以编写基本的表达式,也就是构建程序的代码块。许多内置的关键字能帮助你构建条件语句,这些条件语句影响整个程序的流程。例如,如果你想编写一个允许单击和拖动图标的程序,那么你的代码就必须检测用户的鼠标指针何时位于图标上。只有当鼠标光标位于图标外部边缘相同的坐标时,才执行导致使鼠标抓取图标的代码。这是一个经典的 if / then 语句,但不同的语言可以用不同的方式表达。

Python 使用 ifelifelse 的组合来实现条件语句,但是并不显式的关闭语句:

if var == 1:
    # action
elif var == 2:
    # some action
else:
    # some other action

Bash 使用 ifelifelse,并且使用 fi 来结束语句:

if [ "$var" = "foo" ]; then
   # action
elif [ "$var" = "bar" ]; then
   # some action
else
   # some other action
fi

然而 C 和 Java, 使用 ifelseelse if,用花括号把它们括起来:

if (boolean) {
   // action
} else if (boolean) {
   // some action
} else {
   // some other action
}

各种编程语言虽然在关键字的选择和语法上有细微的变化,但基本是相同的。学习如何在编程语言中定义条件语句,包括 if / thendo...whilecase 语句。

实践

要熟悉编程语言能够理解的关键字集。在实践中,你的代码将不仅仅包含编程语言的关键字,可以肯定的是,有包含很多简单函数的库来帮助你做一些事情,诸如将输出打印到屏幕或显示窗口之类。然而,驱动这些库的逻辑始于编程语言的内置关键字。

3、数据类型

 title=

代码是用来处理数据的,因此你必须学习编程语言如何识别不同类型的数据。所有编程语言都能理解整数,大多数的语言能理解小数和单个字符(abc 等等)。它们通常被表示为 intfloatdoublechar,当然,语言的内置词汇表会告诉你如何引用这些实体。

有时候,在编程语言中内置了一些额外的数据类型,也有时是通过引用库来启用复杂的数据类型。例如,Python 可以识别关键字为 str 的字符串,但是 C 语言的代码中必须包含 string.h 头文件才能实现字符串特性。

实践

库可以为你的代码解锁各种类型的数据,但是学习编程语言中包含的基本数据类型是一个明智的起点。

4、运算符和解析器

 title=

一旦你理解了编程语言可处理的数据类型,就可以学习如何分析这些数据了。幸运的是,数学这门学科是相当稳定的,所以算数运算符在许多语言中通常是相同的(或至少非常相似)。例如,两个整数相加通常用 + 符号完成,而测试一个整数是否大于另一个整数通常用 > 符号完成。测试是否相等通常使用 == 来完成(是的,是两个等号,因为通常一个等号用来赋值)。

当然也有一些例外,比如像 Lisp 和 Bash 语言算数运算符就不是如此,但与其他语言一样,这只是一个心理翻译的问题。一旦你了解了表达方式有何不同,很快就可以适应它。快速浏览一下一门编程语言的算数运算符通常足以让你了解算数操作是如何完成的。

你还需要知道如何比较和操作非数值数据,比如字符和字符串。这些通常是通过编程语言的核心库来进行的的。例如,Python 提供了 split() 方法,而 C 语言需要引入头文件 string.h 来提供 strtok() 函数。

实践

了解用于处理基本数据类型的基本函数和关键字,并寻找可帮助你完成复杂操作的核心库。

5、函数

 title=

代码不只是计算机的待办清单。通常情况下,在编写代码时你往往希望向计算机提供一组理论条件和一组操作指令,当满足每个条件时计算机就会采取这些操作。尽管使用条件语句以及数学和逻辑运算符进行流控制可以做很多事情,但是引入了函数和类之后,代码会变得更加高效,因为它们使你可以定义子程序。例如,如果应用程序非常频繁地需要一个确认对话框,那么将其作为类的实例编写一次要比每次需要它时重新编写实现起来要容易得多。

你需要学习如何在编程语言中定义类和函数。更准确地说,你首先需要了解编程语言中是否支持类和函数。大多数现代语言都支持函数,但是类是面向对象的编程语言中所特有的。

实践

学习语言中可用的结构,这些结构可以帮助你高效地编写和使用代码。

你可以学到任何东西

学习编程语言,就其本身而言,是一种编码过程中的子程序。一旦理解了代码如何工作,你所使用的语言就只是一种传递逻辑的媒介。学习一门新编程语言的过程几乎都是一样的:通过简单的练习来学习语法,通过学习词汇来积累进行复杂动作的能力,然后练习、练习、再练习。


via: https://opensource.com/article/20/10/learn-any-programming-language

作者:Seth Kenlon 选题:lujun9972 译者:xiao-song-123 校对:wxy

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