diff --git a/sources/tech/20190402 Using Square Brackets in Bash- Part 2.md b/sources/tech/20190402 Using Square Brackets in Bash- Part 2.md
deleted file mode 100644
index cfab28025a..0000000000
--- a/sources/tech/20190402 Using Square Brackets in Bash- Part 2.md
+++ /dev/null
@@ -1,168 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (HankChow)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Using Square Brackets in Bash: Part 2)
-[#]: via: (https://www.linux.com/blog/learn/2019/4/using-square-brackets-bash-part-2)
-[#]: author: (Paul Brown https://www.linux.com/users/bro66)
-
-Using Square Brackets in Bash: Part 2
-======
-
-![square brackets][1]
-
-We continue our tour of square brackets in Bash with a look at how they can act as a command.
-
-[Creative Commons Zero][2]
-
-Welcome back to our mini-series on square brackets. In the [previous article][3], we looked at various ways square brackets are used at the command line, including globbing. If you've not read that article, you might want to start there.
-
-Square brackets can also be used as a command. Yep, for example, in:
-
-```
-[ "a" = "a" ]
-```
-
-which is, by the way, a valid command that you can execute, `[ ... ]` is a command. Notice that there are spaces between the opening bracket `[` and the parameters `"a" = "a"`, and then between the parameters and the closing bracket `]`. That is precisely because the brackets here act as a command, and you are separating the command from its parameters.
-
-You would read the above line as " _test whether the string "a" is the same as string "a"_ ". If the premise is true, the `[ ... ]` command finishes with an exit status of 0. If not, the exit status is 1. [We talked about exit statuses in a previous article][4], and there you saw that you could access the value by checking the `$?` variable.
-
-Try it out:
-
-```
-[ "a" = "a" ]
-echo $?
-```
-
-And now try:
-
-```
-[ "a" = "b" ]
-echo $?
-```
-
-In the first case, you will get a 0 (the premise is true), and running the second will give you a 1 (the premise is false). Remember that, in Bash, an exit status from a command that is 0 means it exited normally with no errors, and that makes it `true`. If there were any errors, the exit value would be a non-zero value (`false`). The `[ ... ]` command follows the same rules so that it is consistent with the rest of the other commands.
-
-The `[ ... ]` command comes in handy in `if ... then` constructs and also in loops that require a certain condition to be met (or not) before exiting, like the `while` and `until` loops.
-
-The logical operators for testing stuff are pretty straightforward:
-
-```
-[ STRING1 = STRING2 ] => checks to see if the strings are equal
-[ STRING1 != STRING2 ] => checks to see if the strings are not equal
-[ INTEGER1 -eq INTEGER2 ] => checks to see if INTEGER1 is equal to INTEGER2
-[ INTEGER1 -ge INTEGER2 ] => checks to see if INTEGER1 is greater than or equal to INTEGER2
-[ INTEGER1 -gt INTEGER2 ] => checks to see if INTEGER1 is greater than INTEGER2
-[ INTEGER1 -le INTEGER2 ] => checks to see if INTEGER1 is less than or equal to INTEGER2
-[ INTEGER1 -lt INTEGER2 ] => checks to see if INTEGER1 is less than INTEGER2
-[ INTEGER1 -ne INTEGER2 ] => checks to see if INTEGER1 is not equal to INTEGER2
-etc...
-```
-
-You can also test for some very shell-specific things. The `-f` option, for example, tests whether a file exists or not:
-
-```
-for i in {000..099}; \
- do \
- if [ -f file$i ]; \
- then \
- echo file$i exists; \
- else \
- touch file$i; \
- echo I made file$i; \
- fi; \
-done
-```
-
-If you run this in your test directory, line 3 will test to whether a file is in your long list of files. If it does exist, it will just print a message; but if it doesn't exist, it will create it, to make sure the whole set is complete.
-
-You could write the loop more compactly like this:
-
-```
-for i in {000..099};\
-do\
- if [ ! -f file$i ];\
- then\
- touch file$i;\
- echo I made file$i;\
- fi;\
-done
-```
-
-The `!` modifier in the condition inverts the premise, thus line 3 would translate to " _if the file`file$i` does not exist_ ".
-
-Try it: delete some random files from the bunch you have in your test directory. Then run the loop shown above and watch how it rebuilds the list.
-
-There are plenty of other tests you can try, including `-d` tests to see if the name belongs to a directory and `-h` tests to see if it is a symbolic link. You can also test whether a files belongs to a certain group of users (`-G`), whether one file is older than another (`-ot`), or even whether a file contains something or is, on the other hand, empty.
-
-Try the following for example. Add some content to some of your files:
-
-```
-echo "Hello World" >> file023
-echo "This is a message" >> file065
-echo "To humanity" >> file010
-```
-
-and then run this:
-
-```
-for i in {000..099};\
-do\
- if [ ! -s file$i ];\
- then\
- rm file$i;\
- echo I removed file$i;\
- fi;\
-done
-```
-
-And you'll remove all the files that are empty, leaving only the ones you added content to.
-
-To find out more, check the manual page for the `test` command (a synonym for `[ ... ]`) with `man test`.
-
-You may also see double brackets (`[[ ... ]]`) sometimes used in a similar way to single brackets. The reason for this is because double brackets give you a wider range of comparison operators. You can use `==`, for example, to compare a string to a pattern instead of just another string; or < and `>` to test whether a string would come before or after another in a dictionary.
-
-To find out more about extended operators [check out this full list of Bash expressions][5].
-
-### Next Time
-
-In an upcoming article, we'll continue our tour and take a look at the role of parentheses `()` in Linux command lines. See you then!
-
-_Read more:_
-
- 1. [The Meaning of Dot (`.`)][6]
- 2. [Understanding Angle Brackets in Bash (`<...>`)][7]
- 3. [More About Angle Brackets in Bash(`<` and `>`)][8]
- 4. [And, Ampersand, and & in Linux (`&`)][9]
- 5. [Ampersands and File Descriptors in Bash (`&`)][10]
- 6. [Logical & in Bash (`&`)][4]
- 7. [All about {Curly Braces} in Bash (`{}`)][11]
- 8. [Using Square Brackets in Bash: Part 1][3]
-
-
-
---------------------------------------------------------------------------------
-
-via: https://www.linux.com/blog/learn/2019/4/using-square-brackets-bash-part-2
-
-作者:[Paul Brown][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.linux.com/users/bro66
-[b]: https://github.com/lujun9972
-[1]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/square-brackets-3734552_1920.jpg?itok=hv9D6TBy (square brackets)
-[2]: /LICENSES/CATEGORY/CREATIVE-COMMONS-ZERO
-[3]: https://www.linux.com/blog/2019/3/using-square-brackets-bash-part-1
-[4]: https://www.linux.com/blog/learn/2019/2/logical-ampersand-bash
-[5]: https://www.gnu.org/software/bash/manual/bashref.html#Bash-Conditional-Expressions
-[6]: https://www.linux.com/blog/learn/2019/1/linux-tools-meaning-dot
-[7]: https://www.linux.com/blog/learn/2019/1/understanding-angle-brackets-bash
-[8]: https://www.linux.com/blog/learn/2019/1/more-about-angle-brackets-bash
-[9]: https://www.linux.com/blog/learn/2019/2/and-ampersand-and-linux
-[10]: https://www.linux.com/blog/learn/2019/2/ampersands-and-file-descriptors-bash
-[11]: https://www.linux.com/blog/learn/2019/2/all-about-curly-braces-bash
diff --git a/translated/tech/20190402 Using Square Brackets in Bash- Part 2.md b/translated/tech/20190402 Using Square Brackets in Bash- Part 2.md
new file mode 100644
index 0000000000..70652f894c
--- /dev/null
+++ b/translated/tech/20190402 Using Square Brackets in Bash- Part 2.md
@@ -0,0 +1,158 @@
+[#]: collector: (lujun9972)
+[#]: translator: (HankChow)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Using Square Brackets in Bash: Part 2)
+[#]: via: (https://www.linux.com/blog/learn/2019/4/using-square-brackets-bash-part-2)
+[#]: author: (Paul Brown https://www.linux.com/users/bro66)
+
+在 Bash 中使用[方括号](二)
+======
+
+![square brackets][1]
+
+> 我们继续来看方括号的用法,它们甚至还可以在 Bash 当中作为一个命令使用。
+
+[Creative Commons Zero][2]
+
+欢迎回到我们的方括号专题。在[前一篇文章][3]当中,我们介绍了方括号在命令行中可以用于通配操作,如果你已经读过前一篇文章,就可以从这里继续了。
+
+方括号还可以以一个命令的形式使用,就像这样:
+
+```
+[ "a" = "a" ]
+```
+
+上面这种 `[ ... ]` 的形式就可以看成是一个可执行的命令。要注意,方括号内部的内容 `"a" = "a"` 和方括号 `[`、`]` 之间是有空格隔开的。因为这里的方括号被视作一个命令,因此要用空格将命令和它的参数隔开。
+
+上面这个命令的含义是“判断字符串 `"a"` 和字符串 `"a"` 是否相同”,如果判断结果为真,那么 `[ ... ]` 就会以状态码 0 退出,否则以状态码 1 退出。在之前的文章中,我们也有介绍过状态码的概念,可以通过 `$?` 变量获取到最近一个命令的状态码。
+
+分别执行
+
+```
+[ "a" = "a" ]
+echo $?
+```
+
+以及
+
+```
+[ "a" = "b" ]
+echo $?
+```
+
+这两段命令中,前者会输出 0(判断结果为真),后者则会输出 1(判断结果为假)。在 Bash 当中,如果一个命令的状态码是 0,表示这个命令正常执行完成并退出,而且其中没有出现错误,对应布尔值 `true`;如果在命令执行过程中出现错误,就会返回一个非零的状态码,对应布尔值 `false`。而 `[ ... ]`也同样遵循这样的规则。
+
+因此,`[ ... ]` 很适合在 `if ... then`、`while` 或 `until` 这种在代码块结束前需要判断是否达到某个条件结构中使用。
+
+对应使用的逻辑判断运算符也相当直观:
+
+```
+[ STRING1 = STRING2 ] => checks to see if the strings are equal
+[ STRING1 != STRING2 ] => checks to see if the strings are not equal
+[ INTEGER1 -eq INTEGER2 ] => checks to see if INTEGER1 is equal to INTEGER2
+[ INTEGER1 -ge INTEGER2 ] => checks to see if INTEGER1 is greater than or equal to INTEGER2
+[ INTEGER1 -gt INTEGER2 ] => checks to see if INTEGER1 is greater than INTEGER2
+[ INTEGER1 -le INTEGER2 ] => checks to see if INTEGER1 is less than or equal to INTEGER2
+[ INTEGER1 -lt INTEGER2 ] => checks to see if INTEGER1 is less than INTEGER2
+[ INTEGER1 -ne INTEGER2 ] => checks to see if INTEGER1 is not equal to INTEGER2
+etc...
+```
+
+方括号的这种用法也可以很有 shell 风格,例如通过带上 `-f` 参数可以判断某个文件是否存在:
+
+```
+for i in {000..099}; \
+ do \
+ if [ -f file$i ]; \
+ then \
+ echo file$i exists; \
+ else \
+ touch file$i; \
+ echo I made file$i; \
+ fi; \
+done
+```
+
+如果你在上一篇文章使用到的测试目录中运行以上这串命令,其中的第 3 行会判断那几十个文件当中的某个文件是否存在。如果文件存在,会输出一条提示信息;如果文件不存在,就会把对应的文件创建出来。最终,这个目录中会完整存在从 `file000` 到 `file099` 这一百个文件。
+
+上面这段命令还可以写得更加简洁:
+
+```
+for i in {000..099};\
+do\
+ if [ ! -f file$i ];\
+ then\
+ touch file$i;\
+ echo I made file$i;\
+ fi;\
+done
+```
+
+其中 `!` 运算符表示将判断结果取反,因此第 3 行的含义就是“如果文件 `file$i` 不存在”。
+
+可以尝试一下将测试目录中那几十个文件随意删除几个,然后运行上面的命令,你就可以看到它是如何把被删除的文件重新创建出来的。
+
+除了 `-f` 之外,还有很多有用的参数。`-d` 参数可以判断某个目录是否存在,`-h` 参数可以判断某个文件是不是一个符号链接。可以用 `-G` 参数判断某个文件是否属于某个用户组,用 `-ot` 参数判断某个文件的最后更新时间是否早于另一个文件,甚至还可以判断某个文件是否为空文件。
+
+运行下面的几条命令,可以向几个文件中写入一些内容:
+
+```
+echo "Hello World" >> file023
+echo "This is a message" >> file065
+echo "To humanity" >> file010
+```
+
+然后运行:
+
+```
+for i in {000..099};\
+do\
+ if [ ! -s file$i ];\
+ then\
+ rm file$i;\
+ echo I removed file$i;\
+ fi;\
+done
+```
+
+你就会发现所有空文件都被删除了,只剩下少数几个非空的文件。
+
+如果你还想了解更多别的参数,可以执行 `man test` 来查看 `test` 命令的 man 手册(`test` 是 `[ ... ]` 的命令别名)。
+
+有时候你还会看到 `[[ ... ]]` 这种双方括号的形式,使用起来和单方括号差别不大。但双方括号支持的比较运算符更加丰富:例如可以使用 `==` 来判断某个字符串是否符合某个模式,也可以使用 `<`、`>` 来判断两个字符串的出现顺序。
+
+可以在 [Bash 表达式文档][5]中了解到双方括号支持的更多运算符。
+
+### 下一集
+
+在下一篇文章中,我们会开始介绍圆括号 `()` 在 Linux 命令行中的用法,敬请关注!
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/learn/2019/4/using-square-brackets-bash-part-2
+
+作者:[Paul Brown][a]
+选题:[lujun9972][b]
+译者:[HankChow](https://github.com/HankChow)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linux.com/users/bro66
+[b]: https://github.com/lujun9972
+[1]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/square-brackets-3734552_1920.jpg?itok=hv9D6TBy "square brackets"
+[2]: /LICENSES/CATEGORY/CREATIVE-COMMONS-ZERO
+[3]: https://www.linux.com/blog/2019/3/using-square-brackets-bash-part-1
+[4]: https://www.linux.com/blog/learn/2019/2/logical-ampersand-bash
+[5]: https://www.gnu.org/software/bash/manual/bashref.html#Bash-Conditional-Expressions
+[6]: https://www.linux.com/blog/learn/2019/1/linux-tools-meaning-dot
+[7]: https://www.linux.com/blog/learn/2019/1/understanding-angle-brackets-bash
+[8]: https://www.linux.com/blog/learn/2019/1/more-about-angle-brackets-bash
+[9]: https://www.linux.com/blog/learn/2019/2/and-ampersand-and-linux
+[10]: https://www.linux.com/blog/learn/2019/2/ampersands-and-file-descriptors-bash
+[11]: https://www.linux.com/blog/learn/2019/2/all-about-curly-braces-bash
+