我不会在此谈及太多关于 job 控制的内容,然则:你可以像下面如许启动后台过程
昨天我和一些同伙聊起Bash,我意识到:即使我已经应用Bash十多年了,如今还有一些基本的杂项,我懂得的并不是很清楚。 像往常一样,我认为我应当写一个博文。

我们会包含:
-
一些bash基本常识(“你怎么写一个for轮回”)
-
bash脚本安然提示(“老是应用set -u”)
如不雅你编写shell脚本,并且你没有浏览这篇文┞仿中其他任何内容,你应当知道有一个shell脚本校验对象(linter),叫做 shellcheck 。应用它来使您的shell脚本更好!
我们会像评论辩论编程说话一样评论辩论bash,因为,怎么说呢,它就是。 这篇文┞仿的目标不是bash编程详解。我不会在bash中做复杂的编程,也真的不筹划进修若何去做。 然则,经由今天的思虑之后,我认为明白整顿下bash编程说话的一些基本常识是有效的。bash编程说话与我应用过的其他编程说话有着很大年夜的不合。
我真的曾认为我已经知道这些器械了,然则经由过程写这篇文┞仿我依旧学到了一些器械,也许你也会有所收成。
变量赋值
在bash中变量赋值按照下面的方法:
VARIABLE=2
并且你可以应用$VARIABLE(变量名)来引用变量。须要留意的是不要在=运算符的两边放置空格符,比如VARIABLE= 2、VARIABLE = 2、或者VARIABLE =2,这并不是语法缺点,然则将会做完全不须要的工作(比如试图运行一个名字为2的法度榜样,并精细况变量VARIABLE设置为空字符串)。
Bash变量并不请求全部大年夜写,然则平日是大年夜写的。
大年夜多半你所应用的bash变量都是字符串。在bash中也有一些数组变量,但我并不是完全懂得它们。
应用${}引用变量
有时某些变量,内容为file.txt,并且我想如许应用它:
mv $MYVAR $MYVAR__bak # wrong!
另一个 bash 技能:毫不应用一个没有引用的变量。 看看这个看似合理的 shell 脚本:
这段代码是无法工作的!它会去查找 MYVAR__bak变量,但这并不是一个真实存在的变量。
为了避免类似问题,你须要知道的仅仅是 ${MYVAR}和$MYVAR是一回事。所以你可以如许运行指令:
mv $MYVAR ${MYVAR}__bak # right!全局变量,局部变量和情况变量
Bash有3种变量。我一般先想到(可能也是最常用)的是 情况变量 。
每个 Unix 法度榜样都有一个“返回代码”,它是一个大年夜0到127的┞符数。0表示成功,其他都意味着掉败。 这在 bash 中是有感化的,因为:有时我大年夜敕令交运行一个法度榜样,并欲望仅在第一个法度榜样成功的情况下运行第二个法度榜样。
Linux上的每个过程实际上都有情况变量(您可以运行env查看当前设置的变量),但在Bash中,它们更易于拜访。要查看名为MYVAR的情况变量,可以运行
echo "$MYVAR"
要设置情况变量,您须要应用export关键字:
设置情况变量时,所有子过程将看到该情况变量。所以如不雅你运行export MYVAR=2; python test.py,python法度榜样将MYVAR设置为2。
第二种变量是 全局变量 。同样像膳绫擎那样赋值。
MYVAR=2
在其他编程说话中他们表示得像全局变量。
还有 局部变量 ,它们的感化域只能存在于bash函数中。 我根本上大年夜来没有应用过如许的函数(不像我写的其他编程说话),我大年夜来没有应用过局部变量。
for轮回
以下是我在bash中编写轮回的办法。 此轮回将大年夜1打印到10。
如不雅你测验测验运行这个脚本,你会获得弗成理喻的缺点消息 script.sh: line 3: [: too many arguments. 什么?
for i in `seq 1 10` # you can use {1..10} instead of `seq 1 10` do echo "$i"done如不雅你想用一行代码写这个轮回,可以如许写:
for i in `seq 1 10`; do echo $i; done
我认为这是弗成能记住的(你要怎么记住在 seq 1 10 之后有一个分号,然则在 do 之后却没有了),所以我不会去记它。
你也可以写while轮回,但我大年夜来没有如许写过。
有个很酷的工作是你可以遍历另一个敕令的输出。seq 1 10 将数字大年夜1到10(每行一个)打印,这个for轮回只是提取该输出场遍历它。我就经常用这种办法。
您也可以应用反引号或$()来插入敕令的输出。
OUTPUT=`command`# or OUTPUT=$(command)
if 语句
在 bash 中的 If 语句是相当让人憎恶去记它。你必须放在这些方括号中,而在方括号之间必须有空格,不然它不起感化。[[ 和 [ 方括号(双/单) 都工作。 这里我们真正进入 bash 的奇怪范畴:[ 是一个法度榜样(/usr/bin/[)但 [[ 是 bash 语法。[[ 更好。
if [[ "vulture" = "panda" ]]; then echo expression evaluated as trueelse echo expression evaluated as falsefi
此外,您可以检查“此文件存在”,“此目次存在”等内容。例如,您可以检查文件 /tmp/awesome.txt 是否存在,如下:
If [[ -e /tmp/awesome.txt ]]; then echo "awesome"fi
这平日是有效的,但我必须每次查找语法。
如不雅您想测验测验用敕令行,可以应用 test 敕令,例如 test -e /tmp/awesome.txt 。 它成功会返回0,不然返回缺点。
最后一件事是为什么[[比[好:如不雅你应用[[,那么你可以应用<做比较,它不会变成文件重定向。
$ [ 3 < 4 ] && echo "true"bash: 4: No such file or directory$ [[ 3 < 4 ]] && echo "true"true
推荐阅读
代码绑缚我很早就写过几个关于 Javascript 脚本的绑缚的帖子,人们可能认为我是猖狂的热衷于应用绑缚,然则我认为我是不由自立的,因为它是异常有趣的:-)。有几篇我写的文┞仿是关于实现最>>>详细阅读
本文标题:编写快速安全Bash脚本的建议
地址:http://www.17bianji.com/lsqh/34763.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示