提交 387e0d9f 编写于 作者: W wizardforcel

2022-01-28 22:54:35

上级 fadbf4f7
......@@ -52,7 +52,7 @@ touch dir1/text.txt
同样,权限 **rwxrwxr-x** 表示目录的**所有者**拥有权限 **rwx** (读、写、执行),用户组拥有权限 **rwx** (读、写、执行),其他人拥有权限 **r-x** (读、执行)。
![permissions in Linux](../Images/209aee8ebb4be80f30d4ad0aff819cec.png)
![permissions in Linux](img/209aee8ebb4be80f30d4ad0aff819cec.png)
权限表示中的**破折号** (-)表示特定权限未授予用户类。
......
......@@ -40,25 +40,25 @@ ls [OPTION]... [FILE]...
在本例中,`ls`命令显示文件和目录列表。
![ls command](../Images/712dc7173aacfc11b0c0b5b7a63bfe0d.png)
![ls command](img/712dc7173aacfc11b0c0b5b7a63bfe0d.png)
### 示例:列出目录的隐藏内容
在这个例子中,我们使用的是`ls -a or ls --all` 命令,该命令显示所有包含隐藏文件的文件(文件以。或者..是隐藏的文件或目录)。
![ls command](../Images/d7b934cc11a638863c4b16f464ba7fc3.png)
![ls command](img/d7b934cc11a638863c4b16f464ba7fc3.png)
### 示例:用 ls 命令显示每个文件的作者
在本例中,我们将 **ls** 命令与 **-author** 选项一起使用,该选项以权限打印每个文件的作者。我们也可以使用`ls -author <file name>.`检查任何特定文件
![ls command](../Images/ca78248d7cd380af64683590b272d21d.png)
![ls command](img/ca78248d7cd380af64683590b272d21d.png)
### 示例:列出目录的内容,不包括备份文件
在本例中,我们使用 ls 命令`ls -B option in` 排除了备份文件(文件以~符号结尾)。我们也可以使用`ls --ignore-backups` 过滤备份文件。
![ls command](../Images/0f0af9699ba315e7a2025a222341d738.png)
![ls command](img/0f0af9699ba315e7a2025a222341d738.png)
### 示例:在 ls 命令中使用附加指示器
......@@ -71,7 +71,7 @@ ls [OPTION]... [FILE]...
* “=”符号表示插座。
* “|”符号表示先进先出。
![](../Images/b6a6d1c5f515e6b5f1f519e6a68bac17.png)
![](img/b6a6d1c5f515e6b5f1f519e6a68bac17.png)
### 示例:递归列出子目录
......
......@@ -37,7 +37,7 @@ chown [OPTION]... --reference=RFILE FILE...
ls -l fileName
```
![List File Ownership](../Images/dfc15525b242b8d4779131542057d369.png)
![List File Ownership](img/dfc15525b242b8d4779131542057d369.png)
这里的“`delta`”分别是“`.bashrc`”文件所属的所有者、和组。
......@@ -49,7 +49,7 @@ ls -l fileName
3. 要更改文件所有权,请运行`chown <userName|userID> fileName`
4. 要查看是否已经进行了更改,我们可以再次运行`ls -l fileName`,或者我们可以根据所需的详细程度和用例,在`chown`命令中使用`-c``-v`标志。![chown example](../Images/60ba09b34b9f67db01fc3b232c9f6773.png)
4. 要查看是否已经进行了更改,我们可以再次运行`ls -l fileName`,或者我们可以根据所需的详细程度和用例,在`chown`命令中使用`-c``-v`标志。![chown example](img/60ba09b34b9f67db01fc3b232c9f6773.png)
## 更改集团所有权,并使用`chown`选项
......@@ -69,11 +69,11 @@ ls -l fileName
chown [OPTION]... [USER]:[GROUP] FILE... # When User, and Group are to be explicitly changed
```
![Changing User and Group both](../Images/b86a7a2eb0f79fc74c07350e783dff61.png)
![Changing User and Group both](img/b86a7a2eb0f79fc74c07350e783dff61.png)
2.`-c`标志的`chown`(如有变更,报告)![chown -c example](../Images/48e60666bd21c6814c9083b2ff7d1cd1.png)
2.`-c`标志的`chown`(如有变更,报告)![chown -c example](img/48e60666bd21c6814c9083b2ff7d1cd1.png)
3. `chown`带有`-v`标志(报告所有更改和错误)和`--reference`标志(对所有作为参数传递的文件使用引用的文件所有权)![chown -v, and --ref example](../Images/867fd032717e3c4d1938e1c90152b680.png)
3. `chown`带有`-v`标志(报告所有更改和错误)和`--reference`标志(对所有作为参数传递的文件使用引用的文件所有权)![chown -v, and --ref example](img/867fd032717e3c4d1938e1c90152b680.png)
## 结论
......
......@@ -32,23 +32,23 @@ useradd 命令可用选项的简要描述。
在这个例子中,使用`sudo useradd <username>` 命令,我们可以很容易地将新用户添加到我们的系统中。这里我们不是以 root 权限执行这个命令,所以我们需要使用`sudo` 并且我们必须提供一个系统密码。
![sudo useradd avenger](../Images/cbf07971fec86b9971399fa76bf46b3b.png)
![sudo useradd avenger](img/cbf07971fec86b9971399fa76bf46b3b.png)
## 示例:使用-D 或- default 选项显示当前默认选项类型
在本例中,执行`useradd --default``useradd -D`后,当前默认选项将提示如下图所示。
![useradd --default](../Images/cd052306af8f00d614aa012f7d17407c.png)
![useradd --default](img/cd052306af8f00d614aa012f7d17407c.png)
## 示例:使用带有`useradd`命令的`-r`或`--system`选项创建系统用户。
在这个例子中,我们可以使用`sudo useradd --system <username>`创建一个系统用户。系统用户和普通用户的主要区别在于,系统用户是在没有截止日期的情况下创建的。
![creating system user](../Images/357ef6486cbf2f8aa1db4d07612aded8.png)
![creating system user](img/357ef6486cbf2f8aa1db4d07612aded8.png)
在选项表中,仅给出了几个重要的选项和描述,以了解更多关于用户添加命令用户`useradd --help`中可用选项的信息,它将提示用户添加命令中的所有可用选项。
## ![useradd --help](../Images/b4a0f0245834c12d3354dcfbdb7d8069.png)
## ![useradd --help](img/b4a0f0245834c12d3354dcfbdb7d8069.png)
* * *
......
......@@ -74,9 +74,9 @@ Linux 以两种不同的模式支持该命令:
下面的命令将只允许所有者读取文件。
![chmod command](../Images/c5c1916ba205f0166f1879e2973b0ba9.png)
![chmod command](img/c5c1916ba205f0166f1879e2973b0ba9.png)
![chmod command](../Images/f99d7d83f46ed34ff93330b5b2c87816.png)
![chmod command](img/f99d7d83f46ed34ff93330b5b2c87816.png)
执行命令后,任何一个文件都将被锁定进行编辑。
......@@ -88,7 +88,7 @@ Linux 以两种不同的模式支持该命令:
$ chmod 220 hello.txt
```
![chmod command](../Images/68fd7918fafc21a353959edfd270d5f5.png)
![chmod command](img/68fd7918fafc21a353959edfd270d5f5.png)
### 示例:读写和执行权限
......@@ -98,7 +98,7 @@ $ chmod 220 hello.txt
$ chmod 777 hello.txt
```
![chmod command](../Images/005c3524dc482baf2f5b2ac666db8bd2.png)
![chmod command](img/005c3524dc482baf2f5b2ac666db8bd2.png)
## 结论
......
......@@ -29,19 +29,19 @@ rmdir [OPTION]... DIRECTORY...
在这个例子中,hope 是影子父目录中的一个空目录使用`rmdir <directory name>`可以删除一个空目录。
![remove an empty directory linux](../Images/07529b32fad925a8a2faa164f445e0db.png)
![remove an empty directory linux](img/07529b32fad925a8a2faa164f445e0db.png)
## 示例:删除子目录和父目录。
在本例中,我们将使用`-p`或带有`rmdir`命令的`--parents`删除子目录和父目录。
![Remove the child directory as well as the parent directory.](../Images/b3e9669dbc3deacd85ad607f18483534.png)
![Remove the child directory as well as the parent directory.](img/b3e9669dbc3deacd85ad607f18483534.png)
## 示例:在 rmdir 命令中使用- ignore-fail-on-non-empty 选项。
在此示例中,使用此选项不会报告仅因为目录非空而发生的故障。可以看到,影子是一个非空目录,仍然没有错误报告。
![Use of --ignore-fail-on-non-empty option with rmdir command](../Images/590d4f2f7b9464385c52b4b13720a0ac.png)
![Use of --ignore-fail-on-non-empty option with rmdir command](img/590d4f2f7b9464385c52b4b13720a0ac.png)
## 结论
......
......@@ -2,7 +2,7 @@
> 原文:<https://www.studytonight.com/linux-guide/bash-select-make-menus>
![Bash Select](../Images/c2c7332dce3c1dfe6ebbc5f3d2774043.png)
![Bash Select](img/c2c7332dce3c1dfe6ebbc5f3d2774043.png)
本文将研究 **Bash** 中选择构造的基本原理。
......
......@@ -2,7 +2,7 @@
> 原文:<https://www.studytonight.com/linux-guide/tar-command-in-linux-create-and-extract-archives>
![Tar](../Images/df85ab0ea0fe0796e231718f8e54d262.png)
![Tar](img/df85ab0ea0fe0796e231718f8e54d262.png)
**Linux** 发行版捆绑在一起的 GNU tar 工具具有内置压缩功能。它可以生成一个. tar 档案,然后在一次操作中使用 gzip 或 bzip2 压缩来压缩它。这就是为什么结果文件是一个 **.tar.gz 文件或. tar.bz2 文件。**
......
......@@ -2,7 +2,7 @@
> 原文:<https://www.studytonight.com/linux-guide/diff-command-in-linux>
![Diff](../Images/c0015da38b2d0b84933570a0983fcd1f.png)
![Diff](img/c0015da38b2d0b84933570a0983fcd1f.png)
**diff** 程序逐行比较两个文件,并生成一个更改列表。作为一种特殊情况,diff 将标准输入的副本与其自身进行比较。“如何在 **Linux** 中使用 diff 命令”是本文的主题。
......
......@@ -8,7 +8,7 @@ MySQL 是一个开源的关系数据库管理系统(RDBMS),用于将数据存
安装之前,我们先用`sudo apt update`命令更新包索引。
![mysql-installation](../Images/a52d9b72db5ec6320b7e199df2b1d4d5.png)
![mysql-installation](img/a52d9b72db5ec6320b7e199df2b1d4d5.png)
## 第二步:安装 MySQL 服务器
......@@ -20,7 +20,7 @@ $ sudo apt install mysql-server
它会将数据库安装到我们的本地系统中。我们可以在控制台屏幕上看到教学信息。
![mysql-installation](../Images/f9a08e7126c1a44c3e056b0f7c7a5789.png)
![mysql-installation](img/f9a08e7126c1a44c3e056b0f7c7a5789.png)
根据您的网络速度,安装 MySQL 服务器软件包需要几分钟时间。
......@@ -28,13 +28,13 @@ $ sudo apt install mysql-server
成功安装后,我们需要运行安全脚本,尤其是如果我们是第一次安装它。
![mysql-installation](../Images/5638b2236b07fd7fb3685abd119efa40.png)
![mysql-installation](img/5638b2236b07fd7fb3685abd119efa40.png)
这将带我们通过一系列提示。
选择 Y 或 Y 进行密码设置,如上图所示。
![mysql-installation](../Images/5107ab3eb44683bbe4e7a9aa79bed2eb.png)
![mysql-installation](img/5107ab3eb44683bbe4e7a9aa79bed2eb.png)
如上图所示的密码插件,对于认证你想选择什么样的密码有三级密码
......@@ -59,7 +59,7 @@ $ sudo mysql
输入有效密码后,它会显示以下消息。
![mysql-installation](../Images/d145dae23d22f9ce66b0b0c5acc486a2.png)
![mysql-installation](img/d145dae23d22f9ce66b0b0c5acc486a2.png)
要清洗终端控制台,可以使用`ctrl + L`快捷键。
......@@ -67,13 +67,13 @@ $ sudo mysql
要检查 MySQL 服务器的安装版本,请运行`mysql --version`命令。
![mysql-installation](../Images/7284218ed4ff22289ed39e1e9b08e768.png)
![mysql-installation](img/7284218ed4ff22289ed39e1e9b08e768.png)
## 第 6 步:测试 MySQL 状态
要检查服务器的当前状态,我们可以使用`systemctl status mysql.service`命令,该命令将显示信息以及进程 id。
![mysql-installation](../Images/3da2c06ec85296a22334aa62f62dd3f8.png)
![mysql-installation](img/3da2c06ec85296a22334aa62f62dd3f8.png)
## 在 MySQL 中创建新用户
......@@ -85,7 +85,7 @@ CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password
成功创建用户后,它会返回一条消息“查询正常”。
![mysql-installation](../Images/9320610a857f157e32e51d27233e6283.png)
![mysql-installation](img/9320610a857f157e32e51d27233e6283.png)
创建新用户后,我们还可以授予新用户适当的权限,如 CREATE、ALTER、DROP、INSERT、DELETE、SELECT 等。
......@@ -103,7 +103,7 @@ GRANT PRIVILEGE ON database.table TO 'username'@'host';
$ mysql -u username -p
```
![mysql-installation](../Images/d927f27f4137ee49ca08fc6cf641f411.png)
![mysql-installation](img/d927f27f4137ee49ca08fc6cf641f411.png)
这里 **-u** 为用户标志, **-p** 为密码认证标志。
......@@ -131,7 +131,7 @@ $ service msql restart
$ sudo apt-get remove mysql-server
```
![remove mysql from ubuntu](../Images/9c7f2630a78a003cfeb156ef13c94246.png)
![remove mysql from ubuntu](img/9c7f2630a78a003cfeb156ef13c94246.png)
* * *
......
......@@ -2,7 +2,7 @@
> 原文:<https://www.studytonight.com/linux-guide/bash-shebang>
![bash shebang](../Images/b7d7713ce7d7a19eaebb890ef35e1444.png)
![bash shebang](img/b7d7713ce7d7a19eaebb890ef35e1444.png)
如果你是通过阅读别人的代码来学习 **Bash** 脚本,你可能已经观察到脚本的第一行是以#开头的!字符和 Bash 解释器的路径。
......
......@@ -31,7 +31,7 @@ curl [OPTIONS] [URL...]
curl google.com
```
![curl google.com](../Images/46cd5041f17494921cbfb6081de136c3.png)
![curl google.com](img/46cd5041f17494921cbfb6081de136c3.png)
输出将被打印到控制台。另外,如果没有指定协议,cURL 会尝试猜测,否则默认为 HTTP。
......@@ -45,7 +45,7 @@ cURL 输出可以通过两种方式保存。一个使用预定义的名称,或
curl -o index.html gooogle.com
```
![curl -o index.html google.com](../Images/19f8be248f89d03845c8637e09c5bfc1.png)
![curl -o index.html google.com](img/19f8be248f89d03845c8637e09c5bfc1.png)
## 下载多个文件
......@@ -55,7 +55,7 @@ curl -o index.html gooogle.com
curl -o google.html google.com -o duckduckgo.html duckduckgo.com
```
![multiple file curl](../Images/e85d937ef5cff257ae5b5be0dc3aef2f.png)
![multiple file curl](img/e85d937ef5cff257ae5b5be0dc3aef2f.png)
## 恢复下载
......@@ -72,7 +72,7 @@ curl -C - -O https://releases.ubuntu.com/21.04/ubuntu-21.04-desktop-amd64.iso #
有时一个页面已经移动了,如果你试图卷曲它,你会得到一个错误的页面,一个指向新网址的链接,或者一个带有后端服务器引擎名称的空白页面。您可以指示 cURL 按照这些重定向到新的位置,无论它们在哪里。例如,如果你卷曲`duckduckgo.com`你会得到下面的页面。
![curl duckduckgo.com](../Images/69f2037908246efb1342eb089721ed57.png)
![curl duckduckgo.com](img/69f2037908246efb1342eb089721ed57.png)
但是如果你使用重定向标志,即`-L`,它会引导到正确的站点,如下所示。
......@@ -80,7 +80,7 @@ curl -C - -O https://releases.ubuntu.com/21.04/ubuntu-21.04-desktop-amd64.iso #
curl -L duckduckgo.com
```
![curl -L duckduckgo.com](../Images/537aff9257cc99aef9e644aca970de94.png)
![curl -L duckduckgo.com](img/537aff9257cc99aef9e644aca970de94.png)
## 指定最大传输速率
......@@ -92,7 +92,7 @@ curl -L -o google.html google.com --limit-rate 1k
为了看出区别,我们执行了相同的命令,一次有`--limit-rate`,一次没有。
![curl limit-rate and without](../Images/4da737d6decd9c64a60446993f408221.png)
![curl limit-rate and without](img/4da737d6decd9c64a60446993f408221.png)
## 使用代理
......
......@@ -30,7 +30,7 @@ pip3 --version
输出可能会有所不同,但看起来如下所示
![pip3 version](../Images/2df58e61563080e4cb70fef7850bdaad.png)
![pip3 version](img/2df58e61563080e4cb70fef7850bdaad.png)
## 使用`pip`
......@@ -42,7 +42,7 @@ pip3 --version
pip3 --help
```
![pip3 help](../Images/1da5c68f2ad5151cb89a69128dfa4a74.png)
![pip3 help](img/1da5c68f2ad5151cb89a69128dfa4a74.png)
关于命令的更多信息,我们可以运行`**pip3 <command> --help**``**pip3 <command> -h**`
......@@ -60,7 +60,7 @@ pip3 install -h
pip3 install colorama # To install a specific version, say 0.4.0 write colorama==0.4.0
```
![pip3 install](../Images/d4b8842bb2bd0f99428c60cac0573b05.png)
![pip3 install](img/d4b8842bb2bd0f99428c60cac0573b05.png)
### 使用需求文件安装
......@@ -78,7 +78,7 @@ pip3 install -r requirement.txt
pip3 list
```
![pip3 list packages](../Images/8364d61e9ff603d18815c70977090490.png)
![pip3 list packages](img/8364d61e9ff603d18815c70977090490.png)
### 升级包
......@@ -88,7 +88,7 @@ pip3 list
pip3 install -U colorama
```
![pip3 upgrade](../Images/509d4ee5ac3561542019a10e3adfb2c1.png)
![pip3 upgrade](img/509d4ee5ac3561542019a10e3adfb2c1.png)
### 卸载包
......@@ -98,7 +98,7 @@ pip3 install -U colorama
pip3 uninstall colorama
```
![pip3 uninstall](../Images/6112435b53e9af147b2475c39cd7dcd1.png)
![pip3 uninstall](img/6112435b53e9af147b2475c39cd7dcd1.png)
## 结论
......
......@@ -28,7 +28,7 @@ sudo gpasswd -a dakksh docker # Add user to group docker
成功时,没有输出,但如果用户或组不存在,则会显示一条错误消息。
![Adding user to group using gpasswd](../Images/2b589bd2e4e226e06c9fe5ee19166dd0.png)
![Adding user to group using gpasswd](img/2b589bd2e4e226e06c9fe5ee19166dd0.png)
## 将用户添加到多个组
......@@ -38,7 +38,7 @@ sudo gpasswd -a dakksh docker # Add user to group docker
sudo usermod -a -G docker,sambashare dakksh
```
![Adding user to multiple groups using usermod](../Images/13ba0cdca4f7f67f9e7d1dcf9667f484.png)
![Adding user to multiple groups using usermod](img/13ba0cdca4f7f67f9e7d1dcf9667f484.png)
## 从组中删除用户
......@@ -48,7 +48,7 @@ sudo usermod -a -G docker,sambashare dakksh
sudo gpasswd -d dakksh docker
```
![Removing user from a group](../Images/84c06f04c38c94bbdd1545bbc269839b.png)
![Removing user from a group](img/84c06f04c38c94bbdd1545bbc269839b.png)
## 创建新组
......@@ -74,7 +74,7 @@ sudo groupdel groupName
sudo usermod -g sudo dakksh
```
![Changing primary group of a user](../Images/ef24d9517fdba2a102c252f16e2dbd23.png)
![Changing primary group of a user](img/ef24d9517fdba2a102c252f16e2dbd23.png)
## 同时创建用户和分配组
......@@ -94,15 +94,15 @@ id [OPTIONS] [USER]
单独运行`**id**`命令会给出`uid``gid``groups`
![id command](../Images/ed63e22f79ae5171bfe0d30748e05e6f.png)
![id command](img/ed63e22f79ae5171bfe0d30748e05e6f.png)
使用选项参数,通过`-u``-g``-G`中的任意一个,组合或分开分别给出数值形式的`uid``gid``groups`
![id -g command](../Images/c7157d77718f90f4e475231f132828b6.png)
![id -g command](img/c7157d77718f90f4e475231f132828b6.png)
通过`-n`标志,我们得到了`**id**`返回的数字标识的名称。为了获得特定用户的组,我们指定用户名。
![id -nG command](../Images/93f89c17072030d3b8596ed82bbf12a5.png)
![id -nG command](img/93f89c17072030d3b8596ed82bbf12a5.png)
要使用`**groups**`命令获取组,格式如下。
......@@ -110,7 +110,7 @@ id [OPTIONS] [USER]
groups [USER]
```
![groups user command](../Images/da2c7c1ef9718123ecb6d6c2b5b51567.png)
![groups user command](img/da2c7c1ef9718123ecb6d6c2b5b51567.png)
默认情况下,如果没有提到用户,`**id**``**groups**`都使用当前用户。
......
......@@ -38,7 +38,7 @@ find Documents/ -maxdepth 3 -name '*.html'
为了使搜索不区分大小写,例如,搜索以`**HTML**`结尾的文件,而不是`**html**`,我们可以使用 **`-iname`** 标志来代替`**-name**`,其中 I 表示不区分大小写。
![Example of find command](../Images/644f8a2b5981cbd0575c66d7b37fd0be.png)
![Example of find command](img/644f8a2b5981cbd0575c66d7b37fd0be.png)
现在来介绍一些最重要的 **`find`** 命令的旗帜,上面没有解释
......@@ -48,7 +48,7 @@ find Documents/ -maxdepth 3 -name '*.html'
find Documents/ -maxdepth 3 -not -name '*.html'
```
对于上面的例子,所有与指定模式不匹配的文件都会被返回,因此我们可以得到一个 JPG 文件。![not flag](../Images/059410616110d58d07d4d0a9de9408e8.png)
对于上面的例子,所有与指定模式不匹配的文件都会被返回,因此我们可以得到一个 JPG 文件。![not flag](img/059410616110d58d07d4d0a9de9408e8.png)
2. `**-type**` :
这指定了我们正在搜索的对象的种类。它的形式是`-type *c*`,其中`*c*`可以是多个值之一,但是普通用户使用的是`***f***``***l***``***d***`
......@@ -60,7 +60,7 @@ find Documents/ -maxdepth 3 -name '*.html'
find Documents/ -maxdepth 3 -type l -name '*git*' # Symbolic links having the word git in name
```
![type flag](../Images/7d767364f6753b8e4e76963867a660f3.png)
![type flag](img/7d767364f6753b8e4e76963867a660f3.png)
3. `**-size**` :
根据文件大小查找文件。旗帜的形式为**`-size [+-]n[cwbkMG]`**([]中的字符是可选的,表示要使用这些字符中的一个)。这些字符的含义如下
......@@ -83,7 +83,7 @@ find Documents/ -maxdepth 3 -name '*.html'
find -type f -size +40M -size 60M # Returns all files with 40 < fileSize <= 60 M
```
![size flag](../Images/c4e501fc13c93f0f73e1d167f3acf39d.png)
![size flag](img/c4e501fc13c93f0f73e1d167f3acf39d.png)
4. **`-mtime``-daystart`**:
`-mtime``**-mtime [+-]n**`的形式,其中 n 代表`*n * 24*`小时。`±``-size`的意思相同。`**-daystart**`用于使时间测量从当天开始开始,而不是从 24 小时前开始。
......@@ -96,7 +96,7 @@ find Documents/ -maxdepth 3 -name '*.html'
5. `**-perm**` :
通过权限查找文件,我们使用`-perm`。如果按原样使用`-perm`,它将匹配确切的权限,例如 **`-perm 664`** ,将为用户和组匹配所有具有读写权限的文件,但只为其他人匹配读取权限。如果权限号前面有一个 **`/`** ,则它确保至少一个权限(用户、组或其他)匹配。如果许可号前面加了一个`**-**`,则保证至少设置了那些位,如果设置了更多位也没关系。因此,如果我们搜索一个标志为`**-perm -117**`的文件,如果该文件的权限为 *777* ,它将返回该文件作为真正的匹配。
![perm flag](../Images/059c1fa494e12f7757377ef27910a447.png)
![perm flag](img/059c1fa494e12f7757377ef27910a447.png)
6. **`-user``-group`**:
......@@ -109,7 +109,7 @@ find Documents/ -maxdepth 3 -name '*.html'
find -executable -user 1000 -group docker
```
![user and group flag](../Images/84917dcc886d5525346439fd9242c3f7.png)
![user and group flag](img/84917dcc886d5525346439fd9242c3f7.png)
7. **`-delete`** :
对于给定的表达式,该选项删除所有返回真的文件。
......@@ -117,7 +117,7 @@ find Documents/ -maxdepth 3 -name '*.html'
8. **`-execdir``-executable`**:
`-execdir`用于对文件和/或目录执行与用户指定的选项和模式相匹配的命令来运行命令。字符串`{}`扩展为当前文件名,每个文件运行一次指定的命令。以下所有文本都被视为命令,直到没有遇到`;`为止。为了避免被 shell 扩展,这些字符串应该被引用,或者用`\`字符转义。`-executable`另一方面,用于匹配可执行文件。
![executable flag](../Images/84917dcc886d5525346439fd9242c3f7.png)
![executable flag](img/84917dcc886d5525346439fd9242c3f7.png)
## 结论
......
......@@ -90,7 +90,7 @@ $ unzip -l filename.zip
输出:
![zip file](../Images/bbea391a3144dc4d5f6edb1deaa1276c.png)
![zip file](img/bbea391a3144dc4d5f6edb1deaa1276c.png)
## 覆盖现有文件
......
......@@ -32,11 +32,11 @@ $ sudo apt install ./google-chrome-stable_current_amd64.deb
从谷歌 chrome 开始,只需点击 windows 键,或者搜索并输入 chrome,就会出现一个图标。所以,只要点击这个图标,谷歌浏览器就会打开。
![chrome](../Images/a240d4e969851b659638989f1fa682d1.png)
![chrome](img/a240d4e969851b659638989f1fa682d1.png)
按下回车键或点击后,将打开一个新窗口,您可以开始浏览。
![chrome](../Images/39aea03c683e690d57d7066c8bfe4540.png)
![chrome](img/39aea03c683e690d57d7066c8bfe4540.png)
一切就绪,我们已经成功地在本地计算机上安装了 chrome。让我们来探索 chrome 的一些其他操作。
......
......@@ -12,39 +12,39 @@ Ubuntu 是一个流行的开源操作系统。它被 Linux 爱好者广泛使用
检查版本是最简单的方法之一,只需到桌面的右上角点击,然后选择设置即可。
![ubuntu version](../Images/9c7d20a125ae89d640add07724d33ca2.png)
![ubuntu version](img/9c7d20a125ae89d640add07724d33ca2.png)
选择设置后,将显示以下屏幕,点击左侧菜单中的关于部分,它将显示我们当前系统的所有细节。
![ubuntu version](../Images/6f5e5f343f6a0e345b9e768619a98746.png)
![ubuntu version](img/6f5e5f343f6a0e345b9e768619a98746.png)
## 使用 hostnamectl 命令检查 Ubuntu 版本
`hostnamectl`命令可以用来检查当前的 Ubuntu 版本,因为它返回了与主机名设置相关的所有细节。
![hostname](../Images/d06621812e0de7dcaa1f05731c1584a4.png)
![hostname](img/d06621812e0de7dcaa1f05731c1584a4.png)
## 使用 lsb_release 命令检查 Ubuntu 版本
`lsb_release`命令可以用来获取 Ubuntu 版本。它返回操作系统的分发信息。这里, **-a** 用于打印所有信息。
![lsb release](../Images/5f796b3197399eb9ae114f4c1d50c1f4.png)
![lsb release](img/5f796b3197399eb9ae114f4c1d50c1f4.png)
如果我们只想获得单行信息,那么使用这个命令使用 **-d** 选项。
![lsb release -d](../Images/47f3aa6426ee135319fc985c2775fb9c.png)
![lsb release -d](img/47f3aa6426ee135319fc985c2775fb9c.png)
## 使用 cat/etc/发布命令检查 Ubuntu 版本
`cat`命令用于显示文件的内容。在这里,我们使用它来显示包含系统标识文本的 **/etc/issue** 文件的内容。
![cat](../Images/6a3177ec280df6fde8ba9e332c603093.png)
![cat](img/6a3177ec280df6fde8ba9e332c603093.png)
## 使用 cat /etc/os-release 命令检查 Ubuntu 版本
如果您使用的是最新版本的 ubuntu 16 或更高版本,这个命令对您很有用。 **os-release** 文件包含与操作系统及其版本相关的信息。
![ubuntu version](../Images/d1643761b81167723f26368cb3740ca2.png)
![ubuntu version](img/d1643761b81167723f26368cb3740ca2.png)
## 结论
......
......@@ -32,7 +32,7 @@ $ vim fileName
要写入文件,按下将 vim 编辑器转换为写入模式的`i`,在这里可以写入文件。大家可以看到下面截图我们插入一行,左下方可以看到编辑器模式,现在是**插入**
![](../Images/6a0c7e6755491405ec538282d20fdac5.png)
![](img/6a0c7e6755491405ec538282d20fdac5.png)
## 3.保存到 Vim 编辑器中
......@@ -48,9 +48,9 @@ $ vim fileName
先按`Esc`,再按`:`(冒号)和`w`,最后按`Enter`。它会将您的文件数据保存到 vi 编辑器中。请参见屏幕截图以获取帮助。
![save vim](../Images/ef1b8f334e5096c20065314e495eabe2.png)
![save vim](img/ef1b8f334e5096c20065314e495eabe2.png)
![](../Images/0aed79671e0eeef8d75b595afee0eff4.png)
![](img/0aed79671e0eeef8d75b595afee0eff4.png)
## 4.保存并退出 Vim 编辑器
......@@ -68,7 +68,7 @@ $ vim fileName
先按`Esc`,再按`:`(冒号)、`w``q`,最后按`Enter`。它将保存您的文件并退出 vim 编辑器。请参见下面的截图以获取帮助。
![save](../Images/e07376dc1e3c1db58bdcd2acc5487f91.png) ![](../Images/bd2c875b3e2822da7767ec10764736fb.png)
![save](img/e07376dc1e3c1db58bdcd2acc5487f91.png) ![](img/bd2c875b3e2822da7767ec10764736fb.png)
## 5.退出而不保存 Vim 编辑器
......@@ -86,7 +86,7 @@ $ vim fileName
首先按`Esc`,然后按`:`(冒号)、`q``!`,最后按回车键。它将退出 vim 编辑器而不保存您的文件。请参见下面的截图以获取帮助。
![](../Images/f91c8a9b7fc36d25cf327be3ae1b7f8e.png)
![](img/f91c8a9b7fc36d25cf327be3ae1b7f8e.png)
除了保存和退出 vim 编辑器,您还可以使用这个强大的编辑器做更多的事情。你可以[阅读我们已有的文章](https://www.studytonight.com/post/learn-basic-vim-commands)
......
......@@ -41,7 +41,7 @@ ls -l Documents/.termrc
如果第一列是`l`,说明是链接。
![ln -s output, symlinking a file](../Images/5fdf79a81a05f5f8388c84fe19907102.png)
![ln -s output, symlinking a file](img/5fdf79a81a05f5f8388c84fe19907102.png)
### 符号链接文件夹
......@@ -51,7 +51,7 @@ ls -l Documents/.termrc
ln -s ~/.local/bin/ ~/Documents/projects/lbin
```
![symlinking a folder](../Images/c86f53aacce17484e4325b735a6bea2f.png)
![symlinking a folder](img/c86f53aacce17484e4325b735a6bea2f.png)
## 删除符号链接
......@@ -67,7 +67,7 @@ unlink <path to link>
如果过程成功,这将删除链接。需要记住的一点是,即使符号链接是针对某个文件夹的,我们也不会添加尾随的“`/`”,因为 Linux 假设它是一个目录,并且 unlink 不能删除目录。
![unlink a symlink](../Images/7be9638df8d15c8f6a9d58f368c5dd72.png)
![unlink a symlink](img/7be9638df8d15c8f6a9d58f368c5dd72.png)
### 删除符号链接
......@@ -79,7 +79,7 @@ unlink <path to link>
rm Documents/projects/lbin
```
![removing a symlink via commandline, rm command](../Images/3d2761c7cc02e0401ee4e41621b67386.png)
![removing a symlink via commandline, rm command](img/3d2761c7cc02e0401ee4e41621b67386.png)
使用`**rm**`优于`**unlink**`的好处是可以使用`**rm**`同时删除多个链接。
......@@ -105,7 +105,7 @@ ll acbd
我们可以看到,文件`acbd`,现在是一个断开的链接。要搜索和删除它,我们使用`**find**`命令和`-delete`标志。
![Find and deleting broken symlinks](../Images/a946d1d9b3d5a1a7f510c22c2ad31673.png)
![Find and deleting broken symlinks](img/a946d1d9b3d5a1a7f510c22c2ad31673.png)
## 结论
......
......@@ -41,31 +41,31 @@
在目录 **hope 中,**有一个文件 **.dubey.txt** 有 dot(。)的名义。该文件是一个隐藏文件,如果不使用 **-a****-所有 **vdir** 命令中的**选项,该文件将无法显示,但当我们使用这些选项时,该文件将会显示。
![vdir command](../Images/eb3299f6f9fbcd67e5d1cfc7d69fcf7b.png)
![vdir command](img/eb3299f6f9fbcd67e5d1cfc7d69fcf7b.png)
## 示例:用-l 显示文件的作者
在本例中,通过使用`**vdir -l --author**`命令,我们显示了包含所有者详细信息、组详细信息等的文件。请参见下面的输出。
![vdir command](../Images/d4d4ff58cf99e39c9e261c6cffc7ebf0.png)
![vdir command](img/d4d4ff58cf99e39c9e261c6cffc7ebf0.png)
## 示例:显示不包括备份文件的文件(以~)结尾
我们知道备份文件以一个 **~** 符号结束,像 **bfile.txt~** 是当前文件夹中的一个备份文件,默认可见。如果我们想排除这些文件,那么在 vdir 命令中使用 **-B****-忽略-备份**选项。请参见下面的输出。
![vdir command](../Images/531eae3df58ea74c26c5e7fc9f5b5616.png)
![vdir command](img/531eae3df58ea74c26c5e7fc9f5b5616.png)
## 示例:显示帮助并退出
在上面的选项表中,只有几个重要的选项给出了描述,但是通过使用`vdir --help`命令,您可以使用描述来探索更多的选项。
![](../Images/6638b39cad5db1f739e50f7f8f06e907.png)
![](img/6638b39cad5db1f739e50f7f8f06e907.png)
## 示例:显示 vdir 命令的版本信息
要显示 vdir 命令的版本信息,请使用`vdir`命令和`--version`选项。
![vdir command](../Images/a9c0e11a6067b2bf34db7ee0ddf21ead.png)
![vdir command](img/a9c0e11a6067b2bf34db7ee0ddf21ead.png)
## 结论
......
......@@ -2,7 +2,7 @@
> 原文:<https://www.studytonight.com/linux-guide/install-visual-studio-code-on-debian-10>
![Install Visual Studio Code on Debian 10](../Images/b552e3d917e88e896696d65f01f41bea.png)
![Install Visual Studio Code on Debian 10](img/b552e3d917e88e896696d65f01f41bea.png)
今天,我们介绍**如何在 Debian 10** 巴斯特上安装 Visual Studio 代码或更新现有 VS 代码;Visual Studio Code 是由**微软**创建的开源跨平台代码编辑器。Visual Studio 提供内置调试帮助、Git 集成控件、语法突出显示、代码完成、集成终端、代码重构和代码片段。
......
......@@ -2,7 +2,7 @@
> 原文:<https://www.studytonight.com/linux-guide/how-to-install-kodi-on-ubuntu>
![How to Install Kodi on Ubuntu 18.04](../Images/deea3266962626268c53e2fb8ef4dad1.png)
![How to Install Kodi on Ubuntu 18.04](img/deea3266962626268c53e2fb8ef4dad1.png)
Kodi(以前叫 XBMC)是你的家庭影院。这是一个免费的**开源** (GPL)软件媒体播放器和**娱乐**中心,大多数操作系统都可以访问,包括 Linux、OSx、视窗、iOS 和安卓。
......
......@@ -48,7 +48,7 @@ cp [ option] source destination
这里,我们使用`cp`命令将一个文件复制到一个文件夹中,然后通过使用`cd`命令进入来验证它。cd 命令用于改变 Linux 中的目录。查看命令。
![simple use of cp command](../Images/b928378faac86a4051629cc299e778ed.png)
![simple use of cp command](img/b928378faac86a4051629cc299e778ed.png)
### 文件在 Linux 中的复制和备份
......@@ -66,7 +66,7 @@ cp -b hello.txt myfolder
**-f (force) -** 此选项用于强制复制文件或目录。如果任何文件或目录受到写权限的保护,那么通过使用 cp 命令的 **-f** 选项,我们可以成功地从源复制到目标。
![-f (force) option copy file forcefully](../Images/ce679c406534025fa06b9e711947d350.png)
![-f (force) option copy file forcefully](img/ce679c406534025fa06b9e711947d350.png)
### 在 Linux 中复制多个文件
......@@ -74,7 +74,7 @@ Linux 允许将多个文件或目录复制到任何目的地。
在此命令中,当前目录中以. txt 扩展名结尾的所有文件都被复制到另一个目录中。
![use of cp command with same type of files](../Images/ff3b601befb1344587d2a4c7f7244a17.png)
![use of cp command with same type of files](img/ff3b601befb1344587d2a4c7f7244a17.png)
### 结论
......
......@@ -41,19 +41,19 @@ mv [OPTION]... SOURCE... DIRECTORY
在本例中, **snow.sh** 文件在**阴影**目录中可用,并通过使用 **mv** 命令 **snow.sh** 文件移动到目标目录。
![mv command](../Images/15e806d2ddd4dd873b2dbcb6a5781bab.png)
![mv command](img/15e806d2ddd4dd873b2dbcb6a5781bab.png)
## 使用 mv 命令重命名文件
这里使用 mv 命令后的文件 **hello.cnf** 被重命名为 **dubey.cnf** 文件,该文件已经不存在了。如果目标文件已经存在,那么它将被覆盖,并且源文件将被自动删除,不会有任何提示。
![mv command](../Images/05aa17788ccc63f2608dbb6bb0f1aff1.png)
![mv command](img/05aa17788ccc63f2608dbb6bb0f1aff1.png)
## 备份现有文件
在本例中,使用 mv 命令的 **-b** (备份)选项,更容易对 mv 命令将覆盖的现有文件进行备份。我们可以看到,执行这个命令后 stn.sh~文件是用波浪号字符(~)创建的。
![mv command](../Images/2205b77e15bee36b7f74a4dcb22b5303.png)
![mv command](img/2205b77e15bee36b7f74a4dcb22b5303.png)
## 结论
......
......@@ -56,19 +56,19 @@ rm [OPTION]... FILE...
在这个例子中,通过使用`rm`命令,我们将删除一个在**阴影**目录中可用的文件**。**
![linux rm command](../Images/68de7380f10a7b023019255d4aabb1bd.png)
![linux rm command](img/68de7380f10a7b023019255d4aabb1bd.png)
## 示例:删除空目录
在这个例子中,**我的文件夹**是一个空目录。仅仅使用`rm`命令是不可能删除目录的。所以要删除一个目录,你必须使用`-dir`选项和命令。
![linux rm command](../Images/8bf1ce26724105c9c6fc4c0519e566fa.png)
![linux rm command](img/8bf1ce26724105c9c6fc4c0519e566fa.png)
## 示例:使用带有`-i`(交互式删除)选项的`rm`命令删除文件
在本例中,我们将`-i`选项与`rm`命令一起使用,该命令要求用户在删除每个文件之前进行确认。
![linux rm command](../Images/74678c38f7026972c5e5efaea3e6e563.png)
![linux rm command](img/74678c38f7026972c5e5efaea3e6e563.png)
## 示例:删除以-(连字符)符号开头的文件
......@@ -76,7 +76,7 @@ rm [OPTION]... FILE...
这是`rm`命令不会将文件名误解为**选项**的方式。
![linux rm command](../Images/850183459550b493df5b2135702e1101.png)
![linux rm command](img/850183459550b493df5b2135702e1101.png)
## 结论
......
......@@ -2,7 +2,7 @@
> 原文:<https://www.studytonight.com/linux-guide/how-to-exclude-files-and-directory-using-rsync>
![rsync](../Images/b3ba0972d93bca52d53e970a38f7aa25.png)
![rsync](img/b3ba0972d93bca52d53e970a38f7aa25.png)
Rsync(远程同步)是一个功能强大的**命令行**应用程序,用于同步本地和远程文件和目录。它预装在大多数 Linux 发行版上。它是备份和保持许多站点上的文件和文件夹同步的最强大的应用程序之一。sync 最令人满意的一点是,它通过仅传输已修改的数据,减少了复制到远程站点的数据量。rsync 还有另一个优秀的特性,我们今天要研究;它从**同步**中省略了文件或目录。当您不想复制一个或多个文件或目录时,这在备份过程中非常有用。
......
......@@ -36,7 +36,7 @@ less /etc/passwd
more /etc/passwd
```
![USE /ETC/PASSWD TO LIST USER](../Images/4598b748436aac67e6f09ba3f43420e3.png)
![USE /ETC/PASSWD TO LIST USER](img/4598b748436aac67e6f09ba3f43420e3.png)
当您运行以上任何一个命令时,您将获得系统上所有可用用户的列表,以及其他相关信息,用冒号**(`:`)隔开。每行都有一个用户的信息。**
......@@ -58,7 +58,7 @@ more /etc/passwd
* 登录外壳(默认值为`/bin/bash`)。
![/ETC/PASSWD FILE CONTENT](../Images/4fe813525291c6da471c14664b751410.png)
![/ETC/PASSWD FILE CONTENT](img/4fe813525291c6da471c14664b751410.png)
### 如何使用/etc/passwd 只显示用户名?
......@@ -78,13 +78,13 @@ cat /etc/passwd | awk -F: '{print $1}'
运行以上任何命令,您将看到以下输出:
![LIST USERNAMES LINUX](../Images/d5f1ab0555b52ec67b7bf71ac81d1d16.png)
![LIST USERNAMES LINUX](img/d5f1ab0555b52ec67b7bf71ac81d1d16.png)
## 2.使用`getent`命令列出用户:
在 Linux 机器中,文件 **/etc/nsswitch.conf** 存储配置的数据库列表。您可以使用`cat`命令查看该文件的内容。
![READ NSSWITCH.CONF FILE](../Images/1c9a765036e397320bfc4e5b53ef1f0b.png)
![READ NSSWITCH.CONF FILE](img/1c9a765036e397320bfc4e5b53ef1f0b.png)
正如您在上面的输出中看到的,输出中还列出了 **passwd** 数据库。使用`getent`命令,我们可以访问它并列出所有用户。下面是命令:
......@@ -94,7 +94,7 @@ getent passwd
`getnet`命令的输出类似于 **/etc/passwd** 文件的内容。
![GETENT COMMAND TO LIST USERS](../Images/76db9ba8ac76bd915932358362596233.png)
![GETENT COMMAND TO LIST USERS](img/76db9ba8ac76bd915932358362596233.png)
### 如何使用`getent`命令只显示用户名?
......@@ -122,7 +122,7 @@ getent passwd | awk -F: '{print $1}'
compgen -u
```
![COMPGEN COMMAND TO LIST USERS](../Images/1ee13de873e74d3d1e47bc75069a34ea.png)
![COMPGEN COMMAND TO LIST USERS](img/1ee13de873e74d3d1e47bc75069a34ea.png)
### 如何检查用户名是否存在?
......
......@@ -2,7 +2,7 @@
> 原文:<https://www.studytonight.com/linux-guide/how-to-install-pycharm-on-ubuntu-1804>
![pycharm](../Images/54279cd6cc11086351058434a84f391d.png)
![pycharm](img/54279cd6cc11086351058434a84f391d.png)
PyCharm 是 Python 编程最优秀的 IDE。这个 **Python IDE** 有专业版和社区版。社区版可以免费访问,而专业版包含更多功能。访问此处了解社区版和**专业版**版的区别。
......
......@@ -2,7 +2,7 @@
> 原文:<https://www.studytonight.com/linux-guide/how-to-install-postgresql-on-debian-9>
![postgreSQL](../Images/b6289854239d5e39ec5e1b277b4c8ef5.png)
![postgreSQL](img/b6289854239d5e39ec5e1b277b4c8ef5.png)
**PostgreSQL** 是一个开源的对象关系数据库系统。它是用于生产服务器的顶级数据库服务器之一。这篇文章将允许你在 **Debian 9** 伸展 pc 机上安装 PostgreSQL 数据库服务器。
......
......@@ -2,7 +2,7 @@
> 原文:<https://www.studytonight.com/linux-guide/how-to-setup-a-nginx-reverse-proxy>
![Proxy](../Images/b3c7b26b91fbb95df4463fad38f1c29e.png)
![Proxy](img/b3c7b26b91fbb95df4463fad38f1c29e.png)
**Linux** 操作系统中,反向代理作为主机(客户端)和服务器之间的连接运行。它收集客户端请求并将其传递给其他服务器,最终将服务器的答案提供给客户端,看起来好像它们来自代理服务器本身。在本指南中,我们将教您什么是 Nginx 反向代理,以及如何在您的 VPS 上设置它!
......
......@@ -2,7 +2,7 @@
> 原文:<https://www.studytonight.com/linux-guide/how-to-set-or-change-timezone-on-centos-7>
![timezone](../Images/8116654a90c54401fbf4a435b8efb0a7.png)
![timezone](img/8116654a90c54401fbf4a435b8efb0a7.png)
当启动一个新的服务器时,你几乎总是需要建立**时区**。在某些情况下,您可能希望调整时区。
......
......@@ -34,7 +34,7 @@ Elasticsearch 服务是分布式的,这意味着它部署在一个集群中,
下面我们有一个简单的图表来解释一个简单的弹性搜索服务集群。
![Elasticsearch cluster and nodes](../Images/5d78365f1dfb81beb809f5bf8b975ff9.png)
![Elasticsearch cluster and nodes](img/5d78365f1dfb81beb809f5bf8b975ff9.png)
弹性搜索集群的默认名称是**弹性搜索**。我们可以在运行弹性搜索时指定初始启动的节点数量,也可以在**配置/弹性搜索. yml** 文件中指定物理或虚拟服务器的 IP 地址,您也可以在其中找到所有其他配置。
......
......@@ -44,7 +44,7 @@ Docker 使用 **docker 图像**来运行容器内的进程。稍后我们将详
3. 以及一个命令行界面`docker`,使用它我们可以运行 docker 命令来对 docker 守护进程执行不同的操作。
![Docker Engine client-server architecture components](../Images/5bf6b8608104bca6d6a4b81ac4768c3a.png)
![Docker Engine client-server architecture components](img/5bf6b8608104bca6d6a4b81ac4768c3a.png)
**命令行界面**使用**应用编程接口****码头工人守护程序**进程交互。docker 守护程序负责创建和管理 docker 对象,如容器、映像、网络和卷。我们将在接下来的教程中了解所有这些 docker 对象。
......
......@@ -10,7 +10,7 @@ Docker 容器和虚拟机在体系结构上是完全不同的,但是经常混
在下图中,我们有一个运行在主机上的基本 Docker 设置的体系结构,其上运行着 3 个容器,其中运行着 3 个不同的应用程序。
![Docker container architecture on host machine](../Images/80165c7dfe427bf4f9415392658b5690.png)
![Docker container architecture on host machine](img/80165c7dfe427bf4f9415392658b5690.png)
Docker 引擎利用主机操作系统内核(Linux)与底层硬件进行通信。在 docker 上运行的所有容器共享同一个主机操作系统内核,因此它们不必设置自己的操作系统内核,这使得它们轻量级。
......@@ -26,7 +26,7 @@ Docker 引擎利用主机操作系统内核(Linux)与底层硬件进行通信。
这使得虚拟机沉重且缓慢。
![Virtual machine architecture](../Images/fcd8f6b3fd2e47a1ac32d85a95b251d2.png)
![Virtual machine architecture](img/fcd8f6b3fd2e47a1ac32d85a95b251d2.png)
一个虚拟机与另一个虚拟机完全隔离。就虚拟机而言,您甚至可以在不同的虚拟机上安装不同的操作系统。
......
......@@ -34,11 +34,11 @@ Docker 提供了一个桌面应用程序,非常容易在 Windows 操作系统
进入**开始菜单****搜索 Docker****点击 Docker 桌面**
![Start docker on windows step 1](../Images/aa05a03ad98aaf39451250be88b824f3.png)
![Start docker on windows step 1](img/aa05a03ad98aaf39451250be88b824f3.png)
你会看到一个**移动鲸鱼图标**出现在你的任务栏中,这意味着 docker 桌面应用程序正在启动。等待这个鲸鱼图标停止移动并变得稳定,这意味着 docker 已经开始。
![start docker on windows step 2](../Images/305b2b8656e9751e105110ae9d19716e.png)
![start docker on windows step 2](img/305b2b8656e9751e105110ae9d19716e.png)
一旦 docker 桌面应用程序启动,您可以使用**窗口命令提示符运行 docker 命令**
......
......@@ -18,7 +18,7 @@ Docker 提供了一个桌面应用程序,非常容易在 Mac 操作系统上
点击下载的 docker.dmg 文件到**打开并挂载**。打开后,您将看到以下弹出窗口:
![Install docker desktop for Mac OS](../Images/f958ad27998c0d3085fbe6433f34af85.png)
![Install docker desktop for Mac OS](img/f958ad27998c0d3085fbe6433f34af85.png)
按照弹出窗口中的指示,**将 docker.app 图标拖放到应用程序**文件夹中,开始安装。
......@@ -28,17 +28,17 @@ Docker 提供了一个桌面应用程序,非常容易在 Mac 操作系统上
双击**应用程序文件夹****启动面板**中的 **Docker 图标**
![start docker desktop on mac os](../Images/27ce38bd3488e8a741bd78fadca33ac3.png)
![start docker desktop on mac os](img/27ce38bd3488e8a741bd78fadca33ac3.png)
由于 docker 应用程序需要特权访问,您将被要求输入您的**系统密码**
![start docker desktop app on mac os](../Images/299407ff431f4199aa8ed713f00860cf.png)
![start docker desktop app on mac os](img/299407ff431f4199aa8ed713f00860cf.png)
点击**确定**,并提供您的系统密码继续。
一旦码头工人开始工作,你会看到**鲸鱼图标出现在顶部导航栏**中,你可以点击它查看更多码头工人相关选项。
![start docker on mac OS](../Images/4069dead907f512780f8a72c8ec173fc.png)
![start docker on mac OS](img/4069dead907f512780f8a72c8ec173fc.png)
要验证码头工人是否已成功启动,**在终端运行以下命令**:
......@@ -46,13 +46,13 @@ Docker 提供了一个桌面应用程序,非常容易在 Mac 操作系统上
docker --version
```
![docker --version command output](../Images/2cf82a9fa0ec6f5c2fadfc882ea14b25.png)
![docker --version command output](img/2cf82a9fa0ec6f5c2fadfc882ea14b25.png)
## 卸载坞站(Mac OS)
要从 Mac OS 卸载 docker desktop 应用程序,请单击顶部导航栏中的 **Docker 鲸图标**,从 Docker 菜单选项中,单击**故障排除**,然后单击**卸载**卸载 Docker Desktop 应用程序。
![Uninstalling docker from Mac OS](../Images/b6af9646fb4a63220ff24f43d716f0d1.png)
![Uninstalling docker from Mac OS](img/b6af9646fb4a63220ff24f43d716f0d1.png)
因此,在本教程中,我们学习了在 Mac OS 上安装 docker 桌面应用程序。从下一个教程开始,我们将开始玩 docker,并开始学习 docker 的概念。
......
......@@ -16,13 +16,13 @@
前往[这个链接](http://git-scm.com/)。您会注意到网站会识别您的操作系统,并提示您下载最新版本。
![Installing GIT](../Images/6da7205f5d6f276a8812afef48289c6f.png)
![Installing GIT](img/6da7205f5d6f276a8812afef48289c6f.png)
继续从软件包安装。打开安装程序后,只需点击**下一步**,使用**默认设置**安装 Git,因为它们是推荐设置。如果需要,您可以更改**安装目录**
![Installing GIT](../Images/b246a8431cad65c85aae14f01af070f0.png)
![Installing GIT](img/b246a8431cad65c85aae14f01af070f0.png)
![Installing GIT](../Images/6ae7e5733b557cf325335b6bd51b8290.png)
![Installing GIT](img/6ae7e5733b557cf325335b6bd51b8290.png)
* 安装完成后进入**开始菜单**,寻找 **Git 文件夹/图标**。您可能会看到两个选项,`Git GUI``Git Bash`。有些人更喜欢使用图形用户界面,但我们将在本课程中重点介绍**命令行**。但是随时可以查看 Git GUI。
* Git Bash 是一个类似于 Unix Bash 的命令行界面。它将运行我们在课程中使用的几乎所有命令。继续,通过在命令行中键入 **$git - version** 进行测试。
......@@ -31,7 +31,7 @@
例如:我们将输入 **$ nano filename** 来打开一个文件,但是在 **Windows 机器上输入这个将导致命令未找到错误。相反,你可以输入 **$记事本文件名**,就可以工作了!**
![Installing GIT on windows](../Images/a5738bb040024a970e1aca7285f43aa9.png)
![Installing GIT on windows](img/a5738bb040024a970e1aca7285f43aa9.png)
* * *
......
......@@ -18,13 +18,13 @@ Go into your repository and type ls.
嗯。那里什么都没有。回想一下,当我们谈论 VCS 的特征时,我们讨论了隐藏文件。让我们通过输入 **$ ls -a** 来检查这些隐藏文件,其中列出了**隐藏文件**
![Creating Git Repositories](../Images/1cd1d2efe04cd5c91c4b5019ec840a05.png)
![Creating Git Repositories](img/1cd1d2efe04cd5c91c4b5019ec840a05.png)
**。git 文件夹**是您的**本地存储库**,它存储所有**历史****版本控制信息**
但是,如果您已经在进行您的出色项目,并且没有首先初始化 git 存储库,该怎么办呢?别担心。转到该目录,输入 **$ git init** ,不输入存储库的名称。Git 将假设您需要为这个项目目录创建一个存储库。如果你现在输入 **$ ls** ,你会看到那个奇妙的小 **git 文件夹**正坐在那里等着你开始你的令人敬畏的项目。
![Renaming Git Repositories](../Images/1e973e53718af7602e0afae1c9063165.png)
![Renaming Git Repositories](img/1e973e53718af7602e0afae1c9063165.png)
存储库的名称没有**那么重要。git 目录**里面。重命名您的存储库就像使用`mv`命令一样简单。
......@@ -38,7 +38,7 @@ $ mv my_first_repository awesome_project
$ rm -r awesome_project/.git
```
![Deleting Git Repositories](../Images/d5f0349c8b6d9eb6a3a96b88e81d51dc.png)
![Deleting Git Repositories](img/d5f0349c8b6d9eb6a3a96b88e81d51dc.png)
完成了。是的,就是这么简单。既然您已经对存储库有了足够的了解,那么让我们来了解一下如何将更改提交给它们。
......
......@@ -18,17 +18,17 @@ Git 状态将只显示分配了一些特殊状态的文件。自提交自述文
我们的项目目录有点空,只包含自述文件。继续创建一些文件(空的也可以)。再次运行**状态命令**看看有没有什么激动人心的事情在等着我们!
![Staging Area in GIT](../Images/2c9571fa5b7c1de8b7ba6b93fa2519ab.png)
![Staging Area in GIT](img/2c9571fa5b7c1de8b7ba6b93fa2519ab.png)
确实有!注意我们这次没有得到**‘工作目录清理’**消息,你能猜到为什么吗?
没错。我们向项目中添加了一些尚未添加到存储库中的新文件。继续将文件 1 添加到存储库中(回想一下,我们可以使用 **git add 命令**)。再次运行**状态命令**将会发出新的信息。事情越来越令人兴奋了!
![Staging Area in GIT](../Images/288df96792f15593b78e44570f19303f.png)
![Staging Area in GIT](img/288df96792f15593b78e44570f19303f.png)
现在,您可以提交这个文件,或者将文件 2 和文件 3 添加到存储库中,然后将它们一起提交。在我们继续之前,在编辑器中打开文件,并向其中添加一些内容。当您再次检查状态时,Git 会明确告诉您这些文件已经被修改。这项功能有助于您在处理大型项目时保持冷静。
![Staging Area in GIT](../Images/44ea67ab16bf6ce01f669a3eedf7ca3c.png)
![Staging Area in GIT](img/44ea67ab16bf6ce01f669a3eedf7ca3c.png)
尝试创建更多的文件,并四处寻找自己!在下一章中,我们将研究更多的 Git 基础知识。走吧!
......
......@@ -12,7 +12,7 @@
我们将使用的第一个命令是`git log`,正如您所料,它向您显示了您在存储库中的所有提交的日志。log 命令首先显示最近的提交。向下滚动将显示我们添加的关于自述文件的第一个提交。让我们分解这个日志的输出。
![Checking Repository Logs](../Images/4b681107a13c8ea2a2273c38c761498d.png)
![Checking Repository Logs](img/4b681107a13c8ea2a2273c38c761498d.png)
它以每次提交的唯一标识符开始。回想一下,我们讨论过 Git 使用阿沙-1 散列来保证安全性。这被用作唯一标识符。您可能认为用数字来命名提交更容易。虽然这是真的,但是有些存储库是公共的,并且有大量的人参与其中,所以在提交发生时很难对它们进行编号。
......@@ -30,7 +30,7 @@ Git 使用**‘git check out’**命令来恢复早期版本。为此,它需
哦哦。一个可怕的信息。一种超然的精神状态。好吧,Git 只是告诉你,你已经签出了文件的早期版本!同样,在这里进行改变也可能是危险的。让我们检查我们的第一个承诺。继续输入`ls`。如果您已经遵循了教程的步骤,您可能只会看到自述文件。嗯。太奇怪了。没有文件,文件 2,文件 3 的踪迹。
![Checking out a commit](../Images/f6c8df2b5f74956318ae3f38cdcfbb0c.png)
![Checking out a commit](img/f6c8df2b5f74956318ae3f38cdcfbb0c.png)
在我们被它吓到之前,让我们理解我们正在检查一个旧版本的存储库。当我们第一次启动提交时,我们根本没有文件,文件 2,文件 3!这解释了为什么没有这些文件。
......@@ -48,7 +48,7 @@ $ git checkout master
再次键入`ls`以确保您的所有文件都可用。我们有另一种方法来检查旧版本。`git diff`派上用场了。它显示了两个州之间的差异。只需使用第一次提交和最后一次提交的标识符运行命令。跳过输出中的前几行。勾选`+ sign`表示添加了内容。然后,它继续显示实际的变化。
![Checking difference in commits](../Images/10e4a9f9b97db2c455b3907bb2d0bd84.png)
![Checking difference in commits](img/10e4a9f9b97db2c455b3907bb2d0bd84.png)
有更清晰、更容易使用的图形界面,但这是它的基础。这都是关于 Git 的基础知识。让我们深入一点,好吗?
......
......@@ -18,15 +18,15 @@
$ git checkout signin_feature
```
![Creating a Branch in Git](../Images/3a916de532d893fe10a76bac5c0bf597.png)
![Creating a Branch in Git](img/3a916de532d893fe10a76bac5c0bf597.png)
继续创建一个新文件,这里是文件 4,并提交它。成功提交后,请检查日志。当然,您可以看到新提交的条目就在那里。
![Branching Out](../Images/3163a5a652f49aa891b33eab14981df0.png)
![Branching Out](img/3163a5a652f49aa891b33eab14981df0.png)
让我们切换回 master 并再次查看日志。哦哦。缺少提交。我们擦掉了吗?别担心承诺还在。Git 足够聪明,知道这个提交是在`signin_feature`分支中,主分支与它无关。
![Branching out](../Images/82541d805f2f05dd639ada2ad8d08a1d.png)
![Branching out](img/82541d805f2f05dd639ada2ad8d08a1d.png)
请记住,无论何时分支,新分支都是当前分支的副本。到目前为止,我们从主服务器分支出来,因此所有的主服务器提交在日志中都是可用的。
......@@ -36,7 +36,7 @@ $ git checkout signin_feature
$ git checkout -b subs_feature
```
![Switching to a different branch in Git](../Images/b2853fa75c8cec80e17bf0f05cb81c4a.png)
![Switching to a different branch in Git](img/b2853fa75c8cec80e17bf0f05cb81c4a.png)
**-b 选项**允许您创建一个分支,并在一个命令中切换到所有分支。
......@@ -58,7 +58,7 @@ $git branch -D subs_feature
哎呀!我们无法删除当前正在工作的分支。切换回主机,然后重试。
![deleting a branch in Git](../Images/7e7e11bdddbeb46c084db292295a623d.png)
![deleting a branch in Git](img/7e7e11bdddbeb46c084db292295a623d.png)
唷!这是一个漫长的过程。干得好。你应该得到一块饼干!接下来,我们研究合并。这是什么意思?继续读...
......
......@@ -20,19 +20,19 @@ Git 在解决合并冲突方面相当聪明,并且大多数情况下会尝试
$ git merge signin_feature
```
![Merging Branches in GIT](../Images/731653910b2573671528cdc9f20e028b.png)
![Merging Branches in GIT](img/731653910b2573671528cdc9f20e028b.png)
运行 **$ git 日志**命令并检查更改。果然,我们的提交历史现在已经合并了。这很容易,因为没有冲突需要解决。
![Merging Branches in GIT](../Images/c5688d75e59685673ef1cb7f92943c45.png)
![Merging Branches in GIT](img/c5688d75e59685673ef1cb7f92943c45.png)
让我们开始设置一个让 Git 解决的冲突。打开自述文件,更改第一行。将此变更提交给主节点并检查`signin_feature`分支。
![Merging Branches in GIT](../Images/f55df53f465b26910da04a1745ab4855.png)
![Merging Branches in GIT](img/f55df53f465b26910da04a1745ab4855.png)
再次更改自述文件的内容。这次在一条**不同的线上**。提交它并签出主分支。像以前一样运行**合并**命令。
![Merging Branches in GIT](../Images/ee5871dd0cb1f58583654acedc5b8d52.png)
![Merging Branches in GIT](img/ee5871dd0cb1f58583654acedc5b8d52.png)
这次输出不一样。Git 告诉我们它正在自动更新 README。它已成功检测到两个分支中的文件都已更改。但是因为它们在不同的线上,Git 能够合并它们。运行 **$ git 日志**这次也给了我们一个新的提交消息!
......@@ -40,9 +40,9 @@ $ git merge signin_feature
Merge branch 'signin_feature'
```
![Merging Branches in GIT](../Images/d3b4d1b524924a9c1a219f2208bad357.png)
![Merging Branches in GIT](img/d3b4d1b524924a9c1a219f2208bad357.png)
![Merging Branches in GIT](../Images/1c7d7726eccce5ea9aa849cfc31c6442.png)
![Merging Branches in GIT](img/1c7d7726eccce5ea9aa849cfc31c6442.png)
分支`signin_feature`仍然可用。该分支的日志显示没有任何更改。它只影响了主分支。所以这在 Git 看来既简单又聪明。但是 Git 不能决定做什么的时候呢?地狱破会输吗?让我们在下一章找到答案...
......
......@@ -8,25 +8,25 @@
让我们继续为 Git 设置一个硬冲突。看看你在哪个部门,以确保万无一失。假设你在`signin_feature`分支。打开您的任何一个文件并进行一些更改。请记住提交此更改。
![Merge Conflicts in GIT](../Images/be83cb40a05f36beba5c1b1aecfb2ff8.png)
![Merge Conflicts in GIT](img/be83cb40a05f36beba5c1b1aecfb2ff8.png)
然后,签出主分支,并对同一个文件进行更改,但方式不同。
![Merge Conflicts in GIT](../Images/f9c8141052242537b2e3c3258240542a.png)
![Merge Conflicts in GIT](img/f9c8141052242537b2e3c3258240542a.png)
现在您已经在 master 上了,提交这个更改并尝试合并两个分支。就像上一章一样,我们看到 Git 检测到了一个合并冲突,并尝试自动启动它,但是失败了。呃-哦。
![Merge Conflicts in GIT](../Images/9d6ec2422106d1e1060157575eb408a7.png)
![Merge Conflicts in GIT](img/9d6ec2422106d1e1060157575eb408a7.png)
Git 检测到对同一行的更改,并且不理解您希望在最终项目中保留哪个文件。每当 Git 遇到这样的冲突时,它就把它留给用户(你!)手动解决冲突。打开冲突的文件,嗯?文件里面好像有一些奇怪的标点符号。这些不是我们写的,那是谁写的?
没错,Git 标记了冲突发生的区域。相当聪明而且乐于助人,是吧?它们被称为冲突标记。带角度的括号表示整个区域有冲突。等号行是两个版本之间的分隔符。顶部版本标记为`head`,这是最近一次提交的特殊术语。最下面的版本标着`signin_feature`,没有奖品猜猜是什么意思。
![Merge Conflicts in GIT](../Images/7ea80106db9a4dabfe7b42e864ab4542.png)
![Merge Conflicts in GIT](img/7ea80106db9a4dabfe7b42e864ab4542.png)
Git 给了我们全部的权力来编辑和保留我们在最终项目中想要的任何版本。既然我们已经解决了冲突,我们需要告诉 Git 已经完成了。解决所有其他冲突(如果有)。让我们将更改添加到临时区域,并运行 **$ git commit**
![Merge Conflicts in GIT](../Images/fc909c906c4c82d63ed2858dfcebbd22.png)
![Merge Conflicts in GIT](img/fc909c906c4c82d63ed2858dfcebbd22.png)
请注意,Git 知道我们正在解决一个冲突,并且已经为我们准备了一个提交消息。在那里,冲突得到了解决,两个分支机构成功合并。请记住,在这种情况下,Git 放弃了对合并解析的所有控制,它完全依赖于您来解决它。
......
......@@ -8,7 +8,7 @@
如果您在不同的计算机上工作,这可能是一个网络地址。如果存储库托管在某个服务器上,这将是一个网址。现在,我们可以为它提供一条通往我们的 awesome_project 存储库的路径。让我们命名我们的克隆体`our_clone_project`
![Cloning in GIT](../Images/76327de97fe9b8c45c7a56acdec1da22.png)
![Cloning in GIT](img/76327de97fe9b8c45c7a56acdec1da22.png)
看看这个仓库,你会发现一切都如你所料。Git 已经自动为我们建立了一个出色的存储库作为远程存储库。运行 **$ git remote** ,您将看到它打印出`origin`,这是我们最初的存储库。让我们切换回原来的存储库,再次运行 **$ git remote**
......@@ -16,7 +16,7 @@
但是这里的问题是,我们希望我们的两个存储库相互通信,而我们的`awesome_project`不知道我们的 _clone_project 存在。让我们通过使用 **$ git 远程**添加命令来解决这个问题。您需要为此添加提供一个名称,在这里使用`origin`没有意义。让我们称之为`our_clone`并提供我们的存储库的路径。噗!完成了!
![Cloning in GIT](../Images/9cec0d8e5a61d053960d151d817e71a2.png)
![Cloning in GIT](img/9cec0d8e5a61d053960d151d817e71a2.png)
我们现在可以创建新的分支、文件并一起工作。但是我们如何跟上两个存储库中的变化呢?在下一章中,我们将讨论在存储库之间推和拉我们的变更。
......
......@@ -19,7 +19,7 @@ The easiest way to do this is to push our changes to the remote repository: $ gi
此设置仅影响本地客户端的行为,并且可以通过显式指定要在命令行上推送的分支来覆盖。其他客户端可以有不同的设置,它只影响当您没有指定要推送哪些分支时会发生什么。
![Pushing and Pulling in GIT](../Images/ad4450ac47cfd66b2bcef08dda46494c.png)
![Pushing and Pulling in GIT](img/ad4450ac47cfd66b2bcef08dda46494c.png)
因此,让我们通过键入以下内容将 **push.default** 设置为新的方式:
......@@ -31,11 +31,11 @@ $ git config --global push.default simple
默认情况下, **$ git push** 的第一个参数必须是一个遥控器的名称。如果你不提供一个,Git 会自动假设你说的是原点。继续输入 **$ git 推送原始数据 _ 功能**
![Pushing and Pulling in GIT](../Images/030321ac988bd31b5b5bfc01402b0444.png)
![Pushing and Pulling in GIT](img/030321ac988bd31b5b5bfc01402b0444.png)
啊!成功的信息。终于。转到您的`awesome_project`并检查分支是否已创建。很好,都在那里。当您在原点时,签出新分支,编辑文件并提交它。现在回头对同一个文件再做一些更改(是的,我们知道这很混乱,但我们保证这一切都是值得的)。现在试着推动改变。
![Pushing and Pulling in GIT](../Images/7142c14eabf2587e7e20045b2bd4e8c0.png)
![Pushing and Pulling in GIT](img/7142c14eabf2587e7e20045b2bd4e8c0.png)
哦哦。错误。看起来我们没有及时了解遥控器的变化,因此无法推送。那么我们如何随着遥控器的变化更新自己呢?
......@@ -45,21 +45,21 @@ $ git config --global push.default simple
你可能已经猜到了,因为有一个 **$ git push** 命令,所以有一个 **$ git pull** 命令。语法与 push 命令非常相似。我们说我们想要拉,我们指定我们想要从哪个远程拉,以及我们想要为哪个分支获取历史。
![Pushing and Pulling in GIT](../Images/748fe904fda6c6e5202092b8a346474d.png)
![Pushing and Pulling in GIT](img/748fe904fda6c6e5202092b8a346474d.png)
Git 试图把这些信息拉过来,哦,对了。在两个存储库中,我们对同一个文件进行了编辑,git 不知道如何修复它。它的工作方式非常类似于合并,只是它合并了来自两个存储库的更改。召回合并冲突?我们这里有一个。
![Pushing and Pulling in GIT](../Images/fcd9fe33a3bc1022b92daf19d583f8f3.png)
![Pushing and Pulling in GIT](img/fcd9fe33a3bc1022b92daf19d583f8f3.png)
继续解决冲突(你现在很清楚这一点)。将文件添加到临时区域并提交。我们的 git 拉现在应该完成了,所以再次尝试推动。现在一切正常。
这一切都是关于从我们的克隆体推进到起源和从起源牵引到我们的克隆体。反过来呢?让我们回到我们的`awesome_project`,进行编辑并提交。运行 **$ git push** 和呃-哦。
![Pushing and Pulling in GIT](../Images/818109264ed433bce9c12e20a0ca3578.png)
![Pushing and Pulling in GIT](img/818109264ed433bce9c12e20a0ca3578.png)
丑陋的错误信息。关于未配置推送位置的信息。在您与远程存储库的大多数交互中,您将从您的原点推动和拉动变更。在这种情况下,我们自己创建了这个存储库,这就是为什么我们需要指定我们要推送到的目的地。啊,一切都好。
![Pushing and Pulling in GIT](../Images/646d8ca8f403f2b5e97d4f42e4dfeb5b.png)
![Pushing and Pulling in GIT](img/646d8ca8f403f2b5e97d4f42e4dfeb5b.png)
一旦你得到一些练习,你会很容易做到这一点。接下来,我们将了解最受欢迎的存储库托管服务`GitHub`
......
......@@ -6,15 +6,15 @@
GitHub 拥有数百万开发人员的用户群,并提供优秀的工具来管理您的项目。去 [GitHub](https://github.com/) 设置账号。一旦你注册了,GitHub 会为你提供所有他们必须提供的功能
![GITHUB](../Images/254a7d72be19c6832a73d0e9a911d0f0.png)
![GITHUB](img/254a7d72be19c6832a73d0e9a911d0f0.png)
我们建议您通过游览来更好地了解 GitHub。您可以搜索存储库,例如,继续并在搜索栏中键入“Linux”。第一个结果是 Linux 内核源代码树。它后面的小图显示了人们在一段时间内提交到存储库的频率。让我们去看看这一页。
![GITHUB](../Images/c79aad8f939de445551fba6ee6e97341.png)
![GITHUB](img/c79aad8f939de445551fba6ee6e97341.png)
我们看到了项目的简要描述以及关于存储库的一些统计数据。随着时间的推移,Linux 存储库已经有超过 50 万次提交和 452 次发布。那是巨大的!
![GITHUB](../Images/3ee38bd3506591dfb2c0197c00f84340.png)
![GITHUB](img/3ee38bd3506591dfb2c0197c00f84340.png)
如果 GitHub 不能轻松地提供这些信息,我们将不得不将存储库的一个副本克隆到我们的计算机上,以便能够发现 GitHub 项目的活跃程度,开始是什么样的项目,代码当前是什么样子,或者我们可能有任何其他问题。因为他们在 GitHub 上托管,所以我们可以从我们的网络浏览器中找到所有的信息。
......@@ -34,11 +34,11 @@ $ git push -u origin master
```
![GITHUB](../Images/a6da1f1ba1e3aa69e5dfe5f8d1067fc5.png)
![GITHUB](img/a6da1f1ba1e3aa69e5dfe5f8d1067fc5.png)
我们将运行他们说在项目中运行的线路。我们需要提供用户名和密码。这种推动似乎奏效了。我们将切换回 GitHub,刷新页面,我们就有了我们的项目历史。你可以看到,在整个项目过程中,我们做了 11 次承诺。
![GITHUB](../Images/bc0c2df465baede9376062e1213f5270.png)
![GITHUB](img/bc0c2df465baede9376062e1213f5270.png)
像 GitHub 这样的许多托管服务提供了一个功能完善的界面来帮助您管理和探索您的项目历史。一些团队已经开始依赖这些服务来帮助他们更有效地合作。
......
......@@ -14,37 +14,37 @@
2. 在我们机器的本地网络服务器中部署 **Jenkins.war** 文件。例如雄猫
3. Start the server and open the browser and hit the URL [http://localhost:8080/jenkins](http://localhost:8080/jenkins)
![Configuring Jenkins](../Images/d4a93d8c3926678bba90be2eb5ebfe22.png)
![Configuring Jenkins](img/d4a93d8c3926678bba90be2eb5ebfe22.png)
5. Click on the **create new jobs** link to configure a project for build automation. Enter the details of the project as shown below and click OK.
![Configuring Jenkins](../Images/3900930a729c773ef335a5d2edb51be9.png)
![Configuring Jenkins](img/3900930a729c773ef335a5d2edb51be9.png)
7. In the next page, fill all the required details like - description, path of the project's pom.xml and other details and click save.
![Configuring Jenkins](../Images/c270ab0ff42b014b9ed5ec0fce7120a9.png)
![Configuring Jenkins](img/c270ab0ff42b014b9ed5ec0fce7120a9.png)
![Configuring Jenkins](../Images/af9610d06a614f9bcc025e7f8d604d4d.png)
![Configuring Jenkins](img/af9610d06a614f9bcc025e7f8d604d4d.png)
![Configuring Jenkins](../Images/ba354f8038434d96835465e574775d30.png)
![Configuring Jenkins](img/ba354f8038434d96835465e574775d30.png)
* A project/job is created in Jenkins. As shown below:
![Configuring Jenkins](../Images/1cce369be2e460d0c7780113e9971c81.png)
![Configuring Jenkins](img/1cce369be2e460d0c7780113e9971c81.png)
* Click on the **Build now** option as shown above. This will read the pom.xml and pull out the latest code and executes a build process and generates the jar/war file accordingly.
![Configuring Jenkins](../Images/3d47532d0450d12dcce2b4836a66f9e9.png)
![Configuring Jenkins](img/3d47532d0450d12dcce2b4836a66f9e9.png)
* Click on the build number link and it opens up the build details. Click on the console output to see the logs of the build.
![Configuring Jenkins](../Images/a42cb6deaf21889c95693ca029bc5e3f.png)
![Configuring Jenkins](img/a42cb6deaf21889c95693ca029bc5e3f.png)
![Configuring Jenkins](../Images/4def13463e4f54fa5dcec342d48d32e4.png)
![Configuring Jenkins](img/4def13463e4f54fa5dcec342d48d32e4.png)
![Configuring Jenkins](../Images/344dbb303dad0f3322b5f0919f6de591.png)
![Configuring Jenkins](img/344dbb303dad0f3322b5f0919f6de591.png)
![Configuring Jenkins](../Images/41508827b5025fd7a8b426bdb21cdde4.png)
![Configuring Jenkins](img/41508827b5025fd7a8b426bdb21cdde4.png)
* * *
......
......@@ -19,15 +19,15 @@ Jenkins 提供了一个很好的特性来配置多个 JVM,以克服上面提
1. 将 Jenkins.war 部署到 tomcat 服务器中并启动服务器。
* From the home page, click on the link **Manage Jenkins** and click on **Configure System** as shown below :
![Configuring JDK in Jenkins](../Images/8b40c2bac4bf08085455ad22d6ca045f.png)
![Configuring JDK in Jenkins](img/8b40c2bac4bf08085455ad22d6ca045f.png)
* From the next page, click on "Add JDK". The easiest way to configure JDK is to provide a name and path of the java installation directory. (Consider the same path used for JAVA_HOME). In the below screenshot JDK 6 and JDK 7 has been configured,
![Configuring JDK in Jenkins](../Images/90d30bb13f15fe17b1c1d86623e2b401.png)
![Configuring JDK in Jenkins](img/90d30bb13f15fe17b1c1d86623e2b401.png)
**NOTE :** The Jenkins will validate to check whether the installation directory exists for the specified JDK versions.* JDK can also be installed by intimating Jenkins to do the task. The check box **install automatically** needs to be checked in this case. Jenkins will download and installs the specified version of the JDK into the tools directory of the Jenkins home directory.
![Configuring JDK in Jenkins](../Images/5586113d5e3be8a1af227f8a60a52274.png)
![Configuring JDK in Jenkins](img/5586113d5e3be8a1af227f8a60a52274.png)
* 完成配置 JDK 的所有设置后,只需单击页面底部的“保存”即可保存配置。
......
......@@ -10,31 +10,31 @@
2. 打开詹金斯主页,点击**管理詹金斯**
3. In the **Manage Jenkins** page, click on **Setup Security** button.
![Securing Jenkins Server](../Images/43f0b79339bb32d73e02c187864c2d5e.png)
![Securing Jenkins Server](img/43f0b79339bb32d73e02c187864c2d5e.png)
5. In the next page, select the **enable security** check box.
![Securing Jenkins Server](../Images/5476b483564dda1d8a2ddf50538ba3f2.png)
![Securing Jenkins Server](img/5476b483564dda1d8a2ddf50538ba3f2.png)
7. Here, the very first thing to be done is to set the security realm. The easiest way to do this is to have Jenkins with our own database. To achieve this, select the option **Jenkins own user database**. Also, ensure that <u>Allow users to sign up</u> checkbox is also checked. Save the configuration.
![Securing Jenkins Server](../Images/d86f9f7c1eb3f6ae79acd44dfaaa1a69.png)
![Securing Jenkins Server](img/d86f9f7c1eb3f6ae79acd44dfaaa1a69.png)
9. Now a link **Sign up** will be available. Click on the same and fill the form to sign up. Once successful, log in with the account created.
![Securing Jenkins Server](../Images/3365f6286f650cbede87f615525dd24e.png)
![Securing Jenkins Server](img/3365f6286f650cbede87f615525dd24e.png)
登录后,您可以在导航栏中看到详细信息。
![Securing Jenkins Server](../Images/463e156e5670575e0f5157cc2f81f018.png)
![Securing Jenkins Server](img/463e156e5670575e0f5157cc2f81f018.png)
* 现在点击**管理詹金斯** &选择**配置全球安全**。在安全领域部分,取消选择<u>允许用户注册</u>选项。这将确保在您的许可下无法创建新用户。* Now, we need to configure the authentication for the accounts. The 2 best options preferred are **Matrix-based security** & **Project-base project authorization strategy**. This enables you to set per user for the actions which they can perform. Here, I have considered **Matrix-based security**
![Securing Jenkins Server](../Images/0851ff1e5ddead482a7c8c4bcb2f8b39.png)
![Securing Jenkins Server](img/0851ff1e5ddead482a7c8c4bcb2f8b39.png)
* 保存表单。注销并再次登录。* A login page will be displayed and login with the created account.
![Securing Jenkins Server](../Images/cd10fc24513ee82bbf02db60de64435a.png)
![Securing Jenkins Server](img/cd10fc24513ee82bbf02db60de64435a.png)
* * *
......
......@@ -6,11 +6,11 @@
* Deploy and start the Jenkins server and from the home page, click on **New Item**.
![Configuring Build System](../Images/3272643d9aab85ecc8dc209282622847.png)
![Configuring Build System](img/3272643d9aab85ecc8dc209282622847.png)
* Then click on OK. Now a new page will be displayed where the details of JDK, ANT/Maven, SCM, automating build options, email notifications can be configured.
![Configuring Build System](../Images/34a476bf8da1b39cdcdcb81818061007.png)
![Configuring Build System](img/34a476bf8da1b39cdcdcb81818061007.png)
* * *
......@@ -18,7 +18,7 @@
为了为构建系统配置配置管理,在“源代码管理”系统下,为所需的项目选择所需的配置管理选项,并相应地提供详细信息。
![Configuring SCM](../Images/3851428e674285c5c1b4742d6489fbab.png)
![Configuring SCM](img/3851428e674285c5c1b4742d6489fbab.png)
**注意:**可以在 Jenkins 中配置多个存储库 URL。
......@@ -36,7 +36,7 @@
用户可以从上面的列表中配置多个选项。下面的屏幕截图显示了如何基于 CRON 作业配置构建(通过选择“定期构建”选项)
![Configuring Build Triggers](../Images/3ef212cdd80e187e8c6ee1b35232cdd7.png)
![Configuring Build Triggers](img/3ef212cdd80e187e8c6ee1b35232cdd7.png)
上面提到的 CRON 表达式触发器建立在每天早上 5 点和晚上 10 点,每个月重复!
......@@ -46,7 +46,7 @@
对于任何要在 Jenkins 中构建的 maven 项目,入口点都是 pom.xml。配置项目构建的简单方法是指向项目的 pom.xml,如下所示:
![Configuring Maven](../Images/1f844cd000d73c94452a0243848a84fe.png)
![Configuring Maven](img/1f844cd000d73c94452a0243848a84fe.png)
此外,还有许多其他选项也可以在这里配置,如上所示。
......@@ -56,7 +56,7 @@
Jenkins 提供了通过发送为每次构建运行配置的邮件来配置通知服务的功能。它可以配置如下所示:
![Configuring Maven Build Settings](../Images/10ed90b1b3c2d54976d57aaf0e7c5dd6.png)
![Configuring Maven Build Settings](img/10ed90b1b3c2d54976d57aaf0e7c5dd6.png)
* * *
......@@ -66,23 +66,23 @@ Jenkins 还提供了配置构建后需要执行的活动的功能。以下是可
* Aggregate downstream test results.
![Configuring Post Build activities](../Images/69f7a1055d7a3d4ce2a0fdce2ad573a9.png)
![Configuring Post Build activities](img/69f7a1055d7a3d4ce2a0fdce2ad573a9.png)
* Archive the artifacts.
![Configuring Post Build activities](../Images/04447525bded0a643840205a3e1ab06d.png)
![Configuring Post Build activities](img/04447525bded0a643840205a3e1ab06d.png)
* Build other projects.
![Configuring Post Build activities](../Images/095be862384efe342ffae0ece8aa4544.png)
![Configuring Post Build activities](img/095be862384efe342ffae0ece8aa4544.png)
* Deploy artifacts to maven repository.
![Configuring Post Build activities](../Images/5e9624bb87a1ab3d8a53683ea1629432.png)
![Configuring Post Build activities](img/5e9624bb87a1ab3d8a53683ea1629432.png)
* Record fingerprints of files to track usage.
![Configuring Post Build activities](../Images/a1d6c4f5dc6ad272ad37bda827e560d3.png)
![Configuring Post Build activities](img/a1d6c4f5dc6ad272ad37bda827e560d3.png)
* * *
......
......@@ -4,23 +4,23 @@
Jenkins 是这样一个方便的工具,可以通过添加额外的插件来轻松扩展,以适应更多的功能。例如,包括 Git 作为配置管理选项,JUnit 插件等。这可以通过选择选项**管理詹金斯-管理插件**来轻松完成,如下所示。
![Plugin Management](../Images/3f5b62393a56dea5863a5f64a85ddad2.png)
![Plugin Management](img/3f5b62393a56dea5863a5f64a85ddad2.png)
从管理詹金斯屏幕点击**管理插件**。这将进入列出所有可用插件的页面。单击可用选项卡,从可用插件列表中选择需要安装的插件。例如,选择如下图所示的 Github 插件,点击页面底部的<u>不重启安装</u>按钮。这将下载 github 插件,并安装在詹金斯。
![Plugin Management](../Images/5ac83fd347d3d71b7ff422da2e75c265.png)
![Plugin Management](img/5ac83fd347d3d71b7ff422da2e75c265.png)
当您单击“安装”时,下载将开始。
![Plugin Management](../Images/f00faa3727ca6f3e9d099b50601a58ce.png)
![Plugin Management](img/f00faa3727ca6f3e9d099b50601a58ce.png)
安装完成后,您将看到一条成功消息。
![Plugin Management](../Images/2b8891d9d5423415215a19a765e937d8.png)
![Plugin Management](img/2b8891d9d5423415215a19a765e937d8.png)
现在,打开任何创建的构建作业,点击**配置**。Git 选项将添加到**源代码管理**下。
![Plugin Management](../Images/efd42a99f0e6773bc75b343a6d83e03b.png)
![Plugin Management](img/efd42a99f0e6773bc75b343a6d83e03b.png)
* * *
......
......@@ -6,15 +6,15 @@
从 Jenkins 主页点击**新项目**,只需输入项目名称,选择 **Maven 项目**,点击【确定】。
![Setting up a Project](../Images/f036d2368aefb989c868a0ed67459dac.png)
![Setting up a Project](img/f036d2368aefb989c868a0ed67459dac.png)
在下一页的构建下,只需指向 maven 项目的 **pom.xml** ,并在**目标和选项**下指定干净验证。然后应用并保存页面。
![Setting up a Project](../Images/54d8d2e6366917e425e19efd7fc0325f.png)
![Setting up a Project](img/54d8d2e6366917e425e19efd7fc0325f.png)
在下一页中,将创建一个作业。只需点击**立即构建**链接,可以看到将会触发一个新的构建,如下图所示,
![Setting up a Project](../Images/140ec3c71fd75b12155d37065f76aa76.png)
![Setting up a Project](img/140ec3c71fd75b12155d37065f76aa76.png)
* * *
......
......@@ -28,23 +28,23 @@
从詹金斯主页,点击**管理詹金斯**,在下一页点击**管理插件**
![ThinBackup Plugin](../Images/d7ee971bd85bc90a834126d7967a64b2.png)
![ThinBackup Plugin](img/d7ee971bd85bc90a834126d7967a64b2.png)
在下一页的**可用**插件标签下,搜索/查找<u>瘦备份</u>插件。选择相同内容,点击<u>不重启安装</u>按钮。
![ThinBackup Plugin](../Images/5fae885e680537e49a39aacb9ab0d704.png)
![ThinBackup Plugin](img/5fae885e680537e49a39aacb9ab0d704.png)
只要重启詹金斯就能看到插件成功安装。从主页,点击**管理詹金斯**链接,在下一页,从列表中如果可以发现 ThinBackup 插件安装。只要点击相同的,下面的页面就会显示出来。
![ThinBackup Plugin](../Images/fffd257c1110c30f1cdc131682143e87.png)
![ThinBackup Plugin](img/fffd257c1110c30f1cdc131682143e87.png)
点击**设置**链接,配置备份选项。
![ThinBackup Plugin](../Images/e47255a9a65f1034a594f86a4f314e5a.png)
![ThinBackup Plugin](img/e47255a9a65f1034a594f86a4f314e5a.png)
只需根据需要提供配置细节并保存设置即可。
![ThinBackup Plugin](../Images/093d9a2de863190d93a6b528ad7f5005.png)
![ThinBackup Plugin](img/093d9a2de863190d93a6b528ad7f5005.png)
* * *
......
......@@ -12,7 +12,7 @@ Scrum 是管理产品开发的几种技术之一,属于**敏捷软件开发**
20 世纪 90 年代末,电子媒体和互联网出现。为了支持这些,软件开发组织必须结合更多的灵活性来适应不同需求的平台的变化。此后不久,生活在台式电脑上的大型软件应用程序的开发让位于通过移动设备交付的更小、更灵活的应用程序。开发这些需要一个相同的方法。Scrum 开始以可持续和高效的方式合作,而不是等到整个周期结束。
![Waterfall Model was superseded by SCRUM Framework](../Images/5e1f742990a314275ff27e24606d89a1.png)
![Waterfall Model was superseded by SCRUM Framework](img/5e1f742990a314275ff27e24606d89a1.png)
* * *
......
......@@ -20,7 +20,7 @@
**故事:**一种清晰一致的划分、措辞和讨论团队在产品上可能需要做的工作的方式。
![Scrum Methodology](../Images/a2d8d5fc6cd2b1fa3c84adef1ead094b.png)
![Scrum Methodology](img/a2d8d5fc6cd2b1fa3c84adef1ead094b.png)
### 快速失败技术
......@@ -28,7 +28,7 @@ Scrum 希望你失败。事实上,它以口号“**快速失败**”而闻名
诀窍在于关注第二个词:<u>快速</u>*失败*是可以的,只要你从中学习,但是如果你不得不等待太久,你就不会从中学到那么多。Scrum 采纳了敏捷宣言及其关键原则,将它们归结为一个非常简单的框架,鼓励小规模的关注和快速的学习周期。
![Fail Fast Approach in Scrum Framework](../Images/c9fe55139bb0ca887ea321e984a0376a.png)
![Fail Fast Approach in Scrum Framework](img/c9fe55139bb0ca887ea321e984a0376a.png)
* * *
......
......@@ -18,7 +18,7 @@
在 Scrum 框架中,客户在开发过程中不断参与,一次又一次地审查创建的点点滴滴。当产品被分开测试时,测试产品的成本更低。更容易测试,生产出更坚固的产品。
![Scrum Framework vs Traditional Frameworks](../Images/3520f8d6f308f850b9862c70b7ba81d4.png)
![Scrum Framework vs Traditional Frameworks](img/3520f8d6f308f850b9862c70b7ba81d4.png)
* * *
......
......@@ -22,7 +22,7 @@ Scrum 大师是团队最显眼的代言人。Scrum Masters 重视透明度。他
还有一点,Scrum 大师还要求团队对他们对产品所有者的承诺负责。它们显示了团队绩效随时间变化的趋势,以帮助团队改进流程和实践。正如您所看到的,每个角色对于让框架正常运行都是绝对关键的。如果你缺少这些角色中的一个,Scrum 将远不如你同时拥有这两个角色的效果好。
![Scrum Team](../Images/964b0378a6bd46c2ac40c05f541f2bed.png)
![Scrum Team](img/964b0378a6bd46c2ac40c05f541f2bed.png)
* * *
......
......@@ -39,7 +39,7 @@ PO 与团队一起回顾优先级最高的故事,并决定他们在每次冲
Scrum 非常重视承诺这一步。每个人的承诺对实现你的冲刺目标非常重要。从评审冲刺目标到更新发布计划,每一步都必须认真执行。
![Actual Sprint Planning](../Images/2dfc4f0e44bdd5355466b6843f352d6c.png)
![Actual Sprint Planning](img/2dfc4f0e44bdd5355466b6843f352d6c.png)
* * *
......
......@@ -14,7 +14,7 @@ Scrum 通过发布**信息辐射器**来解决这些挑战。信息辐射器是
下面你会发现一个非常简单的燃烧图:
![Burn Down Chart](../Images/a06f4590c6a9682fdcbf12a14d9f8a9c.png)
![Burn Down Chart](img/a06f4590c6a9682fdcbf12a14d9f8a9c.png)
这里的绿色直线代表理想的燃烧速率。冲刺的每一天,都在努力完成所有的任务。
......
......@@ -8,13 +8,13 @@ A `Rule Engine`是一个软件,它有一些知识,能够利用这些知识
> 用`Drools`的技术语言,我们评估**规则引擎**中的所有规则。
![Rule Engine in Drools](../Images/271eb5e31dd9724b02f459e7469387a3.png)
![Rule Engine in Drools](img/271eb5e31dd9724b02f459e7469387a3.png)
* * *
对于所有**微软 Outlook** 用户来说,很容易联想到一个规则。它与上面描述的相同,当主题包含 Jboss 规则时,然后采取特定的动作。因此,当满足条件的“何时”部分时,规则的“然后”部分被触发并执行。
![Rule Engine in Drools](../Images/20fddd37d2147119cea7e8841c7f8172.png)
![Rule Engine in Drools](img/20fddd37d2147119cea7e8841c7f8172.png)
* * *
......
......@@ -13,23 +13,23 @@
[**http://download.jboss.org/drools/release/5.3.0.Final/**T3】](http://download.jboss.org/drools/release/5.3.0.Final/)
![Add Drools plugin in eclipse](../Images/b4747ee9bc68db0b2fdce35f7c6f2365.png)
![Add Drools plugin in eclipse](img/b4747ee9bc68db0b2fdce35f7c6f2365.png)
把它解压到你的硬盘上。然后启动 eclipse,转到**帮助- >安装新软件**
![Add Drools plugin in eclipse](../Images/14f033f4983801486b91bcb1379312e2.png)
![Add Drools plugin in eclipse](img/14f033f4983801486b91bcb1379312e2.png)
点击**添加**
![Add Drools plugin in eclipse](../Images/eb2811b818464ffd2bbb76be3b51c061.png)
![Add Drools plugin in eclipse](img/eb2811b818464ffd2bbb76be3b51c061.png)
单击本地并选择”.../binary/org . drools . updatesite "
![Add Drools plugin in eclipse](../Images/cc97bf31e4e1e771e5bddae4ed66c11a.png)
![Add Drools plugin in eclipse](img/cc97bf31e4e1e771e5bddae4ed66c11a.png)
选择 **Drools 和 jBPM** ,点击**下一步**
![Add Drools plugin in eclipse](../Images/08b17b4e8af326a4e7c771fc6166227b.png)
![Add Drools plugin in eclipse](img/08b17b4e8af326a4e7c771fc6166227b.png)
再次点击**下一步**
......@@ -37,17 +37,17 @@
然后软件安装开始:
![Add Drools plugin in eclipse](../Images/b1203ecc27e5ccfc6ad905828f72325b.png)
![Add Drools plugin in eclipse](img/b1203ecc27e5ccfc6ad905828f72325b.png)
安装成功后,您会看到一个**弹出窗口**
![Add Drools plugin in eclipse](../Images/4adaa58ed1430ad435296e86c43bd692.png)
![Add Drools plugin in eclipse](img/4adaa58ed1430ad435296e86c43bd692.png)
点击**是**
一旦 eclipse 重启,然后转到**窗口- >首选项**
![Add Drools plugin in eclipse](../Images/69db8fe73fadc5bbcbdc1e47e5047028.png)
![Add Drools plugin in eclipse](img/69db8fe73fadc5bbcbdc1e47e5047028.png)
你可以在你的喜好下看到**流口水**。你的 drools 插件安装现在完成了。
......
......@@ -8,11 +8,11 @@
然后点击**添加**
![How to create Drools Runtime](../Images/2c3eec22630d2a242d9d480445862132.png)
![How to create Drools Runtime](img/2c3eec22630d2a242d9d480445862132.png)
然后点击创建一个新的 Drools 运行时按钮
![How to create Drools Runtime](../Images/cf9e4c9a6ef78f671360ef55482cb679.png)
![How to create Drools Runtime](img/cf9e4c9a6ef78f671360ef55482cb679.png)
给出路径直到二进制文件夹,在那里你已经下载了[**droolsjbpm-tools-distribution-5 . 3 . 0 . final . zip**](#)
......
......@@ -6,25 +6,25 @@
转到文件 **- >** 新建 **- >** 项目
![How to create Drools Runtime](../Images/7b67fa8cb43b2d3d8040dc22d3ef4c3c.png)
![How to create Drools Runtime](img/7b67fa8cb43b2d3d8040dc22d3ef4c3c.png)
选择**流口水项目**。给这个项目起一个合适的名字。例如:**第一个口水程序**
下一个屏幕显示选择一些文件,你想要在你的第一个 drools 项目。
![How to create Drools Runtime](../Images/3659510b18eb71a4a86f80a15d98ac4d.png)
![How to create Drools Runtime](img/3659510b18eb71a4a86f80a15d98ac4d.png)
选择前两个文件。第一个文件是`.drl`文件(Drools Rule File),第二个是 **java 类**,用于加载和执行 HelloWorld 规则。
点击下一步 **- >** 完成。
![How to create Drools Runtime](../Images/84733c65991f7ff7a83ce2e39811ebe9.png)
![How to create Drools Runtime](img/84733c65991f7ff7a83ce2e39811ebe9.png)
一旦你点击**完成**,一个 **FirstDroolsProgram** 项目将在你的工作空间中创建。
打开 java 类,然后右击并作为 java 应用程序运行。您可以看到如下输出:
![How to create Drools Runtime](../Images/36d022567392a6bbf49b155b4cb29a31.png)
![How to create Drools Runtime](img/36d022567392a6bbf49b155b4cb29a31.png)
我们将在下一节之后解释程序,让我们首先解释**规则引擎**的基本术语。
......
......@@ -6,7 +6,7 @@
1. **Rules:** `Rules` are the heart of the **Rule Engine**. In rules you specify the condition and then the execution part of the condition. Below is the **syntax** of the rule in drools:
![Different Terms used in Drools](../Images/2ada0070bef51800482d0777ca827a47.png)
![Different Terms used in Drools](img/2ada0070bef51800482d0777ca827a47.png)
3. **事实:**发射规则的物体被称为`Facts`。它可以是一个简单的 Java POJO,也可以是一个复杂的对象。 **Java 对象**是 Drools 中事实的同义词
......
......@@ -4,13 +4,13 @@
如果你看到写在 **FirstDroolsProgram** 项目(Sample.drl)中的默认规则,有很多`keywords`被使用。现在让我们一个一个解释:
![Different Terms used in Drools](../Images/a7fb88fdfa4b810212896dab0484214e.png)
![Different Terms used in Drools](img/a7fb88fdfa4b810212896dab0484214e.png)
* * *
1. **包:**每个规则都以包名开头。该包充当规则的命名空间。创建规则资源时,必须定义包名。包中的规则名称必须是唯一的。规则中的包类似于`Java`中的包。当您通过**新建- >规则资源- >** 创建新规则时,您需要在下面的窗口中提到规则名称和包名称。
![Different Terms used in Drools](../Images/bafa3532b8ab4e65c72879e081fc7574.png)
![Different Terms used in Drools](img/bafa3532b8ab4e65c72879e081fc7574.png)
4. **进口对账单:**进口对账单也类似`Java`。所有的 FACTS 类和任何助手类都需要被导入,这样规则才能起作用。例如:上例中的`com.sample.DroolsTest.Message;`
......
......@@ -10,7 +10,7 @@ Maven 是一个方便的工具,可以快速设置,并且可以在最多 10
[http://maven.apache.org](http://maven.apache.org)网站下载最新版本的 maven。
![Download Apache Maven Project](../Images/c61c96f1c4df9d46e37d92adf57a289c.png)
![Download Apache Maven Project](img/c61c96f1c4df9d46e37d92adf57a289c.png)
**注:**任何高于 3.2 的 maven 版本都要求 JDK 版本达到 1.6 及以上。
......@@ -18,17 +18,17 @@ Maven 是一个方便的工具,可以快速设置,并且可以在最多 10
一旦下载成功。解压缩下载的 maven zip,并将其放入包含所有 java 相关工件的驱动器中。例如**D:\ Java \ Apache-maven-3 . 2 . 5**,万一你下载了任何其他最新版本,除了版本可能不同,但这不是问题。
![Apache Maven Project Folder on PC](../Images/2e0dd55bd7a4e84ac7e7ad95d2fcaec9.png)
![Apache Maven Project Folder on PC](img/2e0dd55bd7a4e84ac7e7ad95d2fcaec9.png)
### 设置 Maven
现在我们需要设置类路径 Java **(JAVA_HOME)** 和 Maven **(M2_HOME)** 。如果您已经设置了 JAVA_HOME,那么您只需要为 Maven 设置 M2_HOME。请确保已经安装了所需版本的 jdk。
![Setting Maven Environment Variable](../Images/e18f3cfa3717f1295ffae58845a191a3.png)
![Setting Maven Environment Variable](img/e18f3cfa3717f1295ffae58845a191a3.png)
现在编辑系统变量中的变量**路径**,以包括 JAVA_HOME 和 M2_HOME。
![Adding to Path System Variable](../Images/2906820c682ef5e6992909d5c959e018.png)
![Adding to Path System Variable](img/2906820c682ef5e6992909d5c959e018.png)
### 设置 Maven
......@@ -36,7 +36,7 @@ Maven 是一个方便的工具,可以快速设置,并且可以在最多 10
只需从**开始** - > **命令提示符**打开命令提示符,在命令提示符中键入 maven 命令`mvn -version`并按回车键。它将显示如下所示的结果,并确认我们的 maven 设置成功并完成。
![Checking Whether Maven is installed Successfully or not](../Images/a232522370d9836d1140fcdb2d2fe428.png)
![Checking Whether Maven is installed Successfully or not](img/a232522370d9836d1140fcdb2d2fe428.png)
* * *
......
......@@ -22,7 +22,7 @@
简单 java 项目的典型 pom.xml 如下图所示。
![Sample POM Xml file](../Images/0f0ce87f21172db713aa99636899f14f.png)
![Sample POM Xml file](img/0f0ce87f21172db713aa99636899f14f.png)
一个 pom.xml 总是从名为`<project>`的根元素开始,在这个元素下所有其他需要的配置都将被创建。开发人员应确保在定义 pom.xml 文件之前定义以下元素列表,这些元素被称为 **maven 坐标**:
......
......@@ -62,7 +62,7 @@
在下图中,您可以看到本地和远程/中央存储库的组织。
![Organization of Local and Remote/Central Repositories](../Images/5be079d7f15fa0613e34f42612cd89ee.png)
![Organization of Local and Remote/Central Repositories](img/5be079d7f15fa0613e34f42612cd89ee.png)
* * *
......
......@@ -26,7 +26,7 @@ Maven 附带 3 个内置构建生命周期,如下所示:
**注意:**无论何时调用任何生命周期的 maven 命令,maven 都会一直执行到调用阶段。例如,当调用“mvn 清理”时,maven 将只执行阶段清理。但是,没有调用编译/部署/站点阶段。
![Build life cycle of clean phase](../Images/85286fa01243e00029e4d55b159766db.png)
![Build life cycle of clean phase](img/85286fa01243e00029e4d55b159766db.png)
* * *
......@@ -71,6 +71,6 @@ maven 中用于为给定项目生成 javadocs 的命令是“ *mvn site* ”。
**Doxia** 基本上是 maven 用于内容生成的框架。这会以静态和动态方式生成内容。
![Site Lifecycle](../Images/d951389141abbe93ea173267c53f6297.png)
![Site Lifecycle](img/d951389141abbe93ea173267c53f6297.png)
* * *
\ No newline at end of file
......@@ -29,15 +29,15 @@ mvn archetype:generate -DgroupId=com.java.samples -DartifactId=JavaSamples
* **原型 ArtifactId** 只不过是用来创建这个 Java 项目的模板。
* **交互模式**在开发人员知道工件 id 的实际拼写时使用。在上面的例子中,maven-prototype-quick start 是被使用的一个,也是合适的一个。如果开发人员不知道这一点,那么交互模式被设置为`TRUE`,这样它将扫描远程存储库中所有可用的原型。这可能需要更长时间。
![Creating first Maven Project](../Images/dc0e929d6ff042fdfa0bf002e7381d09.png)
![Creating first Maven Project](img/dc0e929d6ff042fdfa0bf002e7381d09.png)
![Creating first Maven Project](../Images/1020c9799c630f3564c02d56e805c63d.png)
![Creating first Maven Project](img/1020c9799c630f3564c02d56e805c63d.png)
上面的命令指示 maven 用**maven-原型-快速启动**模板创建一个项目。
如果您导航到文件夹 **D:\Java\workspace** ,将创建一个名为**javassimples**的新项目,包括 Java 项目的所有基本结构,如下所示:
![Creating first Maven Project](../Images/7214a298779cd130c2154a392fa7467a.png)
![Creating first Maven Project](img/7214a298779cd130c2154a392fa7467a.png)
要查看下面的目录结构,您需要在您的 Eclipse IDE 上创建一个新的 Java 项目,并在那里导入下面的项目。
......
......@@ -14,25 +14,25 @@
正如这里所解释的,每当 maven 阶段被调用时,它都会按顺序执行直到被调用的阶段。因此,在这种情况下,将执行上述包–**验证****编译****测试**阶段。
![Build and Test Maven Project](../Images/730deb7947ca39f63cd6d86da222e9a3.png)
![Build and Test Maven Project](img/730deb7947ca39f63cd6d86da222e9a3.png)
![Build and Test Maven Project](../Images/fd53b77a40e8737b961996fe159743f9.png)
![Build and Test Maven Project](img/fd53b77a40e8737b961996fe159743f9.png)
当运行 mvn package 命令时,maven 将验证并编译源代码,执行 junit 测试用例,并根据 pom.xml 文件中标签`<packaging>`中给出的指令对其进行打包/捆绑。如果包装被指定为**罐子**,那么将创建一个带有该包装的罐子。
![Build and Test Maven Project](../Images/f8128f266688d568a2c01b605cdfff5f.png)
![Build and Test Maven Project](img/f8128f266688d568a2c01b605cdfff5f.png)
* 打包的 jar 文件将在项目的目标目录下可用。即**D:\ Java \ workspace \ JavaSamples \ target**
* 所有的测试报告(junit 测试细节)都可以在文件夹**D:\ Java \ workspace \ JavaSamples \ target \ surefire-reports**中找到
要运行 App.test java,请打开命令提示符并导航到文件夹 D:\ Java \ workspace \ JavaSamples \ target \ class,然后输入命令 **java com.java.samples.App**
![Build and Test Maven Project](../Images/93d4b4ba2156d144a24c71706e092f76.png)
![Build and Test Maven Project](img/93d4b4ba2156d144a24c71706e092f76.png)
要运行测试类(junits),打开命令提示符,从项目的根文件夹中,执行命令 **mvn 测试**
![Build and Test Maven Project](../Images/74db16f2281b87363952275508c63f68.png)
![Build and Test Maven Project](img/74db16f2281b87363952275508c63f68.png)
![Build and Test Maven Project](../Images/91504d4ef8fa3ddd1f953d8bd96f34fb.png)
![Build and Test Maven Project](img/91504d4ef8fa3ddd1f953d8bd96f34fb.png)
* * *
\ No newline at end of file
......@@ -92,12 +92,12 @@
* 从以下链接下载最新的 Jenkins . war:[http://jenkins-ci.org/T3】](http://jenkins-ci.org/)
![Installing Jenkins Server](../Images/da0019f40ca5980c2a7247f1c075287c.png)
![Installing Jenkins Server](img/da0019f40ca5980c2a7247f1c075287c.png)
* 在我们机器的本地网络服务器上部署詹金斯. war 文件。例如雄猫
* 启动服务器,打开浏览器,点击网址**http://localhost:8080/Jenkins**
![Setting up Jenkins Server and Automating Maven Build](../Images/30921872bbff60c6756bf32de9b4bf09.png)
![Setting up Jenkins Server and Automating Maven Build](img/30921872bbff60c6756bf32de9b4bf09.png)
* * *
......@@ -105,32 +105,32 @@
点击**新建作业**链接,如上图所示,为构建自动化配置项目。如下图输入项目详情,点击**确定**。您必须为 Maven 项目输入名称并选择单选按钮。
![Setting up Jenkins Server and Automating Maven Build](../Images/6ead03f829c5b93fb4f518653f98e06c.png)
![Setting up Jenkins Server and Automating Maven Build](img/6ead03f829c5b93fb4f518653f98e06c.png)
在下一页中,填写所有必需的详细信息,如- Description、项目的 pom.xml 路径和其他详细信息,然后单击 save。请查看下面的图片寻求帮助。填写所有信息,点击**保存**
![Setting up Jenkins Server and Automating Maven Build](../Images/d0366e30c2862e48470f9b8d15cdda7c.png)
![Setting up Jenkins Server and Automating Maven Build](img/d0366e30c2862e48470f9b8d15cdda7c.png)
![Setting up Jenkins Server and Automating Maven Build](../Images/3ead54ca31d15c19fb1bac471f6743e8.png)
![Setting up Jenkins Server and Automating Maven Build](img/3ead54ca31d15c19fb1bac471f6743e8.png)
![Setting up Jenkins Server and Automating Maven Build](../Images/22bf6c4d069d654f157fdc2ee1f5fdba.png)
![Setting up Jenkins Server and Automating Maven Build](img/22bf6c4d069d654f157fdc2ee1f5fdba.png)
现在在詹金斯创建了一个项目/工作。如下图所示:
![Setting up Jenkins Server and Automating Maven Build](../Images/9d84611f462aa638fe7f798351092042.png)
![Setting up Jenkins Server and Automating Maven Build](img/9d84611f462aa638fe7f798351092042.png)
如上图所示,点击**立即构建**选项。这将读取 **pom.xml** 并拉出最新的代码,执行构建过程并相应地生成 **jar/war** 文件。
![Setting up Jenkins Server and Automating Maven Build](../Images/1f158c311c357e6c861f1bc658e10ea9.png)
![Setting up Jenkins Server and Automating Maven Build](img/1f158c311c357e6c861f1bc658e10ea9.png)
单击内部版本号链接,它会打开内部版本详细信息。点击**控制台输出**查看构建日志。
![Build Automation in Maven using Jenkins Server](../Images/fc86986dde9780473c51ab866faf2fb1.png)
![Build Automation in Maven using Jenkins Server](img/fc86986dde9780473c51ab866faf2fb1.png)
检查日志,查看您的项目构建是否成功。
![Build Automation in Maven using Jenkins Server](../Images/33f6133eb7a30ac299e2f31ff7095be8.png)
![Build Automation in Maven using Jenkins Server](img/33f6133eb7a30ac299e2f31ff7095be8.png)
![Build Automation in Maven using Jenkins Server](../Images/b58015eda8fc4bd0c11dc5fa8df9c21d.png)
![Build Automation in Maven using Jenkins Server](img/b58015eda8fc4bd0c11dc5fa8df9c21d.png)
* * *
\ No newline at end of file
......@@ -37,9 +37,9 @@ javadoc 插件可以在 **pom.xml** 中为任何项目进行配置,如下所
在项目的 pom.xml 中添加了上述插件后,您所要做的就是打开命令提示符,转到项目目录,例如:Java \ workspace \ javassimples,运行命令`maven install`
![Generating Javadocs in Maven](../Images/817fd40b3dd6e7ead5496b142aefb9de.png)
![Generating Javadocs in Maven](img/817fd40b3dd6e7ead5496b142aefb9de.png)
![Generating Javadocs in Maven](../Images/eb5a34bb43414fae4b56873d19a7e919.png)
![Generating Javadocs in Maven](img/eb5a34bb43414fae4b56873d19a7e919.png)
生成的 javadocs 可以在项目的位置找到:**D:\ Java \ workspace \ JavaSimples \ target \ API docs**
......
......@@ -10,7 +10,7 @@
mvn archetype:generate -DgroupId=com.sample.webproject -DartifactId=SampleWebApp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
```
![Creating Simple Web Application in Maven](../Images/b81753692a30947505cdd7b8eedd1c0e.png)
![Creating Simple Web Application in Maven](img/b81753692a30947505cdd7b8eedd1c0e.png)
下面是 maven 使用**maven-原型-webapp** 插件生成的 web 应用程序的项目结构。
......@@ -72,14 +72,14 @@ mvn archetype:generate -DgroupId=com.sample.webproject -DartifactId=SampleWebApp
只需打开命令提示符,导航到 web app 的根文件夹,发出命令`mvn clean package`。该命令将编译、测试并生成项目的 war 文件。
![Clean and Build Web Project in Maven](../Images/af6217dab2325356f39ac6cfb8990ca4.png)
![Clean and Build Web Project in Maven](img/af6217dab2325356f39ac6cfb8990ca4.png)
![Clean and Build Web Project in Maven](../Images/23a6f421463f1d10790defa577942fe5.png)
![Clean and Build Web Project in Maven](img/23a6f421463f1d10790defa577942fe5.png)
生成警告文件后,将警告文件复制到网络服务器(您使用的任何网络服务器)的目标文件夹中,并启动服务器。您可以通过调用 web 项目的 URL 来测试应用程序:
**http://localhost:8080/<project name>/index . JSP**
![Clean and Build Web Project in Maven](../Images/95de9e1a9e33ac0f9c2005523f9ec7f8.png)
![Clean and Build Web Project in Maven](img/95de9e1a9e33ac0f9c2005523f9ec7f8.png)
* * *
\ No newline at end of file
......@@ -27,19 +27,19 @@ Maven 还提供了一个优秀的插件,帮助将 eclipse 和 maven 集成在
1. 打开月食。转到**文件** - > **新建** - > **项目**,通过关键字 maven 搜索,选择 **Maven 项目**
![Maven Project with Eclipse IDE](../Images/393b0ac63020fe12f78cfb576dcae3d9.png)
![Maven Project with Eclipse IDE](img/393b0ac63020fe12f78cfb576dcae3d9.png)
2. 选中复选框**创建一个简单的项目**,点击**下一步**
![Maven Project with Eclipse IDE](../Images/64f3e6f47f6739a44f895097a92af323.png)
![Maven Project with Eclipse IDE](img/64f3e6f47f6739a44f895097a92af323.png)
3. 如下图提供**组号****人工号****版本****包装**的详细信息,点击**完成**
![Maven Project with Eclipse IDE](../Images/835892b785824ddfa3332856d316c554.png)
![Maven Project with Eclipse IDE](img/835892b785824ddfa3332856d316c554.png)
4. 将创建一个新的项目名称 **SampleMavenProject** ,如下所示:
![Maven Project with Eclipse IDE](../Images/17dc5d2503fa86872de3405bb5013267.png)
![Maven Project with Eclipse IDE](img/17dc5d2503fa86872de3405bb5013267.png)
马文教程到此结束,希望你有一个很好的学习体验。
......
......@@ -13,7 +13,7 @@
要下载 ruby,请前往[http://rubyinstaller.org/downloads](http://rubyinstaller.org/downloads)
![Installing ruby](../Images/af991ab3bfb73710539be805a3ae6468.png)
![Installing ruby](img/af991ab3bfb73710539be805a3ae6468.png)
下载最新版本的 Ruby。最靠前的那个是最新的。您可以下载安装程序或存档文件。但是下载安装程序还是不错的。
......@@ -21,11 +21,11 @@
选择**语言**
![Installing ruby](../Images/fc1bc0b6d94c43ba66432c5b65eb5f6b.png)
![Installing ruby](img/fc1bc0b6d94c43ba66432c5b65eb5f6b.png)
点击**“我接受许可”**
![Installing ruby](../Images/cc1c89dc2a656b5e8aa9c6f3bb82de9b.png)
![Installing ruby](img/cc1c89dc2a656b5e8aa9c6f3bb82de9b.png)
浏览并选择所需的安装路径。但是建议安装在默认目录下。并检查以下 3 个选项:
......@@ -35,11 +35,11 @@
点击**安装**
![Installing ruby](../Images/6dbed7730ee7948497b67a2ba394ad32.png)
![Installing ruby](img/6dbed7730ee7948497b67a2ba394ad32.png)
您将看到安装进度条。完成后,单击“完成”。
![Installing ruby](../Images/8ea5f369b9afb6b8ea1bb8f74a4c5790.png)
![Installing ruby](img/8ea5f369b9afb6b8ea1bb8f74a4c5790.png)
* * *
......
......@@ -4,7 +4,7 @@
它也被称为 irb。它允许我们键入 ruby 表达式或语句。打开命令提示符并键入 irb。(Windows 和麦金塔都有)。
![Using Ruby Shell Command](../Images/b06998cb7a234efd75683f525f235488.png)
![Using Ruby Shell Command](img/b06998cb7a234efd75683f525f235488.png)
如上图所示,我们可以编写 ruby 表达式和语句。引号内输入的文本称为**字符串**。我们可以对两个字符串执行连接操作。
......@@ -25,11 +25,11 @@ while i < 10
end
```
![Wrong Example](../Images/d39d8d80f514d3a2fe90518c84b9ced9.png)
![Wrong Example](img/d39d8d80f514d3a2fe90518c84b9ced9.png)
输出:
![Wrong Output](../Images/9d7185f4412ebd0ce4eb8f5bb0beac12.png)
![Wrong Output](img/9d7185f4412ebd0ce4eb8f5bb0beac12.png)
哇哦!!刚刚发生了什么?看到输出后,您可能会感到困惑。我们说它打印 1 到 9。但是它显示了所有的 1,而且也太多了。这是因为变量`i`没有增加。按 **Ctrl + C** 终止执行。
......@@ -75,7 +75,7 @@ puts "Welcome to Ruby!"
我们先把这个保存为**吧。要运行程序,进入命令提示符,输入`ruby first.rb`。如果在安装期间选择了*“将 Ruby 可执行文件添加到您的路径”*选项,您也可以通过简单地键入`first.rb`来运行。**
![Using Ruby Shell Command](../Images/a8ea4e15eb0fed82625cae083bc7b063.png)
![Using Ruby Shell Command](img/a8ea4e15eb0fed82625cae083bc7b063.png)
同样,您可以在麦金塔中使用任何文本编辑器,并遵循与在 Windows 中相同的过程。
......
......@@ -24,7 +24,7 @@ puts "hello, world"
puts "hello, world", "Goodbye, world"
```
![Using puts method in Ruby](../Images/3a4e1bf5b4758eebb3498647414df2cf.png)
![Using puts method in Ruby](img/3a4e1bf5b4758eebb3498647414df2cf.png)
也试试下面的例子:
......@@ -32,7 +32,7 @@ puts "hello, world", "Goodbye, world"
puts "practice", "makes", "a", "man", "perfect"
```
![Using puts method in Ruby](../Images/97aa76215ba4ae20b2fd5c851865bbd7.png)
![Using puts method in Ruby](img/97aa76215ba4ae20b2fd5c851865bbd7.png)
* * *
......@@ -51,7 +51,7 @@ print "hello, world\n"
print "practice\n", "makes\n", "a\n", "man\n", "perfect\n"
```
![Using print method in Ruby](../Images/2b0463df4a5cf6f94e2cea45b360ba19.png)
![Using print method in Ruby](img/2b0463df4a5cf6f94e2cea45b360ba19.png)
您也可以使用这些函数显示数字数据。
......@@ -67,7 +67,7 @@ puts (2+2)
print(2+2)
```
![Using print method in Ruby](../Images/206257595696cd9d7306ec822aa7038a.png)
![Using print method in Ruby](img/206257595696cd9d7306ec822aa7038a.png)
* * *
......
......@@ -12,7 +12,7 @@ name = gets
它还在用户输入的输入结束时追加一个`\n`新行字符。
![gets method to get user data in ruby](../Images/c5b8c40c2bae2d5578bd4e04592f7259.png)
![gets method to get user data in ruby](img/c5b8c40c2bae2d5578bd4e04592f7259.png)
因此,当您键入变量名时,它会显示存储在其中的内容。当您使用`print`功能显示时,它会显示用户输入的文本以及新的一行。要删除换行符,可以使用名为`chomp`的函数。以下语句从用户输入的内容中删除换行符。
......
......@@ -44,13 +44,13 @@ number = 100
在本节中,我们将使用数字数据类型。Ruby 支持主要的数字系统,如整数、浮点数。允许`Binary``Octal``Hexadecimal`等不同的碱基。
![Binary, Hexadecimal, octal representation in ruby](../Images/4b484fb56e4bdbdf6ec8619f4c494aeb.png)
![Binary, Hexadecimal, octal representation in ruby](img/4b484fb56e4bdbdf6ec8619f4c494aeb.png)
要用二进制写,我们使用`0b`和相应的数字。例如,5 在二进制中可以写成 101。同样,用十六进制`0x`表示数字,八进制 **0** 单独使用。负数通过在数字前使用一元运算符- **(负)**来表示。
Ruby 支持加、减、乘、除、模、幂等不同的算术运算。
![arithmatic operations in Ruby](../Images/0edb7121956f92fa9cf12329e384061a.png)
![arithmatic operations in Ruby](img/0edb7121956f92fa9cf12329e384061a.png)
在上图中,您可以看到执行的算术运算。
......@@ -65,13 +65,13 @@ Ruby 支持加、减、乘、除、模、幂等不同的算术运算。
`abs`是用来求一个数的绝对值的方法。例如, **-26.abs** 给出的值是 26。其他一些方法是 **div****模**
![div and modulo methods in Ruby](../Images/fe7620e7d2a7ed9f176bad6a5654f4a7.png)
![div and modulo methods in Ruby](img/fe7620e7d2a7ed9f176bad6a5654f4a7.png)
您也可以将数字转换为字符串。例如,要将 100 转换为字符串:
`100.to_s`
![integer to string conversion in Ruby](../Images/6b956f9c1dff92ee46bb0718255249f0.png)
![integer to string conversion in Ruby](img/6b956f9c1dff92ee46bb0718255249f0.png)
* * *
......@@ -87,11 +87,11 @@ Ruby 支持加、减、乘、除、模、幂等不同的算术运算。
赋值后,变量**标志**包含布尔值**真**
![boolean datatype in Ruby](../Images/2dcd968db8dc77c38fe423ce22e4a20e.png)
![boolean datatype in Ruby](img/2dcd968db8dc77c38fe423ce22e4a20e.png)
Not 运算符`(!)`否定布尔值。例如,如果`flag`变量包含值**真**。然后标志变量的否定给出了值**假**
![double negation in Ruby](../Images/3952cbffe474c5f92f10812e769d23e7.png)
![double negation in Ruby](img/3952cbffe474c5f92f10812e769d23e7.png)
也可以对变量进行双反。但不止一次否定往往会令人困惑。因此,当你需要的时候,最好坚持使用单一否定。
......@@ -101,7 +101,7 @@ Not 运算符`(!)`否定布尔值。例如,如果`flag`变量包含值**真**
`Constants`是在整个程序中保持相同值的变量。Ruby 是一种典型的语言,您可以在其中重新分配常量。按照惯例,ruby 中的所有常量都是大写的字符,以便于区分。
![Constants in Ruby](../Images/4370ccaefa86cb76409e5bf70f403314.png)
![Constants in Ruby](img/4370ccaefa86cb76409e5bf70f403314.png)
注意,它确实改变了常量的值,但是它给出了一个警告,说**“PI 已经是初始化常量了”**
......
......@@ -42,7 +42,7 @@ For Example : 122 * 3.14
For Example : 18 / 3
```
![Arithmatic Operations in ruby](../Images/bdce986c0bd39aaab6af41b255557143.png)
![Arithmatic Operations in ruby](img/bdce986c0bd39aaab6af41b255557143.png)
## 鲁比:模运算符
......@@ -52,7 +52,7 @@ For Example : 18 / 3
For Example : 13 % 2 *//returns 1*
```
![Modulo Operator in ruby](../Images/080ba637344d16acc6d225989c6300ed.png)
![Modulo Operator in ruby](img/080ba637344d16acc6d225989c6300ed.png)
## 鲁比:指数算子
......@@ -62,7 +62,7 @@ For Example : 13 % 2 *//returns 1*
It is done by x ** y
```
![Exponential Operators in ruby](../Images/f907f426937efc75ec3f1fe030688f15.png)
![Exponential Operators in ruby](img/f907f426937efc75ec3f1fe030688f15.png)
2 的幂 4 返回 16。
......@@ -78,7 +78,7 @@ Consider this example, 1 + 2 * 3
我们可能会认为 **1 + 2** 执行,结果 **3** 将乘以 **3** 并给出 **9** 。但是**乘法****除法****指数**运算符的优先级高于**加法****减法**运算符。因此,首先执行 **2 *3** ,并将结果添加到 **1** 中,并给出 **7** 作为答案。
![Operator Precedence in Ruby](../Images/7acee3e9f4cc3dd5a474fff8a7f8a1c8.png)
![Operator Precedence in Ruby](img/7acee3e9f4cc3dd5a474fff8a7f8a1c8.png)
但是,我们可以通过将子表达式放在括号中来修改优先顺序。在表达式 **1 + 2 * 3** 中,如果 **1 + 2** 需要先执行,将该表达式放在括号中。
......@@ -86,7 +86,7 @@ Consider this example, 1 + 2 * 3
(1 + 2) * 3 this expression produces 9
```
![Operator Precedence in Ruby](../Images/19f79d1498aa9fd68bb8f2ca9c9af1a8.png)
![Operator Precedence in Ruby](img/19f79d1498aa9fd68bb8f2ca9c9af1a8.png)
* * *
......@@ -110,7 +110,7 @@ Consider this example, 1 + 2 * 3
**小于运算符**检查一个数字是否小于另一个数字,如果**是**则返回**真**否则返回**假****小于或等于运算符**检查一个数是否小于另一个数,还检查一个数是否等于另一个数,如果任一条件正确,则返回真,否则返回假。**大于和大于等于**也一样,检查是否大于**。**
**![Relational Operators in Ruby](../Images/7bf2ce1ab802610e76cce2d4b37b2036.png)
**![Relational Operators in Ruby](img/7bf2ce1ab802610e76cce2d4b37b2036.png)
比较两个值的另一种方法是使用**通用比较**运算符。它根据操作数返回 **0(零)****-1****+1** 。如果两个值相等,则返回**零**,如果第一个操作数小于第二个操作数,则返回 **-1** ,如果第一个操作数大于第二个操作数,则返回 **+1**
......@@ -118,15 +118,15 @@ Consider this example, 1 + 2 * 3
The General Comparison operator is <=>(< = >).
```
![General Comparision Operator in Ruby](../Images/57f63537cf71ae95b1a2cd87e7cd4c8b.png)
![General Comparision Operator in Ruby](img/57f63537cf71ae95b1a2cd87e7cd4c8b.png)
`Relational operators`也可以搭配琴弦使用。
![Comparision operator on Strings in Ruby](../Images/5ae6f088274f6064073c2908b0e20285.png)
![Comparision operator on Strings in Ruby](img/5ae6f088274f6064073c2908b0e20285.png)
如果相同,则返回真。你可以看到它为操作**【苹果】=【苹果】**返回假,这是因为 Ruby 区分大小写,一个单词有`Uppercase A`,而另一个单词有`lowercase a`。我们也可以使用带字符串的**通用比较运算符**
![General Comparision Operator on String in Ruby](../Images/5cf40136ac7dab99728115a5b8a0792c.png)
![General Comparision Operator on String in Ruby](img/5cf40136ac7dab99728115a5b8a0792c.png)
比较**【车】****【车】**时,返回 **0** ,因为两者相等。将**【驾驶室】****【汽车】**进行对比时,由于**【驾驶室】****【b】**一词的第 3 个字母小于**【汽车】**中的**【r】**,因此返回 **-1**
......@@ -140,7 +140,7 @@ The General Comparison operator is <=>(< = >).
当所有表达式都为真时,它返回真;如果其中一个表达式的计算结果为假,它返回假。您可以使用`and``&&`使用该运算符。
![Logical And Operator in Ruby](../Images/36134c58ae3d7d43dedcd05df9a8ad60.png)
![Logical And Operator in Ruby](img/36134c58ae3d7d43dedcd05df9a8ad60.png)
表达式**工资== 10 & &小时== 40** 返回真,因为我们已经将工资和小时变量的值初始化为 10 和 40。对于所有其他情况,它将返回 false。
......@@ -148,7 +148,7 @@ The General Comparison operator is <=>(< = >).
`OR`当任意一个条件/表达式为真时,运算符返回真,只有当所有条件/表达式都为假时,运算符才返回假。您可以使用`or`(或)`||`来使用该运算符
![Logical Or Operators in Ruby](../Images/0e702ce5f9ecda8299b03b72eb6fce1b.png)
![Logical Or Operators in Ruby](img/0e702ce5f9ecda8299b03b72eb6fce1b.png)
可以看到,即使只有一个表达式为真**或**运算符也返回真。
......@@ -156,7 +156,7 @@ The General Comparison operator is <=>(< = >).
`NOT`运算符否定关系表达式。该操作员可以使用`not`(或)`!`
![Logical Not Operator in Ruby](../Images/640a6e464cd1ca92fd2b89e34d91cc61.png)
![Logical Not Operator in Ruby](img/640a6e464cd1ca92fd2b89e34d91cc61.png)
在第一个表达式中,它返回 false,因为表达式 **salary == 10** 返回 true,not 运算符否定 true 并返回 false。同样,表达式**工资< 10** 返回假,非运算符否定并返回真。
......
......@@ -26,7 +26,7 @@ a = b = c= 0
现在这三个变量都有相同的值。
![chaining assignments in ruby](../Images/480aa56556c64a371440e5822575ca41.png)
![chaining assignments in ruby](img/480aa56556c64a371440e5822575ca41.png)
可以看到变量 **a****b** &、 **c** 具有相同的值 0。
......@@ -34,7 +34,7 @@ a = b = c= 0
这是 ruby 的一个有趣的特性。在表达式中使用它,我们可以确定它是什么类型的标识符。我们已经将变量**定义为**。我们现在可以使用定义的运算符来识别什么是 **a**
![Defined opertor in Ruby](../Images/5e6295f201223e43c1d7dbcf9f57ac26.png)
![Defined opertor in Ruby](img/5e6295f201223e43c1d7dbcf9f57ac26.png)
因为变量 a 是在本地声明的,所以它作为`local-variable`返回。同样,它返回`method`表示**打印**`assignment`表示表达式 **a = 1**
......@@ -52,11 +52,11 @@ a = b
b = temp
```
![Parallel Assignment in Ruby 1](../Images/aef7482df25b28f156a4727996f665b0.png)
![Parallel Assignment in Ruby 1](img/aef7482df25b28f156a4727996f665b0.png)
但是有一种有效的方法叫做`parallel assignment`。这可以通过 **a,b = b,a** 来完成。安静简单。正确
![Parallel Assignment in Ruby 2](../Images/ee838d12148faf6bee76c632d3f562f2.png)
![Parallel Assignment in Ruby 2](img/ee838d12148faf6bee76c632d3f562f2.png)
最初 **a****b** 的值为 **5****10** ,并行赋值后 **a****b** 的值为`swapped`
......
......@@ -8,7 +8,7 @@
a * b = a*b. Will this work?
```
![Interpolation example in Ruby](../Images/e749d52026fe5c3f1927f6d399e9da1c.png)
![Interpolation example in Ruby](img/e749d52026fe5c3f1927f6d399e9da1c.png)
没有。它返回了一个意外的结果。我们需要打印 **a****b****a*b** 的数值。现在,`Interpolation`进入画面。使用`Interpolation`,我们可以在字符串中包含表达式和值。
......@@ -16,11 +16,11 @@ a * b = a*b. Will this work?
To Interpolate the value of a, do the following: puts " #{a} "
```
![Interpolation example in Ruby](../Images/1b503c64c8b0254e9de7820e308e0793.png)
![Interpolation example in Ruby](img/1b503c64c8b0254e9de7820e308e0793.png)
它返回一个的**值,而不是作为字符串****“a”。同样,我们必须对变量 **b** 和表达式 **a*b** 做同样的操作。**
![Interpolation example in Ruby](../Images/4c7ca54ccc4e64480c9b7877f24781ea.png)
![Interpolation example in Ruby](img/4c7ca54ccc4e64480c9b7877f24781ea.png)
Ruby 计算变量或花括号之间的表达式的值。
......@@ -36,10 +36,10 @@ Ruby,计算 **a*b** 的值并插值成字符串。
现在,我们要展示**“我爱萨钦·坦杜尔卡”。**
![Interpolation example on Strings in Ruby](../Images/410325b0177b67b9021d05e0bd726a66.png)
![Interpolation example on Strings in Ruby](img/410325b0177b67b9021d05e0bd726a66.png)
我们期待**“我爱萨钦·坦杜尔卡尔”**但是它显示了**“我爱这个人”**。现在,让我们插入变量`person`
![Interpolation example on Strings in Ruby](../Images/9cdd799625c49f49548497122caaa8ca.png)
![Interpolation example on Strings in Ruby](img/9cdd799625c49f49548497122caaa8ca.png)
* * *
\ No newline at end of file
......@@ -6,7 +6,7 @@
引号内的任何字符如**数字****字母****符号**均为`Strings`
![String Data Type example in Ruby](../Images/8fe7d050204ef4309dea4e165cd6782b.png)
![String Data Type example in Ruby](img/8fe7d050204ef4309dea4e165cd6782b.png)
我们已经学习了在字符串中添加换行符。同样,其他字符也可以嵌入字符串中。
......@@ -34,7 +34,7 @@ str = 'Bharath\'s'
在下图中,当在字符串的单引号中使用单引号时,您可以看到我们无法退出交互模式。所以,不可取。
![Including apostrophe in a String by using escape characters in Ruby](../Images/70262ff2536ad47261b8571689e1e709.png)
![Including apostrophe in a String by using escape characters in Ruby](img/70262ff2536ad47261b8571689e1e709.png)
* * *
......@@ -42,7 +42,7 @@ str = 'Bharath\'s'
要创建多行字符串并将其存储在变量中,使用`HERE`关键字。
![Here keyword example in Ruby](../Images/4219e185f7c17e5e3edaeaaf79c5b1a0.png)
![Here keyword example in Ruby](img/4219e185f7c17e5e3edaeaaf79c5b1a0.png)
这以两个小于符号`<<`开始,关键字**在这里**表示,直到您再次看到关键字**在这里**,将所有值存储在变量中。
......@@ -71,7 +71,7 @@ quote = << *HERE*
其中,分隔符是指定的字符串将被一分为二的点。
![Split method in String data type in Ruby](../Images/b2189a63ef45b4b6a52ead356b5a7a3f.png)
![Split method in String data type in Ruby](img/b2189a63ef45b4b6a52ead356b5a7a3f.png)
```
first,last = "Bharath,Kumar".*split*(/,/)
......@@ -93,7 +93,7 @@ first,last = "Bharath,Kumar".*split*(/,/)
*<String Value>*.squeeze
```
![Squeeze method in String data type in Ruby](../Images/446cfa038738aa65dd2bb10f331bcc80.png)
![Squeeze method in String data type in Ruby](img/446cfa038738aa65dd2bb10f331bcc80.png)
在上图中,您可以先记下变量**中的空格数。当使用挤压方法打印第一个变量时,它会删除尾随空格。**
......
......@@ -12,11 +12,11 @@ The syntax for defining range is startvalue..endvalue
您也可以创建自己的范围,如**“aab”..aae'** 包含值 **aab****aac****aad****aae**
![Range example in ruby](../Images/e1e9a03da12b6e6f588f2ce2b7584b3c.png)
![Range example in ruby](img/e1e9a03da12b6e6f588f2ce2b7584b3c.png)
`Range`是 Ruby 中灵活的数据类型。一旦定义了范围,我们也可以在范围上调用方法。
![Range methods in ruby - min, max, include?](../Images/5772e4b941445dee6218914034a0d422.png)
![Range methods in ruby - min, max, include?](img/5772e4b941445dee6218914034a0d422.png)
* * *
......@@ -33,13 +33,13 @@ The syntax for defining range is startvalue..endvalue
letters.each { |letter| print(letter) }
```
![Accessing elemetns of Range in Ruby](../Images/bd2ff8b5078d26dbf1811fd04ae7a29c.png)
![Accessing elemetns of Range in Ruby](img/bd2ff8b5078d26dbf1811fd04ae7a29c.png)
在上面的代码中,范围**‘a’的每个成员..存储在变量`letters`中的 z'** 在每次迭代中被复制到变量`letter`中。这是通过使用符号`||`来完成的。然后,我们可以用这个值做任何我们想做的事情。这里,我们刚刚打印了变量`letter`中的值。`Ranges`通常用作循环中的条件。
* There is also another useful operator called **case equality operator** `(===)`. Using this operator, we can determine that whether any particular element is present in the given range or not. If the element is present in the range it returns **true**, else returns **false**.
![equality operator on Ranges in Ruby](../Images/05d76ef9f42158400ae8b5240fda89a5.png)
![equality operator on Ranges in Ruby](img/05d76ef9f42158400ae8b5240fda89a5.png)
这里元素**‘c’**出现在变量`letters`中,所以它返回**真**。同样的,`digits`是一个包含 0 到 9 范围的变量,我们正在用`case equality operator`检查 **100** 是否在范围内,它返回 false 表示 100 不属于这个范围。
......
......@@ -7,7 +7,7 @@
* **装鸡蛋的鸡蛋纸盒**
* **棋盘**及其棋子等
![Example of Array](../Images/fcf4f327ec90a438aaae03dc9fa48a9a.png)
![Example of Array](img/fcf4f327ec90a438aaae03dc9fa48a9a.png)
**数组的表示**
......@@ -23,11 +23,11 @@ numbers = [1,3,5,7,9]
这里`numbers``integers`类型的 **5** 号(数据)的集合。
![Array Example in Ruby](../Images/a19e589fb95348834f387e2f05f2d35c.png)
![Array Example in Ruby](img/a19e589fb95348834f387e2f05f2d35c.png)
数组的元素通过使用数组名后跟索引来访问。例如,`numbers`数组的第一个元素被**号【0】**访问
![Accessing Array Elements in Ruby](../Images/1c530c1b398220da6acef406074dbc35.png)
![Accessing Array Elements in Ruby](img/1c530c1b398220da6acef406074dbc35.png)
为了总结等级数组的所有元素,使用以下语句。
......@@ -35,7 +35,7 @@ numbers = [1,3,5,7,9]
Sum = grades[0] + grades[1] + grades[2] + grades[3]
```
![Sum of ELements of Array in Ruby](../Images/f2b100a3736d579d63639f331bb054d2.png)
![Sum of ELements of Array in Ruby](img/f2b100a3736d579d63639f331bb054d2.png)
然而,有更有效的方法来访问数组的所有元素。当我们进入关于循环的课程时,我们会看到这些。到目前为止,要访问数组元素,您需要指定它的索引。有时称为**偏移**
......@@ -45,7 +45,7 @@ Sum = grades[0] + grades[1] + grades[2] + grades[3]
序列(范围)可以使用`to_a`方法转换为数组。
![Turning Range into Array in Ruby](../Images/4af1489968e8bee3657b3d882482a709.png)
![Turning Range into Array in Ruby](img/4af1489968e8bee3657b3d882482a709.png)
* * *
......@@ -64,9 +64,9 @@ pincode = {
```
![Hash in Ruby](../Images/aef9e98554dad006e430f828d2f49f5c.png)
![Hash in Ruby](img/aef9e98554dad006e430f828d2f49f5c.png)
![Representation of Hash in Ruby](../Images/97cc4227b8b79a1f16028a6fcbfdddf1.png)
![Representation of Hash in Ruby](img/97cc4227b8b79a1f16028a6fcbfdddf1.png)
### Ruby:散列的表示
......@@ -76,7 +76,7 @@ pincode = {
如果我们试图用一个不存在的键来检索一个值,它会返回`nil`
![Accessing Hash elements in Ruby example](../Images/c9bedc56b2bfa04af0f6fc58b4db2f43.png)
![Accessing Hash elements in Ruby example](img/c9bedc56b2bfa04af0f6fc58b4db2f43.png)
这样可以保证**键**是否存在。如果返回`nil`,则表示密钥不存在。
......
......@@ -26,13 +26,13 @@ sample << '*first item*'
sample.push("*second item*")
```
![Push function in Ruby](../Images/66bf081fe975cb00a39148da67aa2e31.png)
![Push function in Ruby](img/66bf081fe975cb00a39148da67aa2e31.png)
![Push function in Ruby](../Images/7cb00d136a58e02314871aa21f02f424.png)
![Push function in Ruby](img/7cb00d136a58e02314871aa21f02f424.png)
现在,你可以看到数组中有三个名为`sample`的项目。
![Push example in Ruby](../Images/2f5a7ae1eebe4aa5de918ec8f2c8862f.png)
![Push example in Ruby](img/2f5a7ae1eebe4aa5de918ec8f2c8862f.png)
* * *
......@@ -46,11 +46,11 @@ sample.pop
要移除元素,不需要指定参数。它会移除最近插入的项目,无论它是什么。
![Pop function in Ruby](../Images/3232df074c043a7e50d2369429f0ae2d.png)
![Pop function in Ruby](img/3232df074c043a7e50d2369429f0ae2d.png)
**弹出操作**
![Pop function in Ruby](../Images/f66d3114e1228b030e7755b2c9d9ab4c.png)
![Pop function in Ruby](img/f66d3114e1228b030e7755b2c9d9ab4c.png)
如您所见,`pop`操作移除了最近插入的项目**哈库纳马塔**,然后是**第二个项目**。现在,数组只包含一项。这些操作允许数组用作 **STACK** 数据结构。
......
......@@ -35,7 +35,7 @@ end
运行程序时,提示用户输入等级,转换为`Integer`。如果输入的等级大于 **70** ,则显示`pass`
![if conditional statement example in Ruby](../Images/57ea3c3343b33da127adb5e65b56d677.png)
![if conditional statement example in Ruby](img/57ea3c3343b33da127adb5e65b56d677.png)
您可以看到,当输入大于 70 的值时,它会显示 pass。如果输入的值小于 70,则不显示任何内容。为了处理这个问题,我们需要另一种类型的语句`If - else`
......@@ -55,11 +55,11 @@ end
如果条件为真,则执行 If 块中的语句,如果条件失败,则执行 else 块中的语句。
![if-else conditional statement example in Ruby](../Images/c896b5095f2fa50c04048e40ec0e4eb6.png)
![if-else conditional statement example in Ruby](img/c896b5095f2fa50c04048e40ec0e4eb6.png)
如果输入的值小于 70,则显示`fail`
![if-else conditional statement example in Ruby](../Images/b7bb29467997188a40d6970fb1cbc5e8.png)
![if-else conditional statement example in Ruby](img/b7bb29467997188a40d6970fb1cbc5e8.png)
If else 语句用于双向决策。如果要有两个以上的决策,可以使用`If - Else If`语句。
......@@ -83,11 +83,11 @@ end
它计算条件 1,如果为真,它执行语句 1,如果为假,它计算条件 2,如果为真,它执行语句 2,依此类推。如果这些条件都不成立,它就执行语句 4。
![if-elsif-else conditional statement example in Ruby](../Images/9efc4881984063cbb5632433ef908ff6.png)
![if-elsif-else conditional statement example in Ruby](img/9efc4881984063cbb5632433ef908ff6.png)
执行此程序时,会提示输入标记。根据输入的值,它检查程序中给出的条件,并显示您的`Grade`
![if-elsif-else conditional statement example in Ruby](../Images/0f2546228423fba336634514f5407fe7.png)
![if-elsif-else conditional statement example in Ruby](img/0f2546228423fba336634514f5407fe7.png)
## 鲁比:案例陈述
......@@ -106,10 +106,10 @@ else
end
```
![Case Statement Example in Ruby](../Images/dad2a2daa8aaf65d5090fabbf3b4efa9.png)
![Case Statement Example in Ruby](img/dad2a2daa8aaf65d5090fabbf3b4efa9.png)
如果变量**等级**的值在 90 到 100 之间,它会将`A`分配给变量`letterGrade`。同样,当满足相应的表达式时,基于输入执行以下语句。
![Case Statement Example in Ruby](../Images/871b0cf2796477c88d0d2504927ecbfe.png)
![Case Statement Example in Ruby](img/871b0cf2796477c88d0d2504927ecbfe.png)
* * *
\ No newline at end of file
......@@ -4,7 +4,7 @@
在我们开始`unless`之前,让我们来看看一些我们之前已经看过的基本东西。我们这样做是因为,它解释了你的问题**为什么除非?**所以,我们看到关于`or`运算符、`if`关键字和`unless`关键字。`OR`运算符返回 true,即使其中一个条件为 true。
![if condition with logical or operator in Ruby](../Images/0e58d958657fbeb136e43958e710834f.png)
![if condition with logical or operator in Ruby](img/0e58d958657fbeb136e43958e710834f.png)
在上面的代码中,变量**权重**被赋予一个值 **32** 。然后使用`OR`操作符检查条件。
......@@ -14,17 +14,17 @@
当条件为真时,显示**“需要看医生”**信息。现在,将**重量**的值视为 **87**
![if condition with logical or operator in Ruby](../Images/9672151be45f337208218832dd1890cc.png)
![if condition with logical or operator in Ruby](img/9672151be45f337208218832dd1890cc.png)
第一个条件检查**重量< 35** ,条件失败,检查第二个条件**重量> 70** ,条件为真,显示信息。现在,如果**权重**包含 35 到 70 之间的值会怎么样?
![if condition with logical or operator in Ruby](../Images/5dbe78e2514162226e0d7818e24cb103.png)
![if condition with logical or operator in Ruby](img/5dbe78e2514162226e0d7818e24cb103.png)
像往常一样,检查第一个条件,它失败,检查第二个条件,它也失败。因此不执行`puts`语句。
当我们谈到`if keyword`的时候,它是用来做决定的,是不是执行那组代码。但是,如果想要测试 if 的反义词呢?也就是说,您只想在条件为 false 时执行代码。这就是`unless`出现的地方。
![Unless Example in Ruby](../Images/15bab8d312da77567784745e29af270a.png)
![Unless Example in Ruby](img/15bab8d312da77567784745e29af270a.png)
当年龄大于 18 岁时,该程序显示消息**“你有资格投票”**。存储在变量**年龄**中的值是 **23**
......
......@@ -22,27 +22,27 @@ end
考虑下面打印**“你好,世界”** 5 次的例子。
![While loop example in Ruby](../Images/26eeb933cc5a16b54966c9944d392c0d.png)
![While loop example in Ruby](img/26eeb933cc5a16b54966c9944d392c0d.png)
现在让我们检查它的输出
![While loop example in Ruby](../Images/4d1d75ccd1c08c3ffc07ed2bfec54a5b.png)
![While loop example in Ruby](img/4d1d75ccd1c08c3ffc07ed2bfec54a5b.png)
哦,等等!这是什么?应该只印了**“你好,世界”**5 次。但是发生了什么?
变量**计数**用值 **1** 初始化,当计数变为 **5** 时,循环将终止。但是在 while 循环中,没有递增 count 值的语句。因为条件永远不会变假,所以不会终止。这叫`Infinite loop`
![While loop example in Ruby](../Images/9ee0fa97f02a9f256fae77af369ca7aa.png)
![While loop example in Ruby](img/9ee0fa97f02a9f256fae77af369ca7aa.png)
现在,在这段代码中,您可以看到**计数**的值增加了 **1** 。因此,每次执行循环时,**计数**的值递增,如果**计数**的值变为 **6** ,则条件失败并退出循环。现在,让我们看看输出。
![While loop example in Ruby](../Images/e4fb400dccf9e37ff358a7b40f9a056b.png)
![While loop example in Ruby](img/e4fb400dccf9e37ff358a7b40f9a056b.png)
这就是我们的预期产量。条件失败后,从`while block`出来,执行`while block`后面的下一条语句。
下一个程序打印前十个数字的总和。
![While loop example in Ruby](../Images/7b6e58dd18e2dd51bbd68cfec2216087.png)
![While loop example in Ruby](img/7b6e58dd18e2dd51bbd68cfec2216087.png)
* * *
......@@ -62,25 +62,25 @@ end
检查条件,如果是**假**它执行`until block`里面的语句,当条件变成**真**时,它退出循环。
![Until loop example in Ruby](../Images/db5298802b4cfcd9ed1f03b4d6e93b95.png)
![Until loop example in Ruby](img/db5298802b4cfcd9ed1f03b4d6e93b95.png)
循环执行,直到**计数**变为 **6** 。当计数变为 6 时,条件将为**真**,并且**退出**循环。程序的输出是:
![Until loop example in Ruby](../Images/3592230e9d84e24c6f0f58edbad569ac.png)
![Until loop example in Ruby](img/3592230e9d84e24c6f0f58edbad569ac.png)
打印前 10 个数字总和的程序
![Until loop example in Ruby](../Images/ff532c6df398f80ad2625140c66a0aa0.png)
![Until loop example in Ruby](img/ff532c6df398f80ad2625140c66a0aa0.png)
上述程序的输出是:
![Until loop example in Ruby](../Images/ae7052a1a5a19c20af4776222ce8f745.png)
![Until loop example in Ruby](img/ae7052a1a5a19c20af4776222ce8f745.png)
* * *
## Ruby:每个迭代器
![Each loop example in Ruby](../Images/fe42e8e892f5c30dc337e92b203b8bb5.png)
![Each loop example in Ruby](img/fe42e8e892f5c30dc337e92b203b8bb5.png)
```
Each Iterator is used to iterate over an array
......@@ -94,18 +94,18 @@ Each Iterator is used to iterate over an array
就像`while``unless`循环重复执行一组语句。利用这一点,我们还可以遍历容器。
![For in loop example in Ruby](../Images/ef86497a9e6fa8263652425fc4e317c3.png)
![For in loop example in Ruby](img/ef86497a9e6fa8263652425fc4e317c3.png)
在这段代码中,它取出数组 **nums** 的每个元素,并将其存储在单个元素(变量) **num** 中。然后使用该值,我们可以执行所需的操作。上面代码的输出是:
![For in loop example in Ruby](../Images/fadbd00025e0515c46e392bc411cdb19.png)
![For in loop example in Ruby](img/fadbd00025e0515c46e392bc411cdb19.png)
要使用 for 循环对 10 个数字求和:
![For in loop example in Ruby](../Images/54f4a4cb8725f6b354623ef3b22023d5.png)
![For in loop example in Ruby](img/54f4a4cb8725f6b354623ef3b22023d5.png)
它的输出是:
![For in loop example in Ruby](../Images/4408f2c2bd908b3ab252771cfccd7f2b.png)
![For in loop example in Ruby](img/4408f2c2bd908b3ab252771cfccd7f2b.png)
* * *
\ No newline at end of file
......@@ -8,7 +8,7 @@
## Ruby:时代迭代器
![Times Iterator example in Ruby](../Images/7b6a4561152e69a1e303e884efade02e.png)
![Times Iterator example in Ruby](img/7b6a4561152e69a1e303e884efade02e.png)
这段代码执行 do 块中的语句的次数在`times`关键字之前。`times`关键字知道从 1 开始,到`times`关键字之前指定的数字为止。
......@@ -20,41 +20,41 @@ Here, 5 is given. So, it prints "Hello, World" for 5 times.
## 鲁比:向上迭代器
![Upto Iterator example in Ruby](../Images/2cbc5dec672d2b47aa8642cc81e7d245.png)
![Upto Iterator example in Ruby](img/2cbc5dec672d2b47aa8642cc81e7d245.png)
它从`upto`关键字之前指定的数字开始,直到`upto`关键字中指定的数字,遍历整个范围。在我们的例子中,从 1 到 10。对于每次迭代,它将值存储到变量 **x** 中。使用变量 **x** 中的值,我们可以通过在 do 块中指定它来执行我们想要的操作。
上面代码的输出是:
![Upto Iterator example in Ruby](../Images/f1181e2ca6d49dc45fbeb64c67a303ee.png)
![Upto Iterator example in Ruby](img/f1181e2ca6d49dc45fbeb64c67a303ee.png)
同样,我们可以将前十个数字的值相加,
![Upto Iterator example in Ruby](../Images/58cbb831e81a9db8e90717cc2866343b.png)
![Upto Iterator example in Ruby](img/58cbb831e81a9db8e90717cc2866343b.png)
* * *
## Ruby:步骤迭代器
![Step Iterator example in Ruby](../Images/4fb474a3900b48f849787e655ec20f6d.png)
![Step Iterator example in Ruby](img/4fb474a3900b48f849787e655ec20f6d.png)
有点类似`upto`迭代器。
![Step Iterator example in Ruby](../Images/9d31f3dae92d7fc191e5195a395b71f3.png)
![Step Iterator example in Ruby](img/9d31f3dae92d7fc191e5195a395b71f3.png)
它在用户指定的范围内迭代。对于每次迭代,它增加由**步数计数器**指定的变量`x`的值。
上述程序的输出是:
![Step Iterator example in Ruby](../Images/37c51b87f933e933fefd208357120d3e.png)
![Step Iterator example in Ruby](img/37c51b87f933e933fefd208357120d3e.png)
打印最多 10 个奇数的总和
![Step Iterator example in Ruby](../Images/161e55de9f82251829b1c815128d7637.png)
![Step Iterator example in Ruby](img/161e55de9f82251829b1c815128d7637.png)
上述程序的输出是:
![Step Iterator example in Ruby](../Images/4b8ec49309d92a031b0dd1194647a904.png)
![Step Iterator example in Ruby](img/4b8ec49309d92a031b0dd1194647a904.png)
请记住,**迭代器**与传统编程语言中的`while``do while`循环相比,提供了更大的灵活性。
......
......@@ -28,7 +28,7 @@ def *methodname*(arguments)
end
```
![defining a method in Ruby](../Images/7e93dfc668fd66eea831f0223c0362c8.png)
![defining a method in Ruby](img/7e93dfc668fd66eea831f0223c0362c8.png)
在上面的代码中,有一个名为`square`的方法,只有一个参数。名为`number`的变量被赋予了 **3** 的值。另一个名为`numbersqr`的变量被赋予了该函数返回的值。这里,我们通过指定名称和传递参数来调用函数。
......@@ -40,7 +40,7 @@ square(number). It is called function calling statement.
这是上述程序的输出:
![defining a method in Ruby](../Images/352a92db71b7cb32bb80a88a40d831d0.png)
![defining a method in Ruby](img/352a92db71b7cb32bb80a88a40d831d0.png)
**9** 从函数返回,分配给变量`numbersqr`,并使用`print`方法显示。在本例中,函数的返回类型是使用表达式。
......@@ -48,7 +48,7 @@ square(number). It is called function calling statement.
## 具有多个参数的 Ruby 方法
![defining a method with more than one parameter in Ruby](../Images/be9c588d9b1db37af3ff146f6dd5c187.png)
![defining a method with more than one parameter in Ruby](img/be9c588d9b1db37af3ff146f6dd5c187.png)
在这个程序中,有两种方法`square``power`**幂法****两个**参数。此方法将**基础变量**中的值提升至`exp`变量中的值后返回该值。此方法显式返回该值。即使用`return`关键字返回该值。
......@@ -71,6 +71,6 @@ end
在我们的例子中,`9^3``9*9*9`**729** 是从函数中返回的。
![defining a method in Ruby](../Images/93e6343850beeabeec7684474d4b4324.png)
![defining a method in Ruby](img/93e6343850beeabeec7684474d4b4324.png)
* * *
\ No newline at end of file
......@@ -4,7 +4,7 @@
**方法**可以返回值,也可以不返回值。没有规定它们必须返回值。这些方法可以用来显示某种类型的消息。
![When Methods do not return in ruby](../Images/178093d9f9323754ce4abfa9b96d40e6.png)
![When Methods do not return in ruby](img/178093d9f9323754ce4abfa9b96d40e6.png)
这里有一个名为`prompt`的方法,它显示传递给它的消息。我们可以用这个方法显示短消息,从主程序中抽象出代码。我们通过传递**“你好,世界\ n”**来调用这个方法,它会显示消息。
......@@ -16,7 +16,7 @@
使用不返回值的方法的另一个原因是,当您想要创建一个可能必须返回多个值的方法时,或者当您必须对该方法中较大的数据结构进行操作时。
![When Methods do not return in ruby](../Images/dc45453c7e6ef5506e5c1c08d1ed8335.png)
![When Methods do not return in ruby](img/dc45453c7e6ef5506e5c1c08d1ed8335.png)
在这个方法中,我们已经声明并初始化了名为`grade`的数组。我们定义了一个名为`points`的方法,它将用户指定的值添加到数组的每个元素中。此法取<two arguments="" an="">阵和**另一变量**</two>
......@@ -28,6 +28,6 @@ arr.map! { |grade| grade+= grace }
这里,对于每个实例,它将数组的元素存储在变量`grade`中,并将值`grace`添加到其中。第一次迭代时, **60** 存储在`grade`中,`grace`的值为 **5** (调用函数时传递)被添加到数组`grades`的元素中。因此,当我们使用`each`迭代器打印等级时,显示等级数组元素的值。
![When Methods do not return in ruby](../Images/40de90ef51133739da0d6e014af468f2.png)
![When Methods do not return in ruby](img/40de90ef51133739da0d6e014af468f2.png)
* * *
\ No newline at end of file
......@@ -6,13 +6,13 @@
A `class`就像一个蓝图,允许你创建对象,并创建与这些对象相关的方法。例如,您可以使用形状类来制作不同的形状,如**矩形****正方形****圆形**等。一个`object`就是一个`class`的例子。
![Class Hierarchy in Ruby](../Images/35fcc1178b6ab758c478e53e380d6dba.png)
![Class Hierarchy in Ruby](img/35fcc1178b6ab758c478e53e380d6dba.png)
**等级体系**
`Ruby`有很多班。并非所有的类都包含在这个层次结构中。**类基本对象**是所有类中的**超类**
![Checking Super Class in Ruby](../Images/cb1cb014954599f93ecc488a24886d1e.png)
![Checking Super Class in Ruby](img/cb1cb014954599f93ecc488a24886d1e.png)
我们已经将局部变量**值**设置为一个字符串。当我们通过调用**来检查****的等级时。类**方法,它告诉我们 **val** 的类是 String。然后,当我们检查字符串的超类时,通过调用**。超类方法**它告诉我们`Object`等等。
......@@ -26,7 +26,7 @@ The reason the last value is nil is because the class BasicObject has no supercl
`Ruby`中的一个类以关键字`class`开头,后面跟着类的名称。
![Creating a class in Ruby](../Images/7495cce8e031fbafba31700194799122.png)
![Creating a class in Ruby](img/7495cce8e031fbafba31700194799122.png)
* * *
......@@ -42,7 +42,7 @@ obj1 = Shape.new
**类**的另一个例子:
![Creating a objects in Ruby](../Images/7b2737d89994fae81310d4f2d3284860.png)
![Creating a objects in Ruby](img/7b2737d89994fae81310d4f2d3284860.png)
在上面的程序中,我们创建了一个名为**名为**的类。
......@@ -50,7 +50,7 @@ obj1 = Shape.new
这是程序的输出:
![Creating a class & objects in Ruby](../Images/0e7f986e39bb335eb39a6af484e3365a.png)
![Creating a class & objects in Ruby](img/0e7f986e39bb335eb39a6af484e3365a.png)
使用**到 _s 方法**的另一个例子:
......@@ -58,15 +58,15 @@ obj1 = Shape.new
to_s (to string) method allows us to display the state of the object. State refers to all the data that is being stored in the class objects.
```
![Creating a class & objects in Ruby](../Images/ae39bddaa2a4c4cf48fcfb538593dedc.png)
![Creating a class & objects in Ruby](img/ae39bddaa2a4c4cf48fcfb538593dedc.png)
程序的输出是:
![Creating a class & objects in Ruby](../Images/c013159d7c70000fbeaba1e00ee2e955.png)
![Creating a class & objects in Ruby](img/c013159d7c70000fbeaba1e00ee2e955.png)
当我们将程序的最后一行改为**时,打印 obj1** 。这里我们是字面上的打印对象,让我们看看这个变化后的输出:
![Creating a class & objects in Ruby](../Images/443296e3210ec75490a3c01132fc42c8.png)
![Creating a class & objects in Ruby](img/443296e3210ec75490a3c01132fc42c8.png)
所以,当打印对象时,自动调用`to_s method`。此方法可用于通过在任何特定时间显示对象的状态来调试或测试代码。
......@@ -76,23 +76,23 @@ to_s (to string) method allows us to display the state of the object. State refe
我们还可以编写方法来检查对象的单个字段或属性。
![Accessing the attributes of a class](../Images/4076c4023d51deca6b16e87f0bd9693f.png)
![Accessing the attributes of a class](img/4076c4023d51deca6b16e87f0bd9693f.png)
您必须使用**属性/字段**的名称来定义方法。这里我们已经为领域**首先**创建了一个方法。使用`object name`调用该方法。
程序的输出是:
![Accessing the attributes of a class](../Images/2473561aaaf67dc2bd086af9c5c383b8.png)
![Accessing the attributes of a class](img/2473561aaaf67dc2bd086af9c5c383b8.png)
同样,我们可以检查对象的每个属性。我们可以用另一种简单的方法做到这一点。
![Accessing the attributes of a class](../Images/c31f465d93aefca4ac64b5bba4eea49c.png)
![Accessing the attributes of a class](img/c31f465d93aefca4ac64b5bba4eea49c.png)
属性可以通过以下语句来检查 **attr_Reader:第一个,:中间,:最后一个**。该方法返回使用`print`方法打印的对象的属性值。
程序的输出是:
![Accessing the attributes of a class](../Images/5718a2c13d8e8f08e767f9fc8ba6654f.png)
![Accessing the attributes of a class](img/5718a2c13d8e8f08e767f9fc8ba6654f.png)
* * *
......@@ -104,11 +104,11 @@ to_s (to string) method allows us to display the state of the object. State refe
attr_writer :first, :middle, :last
```
![Writing the attributes of a class](../Images/e728956f484df2df1b2c2c88d95835d9.png)
![Writing the attributes of a class](img/e728956f484df2df1b2c2c88d95835d9.png)
这里,我们修改了对象 **obj1** 的实例变量。程序的输出是:
![Writing the attributes of a class](../Images/27e68d7edcc9a4a5252b004e8b9f3e32.png)
![Writing the attributes of a class](img/27e68d7edcc9a4a5252b004e8b9f3e32.png)
这里可以看到**第一个****中间****最后一个**值被修改打印。
......
......@@ -4,7 +4,7 @@
**正则表达式**基本上是用来处理 ruby 中的字符/文本模式的。
![Regular Expressions in Ruby](../Images/3f9f5938114741b7b89dffbfd5d81851.png)
![Regular Expressions in Ruby](img/3f9f5938114741b7b89dffbfd5d81851.png)
`sub()`方法不是正则表达式。但是它解释了何时使用正则表达式。它用用户指定的其他字符串替换字符串的一部分。它包含两个参数,第一个参数是要被**取代**`substring`,第二个参数是要被取代的`substring`
......@@ -16,11 +16,11 @@ puts "badjohnny".sub('bad','good')
它用`good`代替`bad`。但是它不会替换子字符串的所有实例。
![Regular Expressions in Ruby](../Images/7c9c6d5a997ca1087b9ac002d05debb1.png)
![Regular Expressions in Ruby](img/7c9c6d5a997ca1087b9ac002d05debb1.png)
您可以看到它只替换了子字符串**坏的**的第一个实例。使用`gsub()`方法替换子串的所有实例。
![Regular Expressions in Ruby](../Images/52a3b7841d12420320e1af4e850caf2b.png)
![Regular Expressions in Ruby](img/52a3b7841d12420320e1af4e850caf2b.png)
像这样的事情可以在**正则表达式**中完成。
......@@ -28,7 +28,7 @@ puts "badjohnny".sub('bad','good')
## 鲁比:正则表达式
![Regular Expressions in Ruby](../Images/d602fcacde1b378c7db261d13621e7bc.png)
![Regular Expressions in Ruby](img/d602fcacde1b378c7db261d13621e7bc.png)
变量`a`有值**“嘿,你想要什么?”**。如果你想把**“嘿”**换成**“打扰一下”**,那你可以用正则表达式。如前所述,`sub()`方法有两个参数。我们必须用我们想要的字符串替换前三个字符。
......@@ -38,7 +38,7 @@ puts "badjohnny".sub('bad','good')
现在,它所做的是,从开始匹配 3 个字符,在我们的例子中是**“嘿”**,并用用户指定的字符串替换它。
![Regular Expressions in Ruby](../Images/5ef09e009250c7b7d20bbf8cbfba7647.png)
![Regular Expressions in Ruby](img/5ef09e009250c7b7d20bbf8cbfba7647.png)
* * *
......@@ -48,7 +48,7 @@ puts "badjohnny".sub('bad','good')
正则表达式`(/.../)`读取三个字符,并将其临时存储在变量 **x** 中,使用该值我们可以进行所需的操作。如前所述,点代表任何字符,因此它可以读取任何三个字符(包括空格)。我们刚刚打印了 **x** 的数值。
![Scan method in Ruby](../Images/7bc4bb8ae1aa73fcefb6a02851289c94.png)
![Scan method in Ruby](img/7bc4bb8ae1aa73fcefb6a02851289c94.png)
在正则表达式中,我们使用了`'\S'``\S`为非空白字符。可以是**号**或任何**字母**。我们给出了三个 **\S\S\S** ,它遍历变量,找到三个非空白字符,存储在变量 **x** 中。
......
......@@ -8,21 +8,21 @@
## 红宝石:例外的例子
![Exception Handling in Ruby](../Images/4f0461a482c9e61a57b8e69d28738d20.png)
![Exception Handling in Ruby](img/4f0461a482c9e61a57b8e69d28738d20.png)
在上面的程序中,我们试图用零除一个数。运行程序时,它会给出以下结果:
![Exception Handling in Ruby](../Images/c01bc497b0d5a920878bbfc9ba3748e7.png)
![Exception Handling in Ruby](img/c01bc497b0d5a920878bbfc9ba3748e7.png)
出现一个`ZeroDivisionError`是因为我们试图用一个数字除以**零**,而这个操作在 **Ruby** 中没有定义。
让我们看另一个例子:
![Exception Handling in Ruby](../Images/2fc4ab76cd6ac32eb17972ed02cdbb0d.png)
![Exception Handling in Ruby](img/2fc4ab76cd6ac32eb17972ed02cdbb0d.png)
以下是上述程序的结果:
![Exception Handling in Ruby](../Images/e773beb8d7d50d98471dc776cd313606.png)
![Exception Handling in Ruby](img/e773beb8d7d50d98471dc776cd313606.png)
当我们执行这个程序时,我们会得到一个**错误(没有这样的文件或目录)**,因为程序试图打开磁盘中不存在的文件。同样,当我们键入程序时,编译器无法知道该文件是否存在。
......@@ -32,17 +32,17 @@
## 鲁比:处理异常
![Exception Handling in Ruby](../Images/b5e846fc870d59d45af6bd86d0bf4490.png)
![Exception Handling in Ruby](img/b5e846fc870d59d45af6bd86d0bf4490.png)
当我们为分母输入 **0** 时,我们得到除以零的结果。
![Exception Handling in Ruby](../Images/bbe16152d7eb89c5026a6c762d2ddf21.png)
![Exception Handling in Ruby](img/bbe16152d7eb89c5026a6c762d2ddf21.png)
我们必须隔离导致`exception`的代码。因此,如果出现异常,我们可以将控制转移到处理该异常的程序的另一部分。
我们是这样做的:
![Exception Handling in Ruby](../Images/a9fbea9279f45fbcafadec291f15912f.png)
![Exception Handling in Ruby](img/a9fbea9279f45fbcafadec291f15912f.png)
导致异常的代码写在`begin`块中,`rescue`块包含处理异常的代码。当`begin`块中的代码引发异常时,控制自动转移到`rescue`块,然后救援块中的代码执行,程序终止。
......@@ -50,7 +50,7 @@
上述程序的输出是:
![Exception Handling in Ruby](../Images/8fafb9c6e8ba934f5a407e294a3bb858.png)
![Exception Handling in Ruby](img/8fafb9c6e8ba934f5a407e294a3bb858.png)
当输入分母值 **0** 时,`exception`升高,控制转移到`rescue`块,并执行语句。它打印异常并提示为分母输入另一个值,然后执行操作,程序终止。这里程序不**崩溃**也不**完全停止**。但是这并不是这个问题的完美解决方案,因为当用户再次输入数值 **0** 时,会导致`exception`再次被处理。我们必须使用**循环**以完美的方式处理`exception`
......@@ -60,43 +60,43 @@
当一段代码引发`multiple exception`时,我们必须以不同的方式处理它。例如,考虑下面的代码
![Handling Multiple Exceptions in Ruby](../Images/92f905cb643caf4004b28607f5f196a8.png)
![Handling Multiple Exceptions in Ruby](img/92f905cb643caf4004b28607f5f196a8.png)
`begin`块包含引发**“被零除”**异常以及**“文件未找到异常”**的语句。我们只处理了**“除零”**异常。
现在,考虑一下这段代码:
![Handling Multiple Exceptions in Ruby](../Images/8568287dedada029933b8f74d1bb521a.png)
![Handling Multiple Exceptions in Ruby](img/8568287dedada029933b8f74d1bb521a.png)
这里处理**“除零”**异常,没有用。因此,在**多个异常**的情况下,我们必须特别注意异常的处理。
![Handling Multiple Exceptions in Ruby](../Images/46e04a42788462653d96820597dd78bb.png)
![Handling Multiple Exceptions in Ruby](img/46e04a42788462653d96820597dd78bb.png)
这里处理所有类型的异常。我们可以通过使用异常的名称来处理特定的异常。
![Handling Multiple Exceptions in Ruby](../Images/b6e6dd583a782a57ea492f8168f70c5b.png)
![Handling Multiple Exceptions in Ruby](img/b6e6dd583a782a57ea492f8168f70c5b.png)
我们通过指定名称处理了`ZeroDivisonError`异常。
![Handling Multiple Exceptions in Ruby](../Images/aef9a722fba69fbdd628c300922e4338.png)
![Handling Multiple Exceptions in Ruby](img/aef9a722fba69fbdd628c300922e4338.png)
我们也可以有**多个救援区块**来处理每个**异常**
![Handling Multiple Exceptions in Ruby](../Images/a5c1091833b70367ceab6231fd093838.png)
![Handling Multiple Exceptions in Ruby](img/a5c1091833b70367ceab6231fd093838.png)
我们有两个`rescue`区块,一个用来处理`ZeroDivisionError`,另一个用来处理未知的`exception`。像`ZeroDivisionError`这样的未发现异常的文件没有特定的异常名称。但是我们可以用`SystemCallError`例外来处理一般的例外情况。
![Handling Multiple Exceptions in Ruby](../Images/4c6b82c123d26c637a46d2feb56601b9.png)
![Handling Multiple Exceptions in Ruby](img/4c6b82c123d26c637a46d2feb56601b9.png)
![Handling Multiple Exceptions in Ruby](../Images/2e0b59f39dc36d6fb41ab4096ff7022e.png)
![Handling Multiple Exceptions in Ruby](img/2e0b59f39dc36d6fb41ab4096ff7022e.png)
当发生一般异常情况时,控制转移到第二`rescue`块处理`exception`。我们还可以将异常消息存储在变量中。像这样,
![Handling Multiple Exceptions in Ruby](../Images/6931114585503c2737c08f52663ed3b3.png)
![Handling Multiple Exceptions in Ruby](img/6931114585503c2737c08f52663ed3b3.png)
输出结果是:
![Handling Multiple Exceptions in Ruby](../Images/19ce53920640a938bcb350a559b30b31.png)
![Handling Multiple Exceptions in Ruby](img/19ce53920640a938bcb350a559b30b31.png)
异常`ZeroDivisionError`的实际错误信息存储在变量**零**中,我们打印该变量。
......@@ -106,11 +106,11 @@
我们可以在 Ruby 中创建自己的异常来处理 Ruby 无法识别的**错误****使用`raise`关键字创建用户定义的异常**
![Raising own Exceptions in Ruby](../Images/adfd354890bc2a310ed4e749ef2be0aa.png)
![Raising own Exceptions in Ruby](img/adfd354890bc2a310ed4e749ef2be0aa.png)
程序的输出是:
![Raising own Exceptions in Ruby](../Images/8d07c850e77c1afd05250bd04c46766f.png)
![Raising own Exceptions in Ruby](img/8d07c850e77c1afd05250bd04c46766f.png)
这里,执行第一条语句,我们已经提出了我们的**异常**。但是最后一条语句没有打印出来,因为当**异常**出现时,程序完全终止。
......
......@@ -10,11 +10,11 @@
**读文件**在 Ruby 中比其他语言非常简单。
![Reading Files in Ruby](../Images/59ef8c47589d3d638b0eece8d25cdcc9.png)
![Reading Files in Ruby](img/59ef8c47589d3d638b0eece8d25cdcc9.png)
这是名为`sample.txt`的文件的内容。现在,我们将阅读这个文件的内容。
![Reading Files in Ruby](../Images/170e1a66fd55e0c4803a1435f3eda30a.png)
![Reading Files in Ruby](img/170e1a66fd55e0c4803a1435f3eda30a.png)
这段小代码可以读取任何文件的内容。你可能会困惑于文件名没有**声明**。我们可以在运行程序时在`Command Prompt`中指定文件名。
......@@ -24,17 +24,17 @@ We run by: ruby files.rb sample.txt
输出如下:
![Reading Files in Ruby](../Images/21612c962de21bda949c7667b85ec62f.png)
![Reading Files in Ruby](img/21612c962de21bda949c7667b85ec62f.png)
这是读取文件的一种方法。我们也可以通过在程序中指定文件名来读取文件。像这样:
![Reading Files in Ruby](../Images/10aa734e76fed552ea779e7933d07daf.png)
![Reading Files in Ruby](img/10aa734e76fed552ea779e7933d07daf.png)
这里,我们使用`open`方法打开文件。变量**文件**在这里充当**文件处理程序**。因此,对于每一行,我们使用`variable`文件调用`gets`方法,并将其存储在变量行中,使用`puts`方法打印。
程序的输出是:
![Reading Files in Ruby](../Images/9b8630a7463c2f4191b630bc10103c11.png)
![Reading Files in Ruby](img/9b8630a7463c2f4191b630bc10103c11.png)
* * *
......@@ -42,7 +42,7 @@ We run by: ruby files.rb sample.txt
我们必须使用`new`方法创建一个`File object`来从文件中读取数据或将数据写入文件。
![Writing Files in Ruby](../Images/7c7c135e4082b4756dd359a81f85bb9d.png)
![Writing Files in Ruby](img/7c7c135e4082b4756dd359a81f85bb9d.png)
这里 **fil** 是使用`new`方法创建的文件对象。新方法有两个参数,第一个参数是文件的`name`,第二个参数是`mode``w`代表文件的**写入模式**。我们使用带有`print``puts`方法的文件对象`fil`来直接写入文件。
......@@ -50,12 +50,12 @@ We run by: ruby files.rb sample.txt
程序的输出是:
![Writing Files in Ruby](../Images/29991e00626ec45c7d79c135565572f2.png)
![Writing Files in Ruby](img/29991e00626ec45c7d79c135565572f2.png)
实际上,当我们执行程序时,什么也不会发生。但是当我们查看**文件**时,内容是写在文件中的。这是另一个例子,
![Writing Files in Ruby](../Images/f9a0100f714163867e2dcce6664e4d6c.png)
![Writing Files in Ruby](img/f9a0100f714163867e2dcce6664e4d6c.png)
![Writing Files in Ruby](../Images/d0833a1dbff20d2b0d9ff1715a11ffdb.png)
![Writing Files in Ruby](img/d0833a1dbff20d2b0d9ff1715a11ffdb.png)
* * *
\ No newline at end of file
......@@ -20,7 +20,7 @@
这种模式在游戏开发的早期(1980 年代到 1990 年代中期)非常流行,因为在整个开发过程中需求是不变的。但是现在,需求每天都在变化,因此遵循这种模式不是一个好的选择。它可以用于小游戏项目。
![Waterfall Game Development Model](../Images/17eab09a16669cc48c94e38d62ce4987.png)
![Waterfall Game Development Model](img/17eab09a16669cc48c94e38d62ce4987.png)
* * *
......@@ -28,7 +28,7 @@
这是一个灵活的模型。螺旋模型有一个重复的方法,以循环的方式前进,项目以**螺旋**的形式一遍又一遍地经历四个阶段,直到完成,因此允许几轮细化。
![Spiral Game Development Model](../Images/e5d07aedb169c05d40d962d9be3701ff.png)
![Spiral Game Development Model](img/e5d07aedb169c05d40d962d9be3701ff.png)
在游戏开发中,螺旋生命周期模型的典型步骤是:
......@@ -51,7 +51,7 @@
这里不是从完全已知的需求开始,您还可以在迭代之后开始实现一组软件需求、测试、评估和插入进一步的需求。在每一次迭代中,都会产生新的游戏版本。这种冲洗和重复一直持续到整个项目准备就绪。
![Iterative Game Development Model](../Images/6fdd9f8c5b24635e85723f1a6c5887bc.png)
![Iterative Game Development Model](img/6fdd9f8c5b24635e85723f1a6c5887bc.png)
* * *
......
......@@ -14,7 +14,7 @@
游戏的架构和结构类似于软件。但是它确实有一些额外的组件,这使得它不同于软件。每个游戏都有以下组件:
![Game Development Architecture](../Images/64845b00bd72a33944047ec7aab7cfa0.png)
![Game Development Architecture](img/64845b00bd72a33944047ec7aab7cfa0.png)
* 图形引擎
* 声音/音频引擎
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册