linux基础

Linux 命令速查
学生信,Linux是最最基本的技能,要尽量将自己的工作平台转移到Linux,编程写脚本,这样会极大的提升工作效率,找工作时也不会太怂。Linux所有的任务都是通过命令来完成的,具有高度的统一性。Linux命令多,不可能都会,根据具体需求掌握部分即可。

索引
目录文件管理:pwd/tree/ls/cd/touch/mv/rm/unlink/cp/mkdir/rmdir/

文本操作:less/cat/more/head/tail/ – vi/nano/sed/emacs/ – cut/paste/join/sort/uniq/diff/cmp/nl

文件分隔合并:grep/split/printf/wc/uniq/paste/sort/join

查找:find/grep/wc – which/whereis/locate/

传输:wget/ssh/scp/curl/ftp/lftp/mysql/

系统:top/ps/kill/df/free/qsub/qdel/qstat

权限:chmod/chown/chgrp/file/stat

打包压缩解压:tar/gzip/bzip2

其他:ln/ssh/alias/date/cal/sleep/clear/who/whatis/man/echo/history/nohup/xargs

awk

重定向

管道

多种方法连接Linux(Xshell、putty、VNC)和Windows

shell脚本

PATH环境变量设置

软件安装

软件版本管理,编程环境管理,模块管理

1.反引号
echo ==========start at : date ==========
所有UNIX命令,要取结果或输出,都要用$( )或反引号。参见:shell里的 (){ } expr $(( ))

所以反引号命令就等价于命令输出的字符串

2.&&
echo ==========end at : date ========== &&
&& 只有前面的每一条命令都顺利执行完(没有报错),才可以执行后面一句。如果没有&&,那每一条命令都是独立的,都会执行完。

同理||,只有在左边的命令返回假,右边的命令才会执行,如果左边的顺利执行,则右边的不执行

参见:shell 中 &&和||的方法

lizhixin@login-25-3[23:02:21]:shizhuoxing$ l && echo “hello”
-bash: l: command not found
lizhixin@login-25-3[23:02:38]:shizhuoxing$ ls && echo “hello”
arrow.sh bin Figure IDRM lottery nifty_svm PacBio ProSplign sparc.sh
hello

3.脚本中的0,1,2
echo Still_waters_run_deep 1>&2 &&
参见:shell 1>&2 2>&1 &>filename重定向的含义和区别

0是标准输入,1是标准输出,2是标准错误
[root@redhat box]# ls a.txt b.txt 1>file.out 2>file.err
执行后,没有任何返回值. 原因是, 返回值都重定向到相应的文件中了,而不再前端显示

[root@redhat box]# ls a.txt b.txt 1>file.out 2>&1
1>&2 正确返回值传递给2输出通道 &2表示2输出通道,如果此处错写成 1>2, 就表示把1输出重定向到文件2中.

& 是一个描述符,如果1或2前不加&,会被当成一个普通文件。

4.source setup.sh
看见很多脚本的第一行都是source setup.sh,这是什么意思呢?

参见:Linux中source命令的用法

source命令也称为“点命令”,也就是一个点符号(.)。source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。

还有一个另外一个用途,在对编译系统核心时常常需要输入一长串的命令,可以用source简化。

所以,source setup.sh就是自动的部署了程序运行所需的环境

5.sh.x
sh脚本可以加密成sh.x,参见:shell脚本加密

它的作用是把shell脚本转换为一个可执行的二进制文件,从而达到加密的效果

6.各种符号
参见:shell脚本中一些特殊符号

7.运算符
文件比较运算符

-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename可执行,则为真 [ -L /usr/bin/grep ]
filename1-nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1-ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]

字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)

-z string 如果 string长度为零,则为真 [ -z “$myvar” ]
-n string 如果

string长度非零,则为真 [ -n “ m y v a r " ] s t r i n g 1 = s t r i n g 2 如 果 s t r i n g 1 与 s t r i n g 2 相 同 , 则 为 真 [ " myvar" ] string1= string2 如果 string1与 string2相同,则为真 [ " myvar"]string1=string2string1string2["myvar” = “one two three” ]
string1!= string2 如果 string1与 string2不同,则为真 [ “$myvar” != “one two three” ]
算术比较运算符

num1-eq num2 等于 [ 3 -eq $mynum ]
num1-ne num2 不等于 [ 3 -ne $mynum ]
num1-lt num2 小于 [ 3 -lt $mynum ]
num1-le num2 小于或等于 [ 3 -le $mynum ]
num1-gt num2 大于 [ 3 -gt $mynum ]
num1-ge num2 大于或等于 [ 3 -ge $mynum ]

shell中for循环总结

最常用的就是遍历操作某一类文件,比如批量建索引。

for i in ls
do
samtools faidx i d o n e 注 意 : f o r 末 尾 不 需 要 冒 号 ( : ) , 循 环 的 代 码 块 是 由 d o 和 d o n e 来 , 反 引 号 用 来 捕 获 输 出 , 记 住 s h e l l 创 建 变 量 时 不 用 i done 注意:for末尾不需要冒号(:),循环的代码块是由do和done来,反引号用来捕获输出,记住shell创建变量时不用 idonefordodoneshell,而使用变量时则需要加$。

SGE:qsub/qstat/qdel/qhost 任务投递和监控
参考:

Oracle Grid Engine

qsub命令

SGE - qsub使用范例

SGE作业基本用法

qsub是最为稳定的底层任务投递系统,就是把一个脚本投递到集群的计算节点上运行。

注意,只有登录节点才有资格投递任务,计算节点没有权限投递任务,只能执行,所以千万不要在投递的脚本内嵌套投递,会报错的。

下面是我最为常用的投递命令:

qsub -cwd -l vf=5g -P 任务单元 -q 队列名
先逐条解释:

-cwd: 就是 current working directory,从当前的目录开始执行作业,也就是log文件会写到当前目录;如果不加cwd的话,就会默认输出到用户的 home 目录。如果你想指定输出目录的话,就可以使用wd命令,log会输出到你指定的目录。

-l:resource=value, 表明作业运行所需要的资源。可以看到我们后面指定了预估内存 vf=5g,一般不用指定 CPU 数。注意,实际这个没什么卵用,很少有集群能严格限制用户的内存使用,vf 只会影响你投递的效率,有人就会钻空子,尽量把内存往低了投,尽快排上。这一部分其实就是个道德约束。

-P:大型组织里会分团队,分项目,不同的项目需要制定项目名,主要是为了后期方便统计计算资源的消耗,算钱,其实这个命令没卵用。

-q:指定队列名,这个就非常重要了,队列就是计算机的队列,一个队列只有一些特定的计算节点,你投了哪个节点,你就只能用该节点指定的计算资源。

Linux下搜索文件
使用linux系统难免会忘记文件所在的位置,可以使用以下命令对系统中的文件进行搜索。搜索文件的命令为”find“;”locate“;”whereis“;”which“;”type“

linux下最强大的搜索命令为”find“。它的格式为”find <指定目录> <指定条件> <指定动作>“;比如使用find命令搜索在根目录下的所有interfaces文件所在位置,命令格式为”find / -name ‘interfaces’“

使用locate搜索linux系统中的文件,它比find命令快。因为它查询的是数据库(/var/lib/locatedb),数据库包含本地所有的文件信息。使用locate命令在根目录下搜索interfaces文件的命令为”locate interfaces“

使用”whereis“命令可以搜索linux系统中的所有可执行文件即二进制文件。使用whereis命令搜索grep二进制文件的命令为”whereis grep“。

使用which命令查看系统命令是否存在,并返回系统命令所在的位置。使用which命令查看grep命令是否存在以及存在的目录的命令为”which grep“。

使用type命令查看系统中的某个命令是否为系统自带的命令。使用type命令查看cd命令是否为系统自带的命令;查看grep 是否为系统自带的命令。

Linux正则表达式grep
转自:http://www.cnblogs.com/kaituorensheng/p/4236254.html

正则表达式是一种符号表示法,用于识别文本模式。Linux处理正则表达式的主要程序是grep。grep搜索与正则表达式匹配的行,并将结果输送至标准输出。

1.grep匹配模式
grep按下述方式接受选项和参数(其中,regex表示正则表达式)

1

1
grep [options] regex [files]
其中options主要为下表:

选项
含义
功能描述

-i
ignore case
忽略大小写

-v
invert match
不匹配匹配的

-l
file-with-match
输出匹配的文件名

-L
file-without-match
输出不匹配的文件名

-c
count
输出匹配的数目(行数)

-n
number
输出匹配行的同时在前面加上文件名及在文件名中的行数

-h
no-filename
抑制文件名的输出
2.特殊字符
符号
含义
举例

^
开始标记
"^abc"满足的例子abc、abcd

^
非(在[]内)
"[^abc]"满足的例子:ddd、mpd

$
结束标记
”abc$”满足的例子abc、mmabc

.
任意字符
"a.c"满足的例子abc、fapcc

<
匹配单词开始
"

>
匹配单词结束
"abc>"满足的例子abc、pmrabc

|

"AAA|BBB"满足的例子AAA、BBBpp

3.范围
符号
含义
举例

?
匹配前一个字符0或1次
"abc?"满足的例子ab、mabcd

匹配前一个字符≥0次
"abc*"满足的例子abbb、abcdk

匹配前一个字符≥1次
"abc+"满足的例子abcd、abcccdd

{}
{m}、{m,n}、{m,}、{,n}分别为匹配前一个字符m次、m到n次、≥m次、≤n次
"abc{3,5}"满足的例子abcccc、abcccccc

[]
[]内如果不是范围,选其一;是范围的话,范围内选其一
"m[abc]p"满足的例子acpd;m[1-9]p满足的例子m8pp

()
将候选的所有元素放在()内,用|隔开
"a(1|2|3)bc"满足的例子a1bc、mba3bcd
注意:{}在郑则表达式中需要转移,而{}()不需要。

注意理解{}范围的例子:
$cat del4 | grep “abc{3}”
abccc
abccc
abcccc
abccccc
abccccccc

4.标准字符类
字符类
释义

[:alnum:]
字母和数字,与[A-Za-z0-9]等价

[:word:]
[:alnum:]加上下划线_

[:alpa:]
字母,与[A-Za-z]等价

[:digit:]
数字,与[0-9]等价

[:xdigit:]
十六进制字符,与[0-9A-Fa-f等价]

[:blank:]
空格和制表符

[:graph:]
可见字符,靠扩33~126

[:lower:]
小写字母

[:upper:]
大写字母

[:print:]
可打印字符

[:space:]
空白字符,等价于[\t\r\n\v\f]

[:punct:]
标点符号

[:cntrl:]
ASCII控制码,包括字符0~31以及127

可视化正则表达式
工具:Regexper

df -h ./
du -hs ./
du -h /ifs4/BC_RD/USER/lizhixin/my_project/human_chr22 | grep [[:digit:]+]G

du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][–block-size][–exclude=<目录或文件>] [–max-depth=<目录层数>][–help][–version][目录或文件]

常用参数:

-a或-all 为每个指定文件显示磁盘使用情况,或者为目录中每个文件显示各自磁盘使用情况。

-b或-bytes 显示目录或文件大小时,以byte为单位。

-c或–total 除了显示目录或文件的大小外,同时也显示所有目录或文件的总和。

-D或–dereference-args 显示指定符号连接的源文件大小。

-h或–human-readable 以K,M,G为单位,提高信息的可读性。

-H或–si 与-h参数相同,但是K,M,G是以1000为换算单位,而不是以1024为换算单位。

-k或–kilobytes 以1024 bytes为单位。

-l或–count-links 重复计算硬件连接的文件。

-L<符号连接>或–dereference<符号连接> 显示选项中所指定符号连接的源文件大小。

-m或–megabytes 以1MB为单位。

-s或–summarize 仅显示总计,即当前目录的大小。

-S或–separate-dirs 显示每个目录的大小时,并不含其子目录的大小。

-x或–one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。

-X<文件>或–exclude-from=<文件> 在<文件>指定目录或文件。

–exclude=<目录或文件> 略过指定的目录或文件。

–max-depth=<目录层数> 超过指定层数的目录后,予以忽略。

–help 显示帮助。

–version 显示版本信息。

1> 要显示一个目录树及其每个子树的磁盘使用情况

du /home/linux

这在/home/linux目录及其每个子目录中显示了磁盘块数。

2> 要通过以1024字节为单位显示一个目录树及其每个子树的磁盘使用情况

du -k /home/linux

这在/home/linux目录及其每个子目录中显示了 1024 字节磁盘块数。

3> 以MB为单位显示一个目录树及其每个子树的磁盘使用情况

du -m /home/linux

这在/home/linux目录及其每个子目录中显示了 MB 磁盘块数。

4> 以GB为单位显示一个目录树及其每个子树的磁盘使用情况

du -g /home/linux

这在/home/linux目录及其每个子目录中显示了 GB 磁盘块数。

5>查看当前目录下所有目录以及子目录的大小:

du -h .

“.”代表当前目录下。也可以换成一个明确的路径

-h表示用K、M、G的人性化形式显示

6>查看当前目录下user目录的大小,并不想看其他目录以及其子目录:

du -sh user

-s表示总结的意思,即只列出一个总结的值

du -h --max-depth=0 user

–max-depth=n表示只深入到第n层目录,此处设置为0,即表示不深入到子目录。

7>列出user目录及其子目录下所有目录和文件的大小:

du -ah user

-a表示包括目录和文件

8>列出当前目录中的目录名不包括xyz字符串的目录的大小:

du -h --exclude=‘xyz

9>想在一个屏幕下列出更多的关于user目录及子目录大小的信息:

du -0h user

-0(杠零)表示每列出一个目录的信息,不换行,而是直接输出下一个目录的信息。

10>只显示一个目录树的全部磁盘使用情况

du -s /home/linux

11>查看各文件夹大小:du -h --max-depth=1

Linux系统基本常识
在虚拟机里装一个Linux(centos),有时间可以装个mac玩一下。(使用centos或者Ubuntu时安装软件将会非常方便)

ifconfig –a 显示当前Linux主机的 ip 地址

如何让虚拟机在后台运行,之前搞定了,现在又搞不定了!

如何切换到root权限:su root

安装基本的软件:gcc,python,perl,R之类的

CentOS更改yum源与更新系统(很慢)

记录1:centos 安装 netcat

复制代码
mkdir download
cd download/
wget http://sourceforge.NET/projects/netcat/files/netcat/0.7.1/netcat-0.7.1-1.i386.rpm #报错 加参数
wget --no-check-certificate http://sourceforge.NET/projects/netcat/files/netcat/0.7.1/netcat-0.7.1-1.i386.rpm
rpm -ihv netcat-0.7.1-1.i386.rpm #报错 缺乏库glibc
yum list glibc* #检查 发现有 只是缺32位的版本
yum install glibc.i686
nc -ulp 9999 #测试成功
复制代码
参考:rpm包安装过程中依赖问题“libc.so.6 is needed by XXX”解决方法

CentoOS6.6安装netcat

记录2:设置共享文件夹,传文件

参考:虚拟机与主机之间交换文件[只是一个共享文件夹的操作就可以了]

Linux 替换^M字符 方法
转自:http://blog.csdn.net/lhf_tiger/article/details/8203013

真恶心,10X流程产生的csv文件的行位居然有^M字符,害我一直在找报错原因,真是坑,还好最后我找出来了。一直在用Python,perl是越来越不熟练了。调试花了好久。

替换^M字符
在Linux下使用vi来查看一些在Windows下创建的文本文件,有时会发现在行尾有一些“^M”。有几种方法可以处理。

1.使用dos2unix命令。一般的分发版本中都带有这个小工具(如果没有可以根据下面的连接去下载),使用起来很方便:
$ dos2unix myfile.txt
上面的命令会去掉行尾的^M。

2.使用vi的替换功能。启动vi,进入命令模式,输入以下命令:
:%s/^M$//g # 去掉行尾的^M。

:%s/^M//g # 去掉所有的^M。

:%s/^M/[ctrl-v]+[enter]/g # 将^M替换成回车。

:%s/^M/\r/g # 将^M替换成回车。

3.使用sed命令。和vi的用法相似:
$ sed -e ‘s/^M/\n/g’ myfile.txt

注意:这里的“^M”要使用“CTRL-V CTRL-M”生成,而不是直接键入“^M”。

转自:http://hi.baidu.com/mofeis/blog/item/23c7b2fb92dc97234e4aea6d.html

在vim的_vimrc文件中把fileformat=unix去掉就可以了

Linux crontab定时执行任务 命令格式与详细例子(转)
基本格式 :

*  *  *  *  *  command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
crontab文件的一些例子:

30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启apache。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启apache。

0 */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启apache

0 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启apache

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启apache

名称 : crontab
使用权限 : 所有使用者
使用方式 :

复制代码
crontab file [-u user]-用指定的文件替代目前的crontab。
crontab-[-u user]-用标准输入替代目前的crontab.
crontab-1[user]-列出用户目前的crontab.
crontab-e[user]-编辑用户目前的crontab.
crontab-d[user]-删除用户目前的crontab.
crontab-c dir- 指定crontab的目录。
复制代码
crontab文件的格式:M H D m d cmd.
M: 分钟(0-59)。
H:小时(0-23)。
D:天(1-31)。
m: 月(1-12)。
d: 一星期内的天(0~6,0为星期天)。
cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量
说明 :
crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定
user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设
定自己的时程表。
参数 :
crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数
来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
crontab -r : 删除目前的时程表
crontab -l : 列出目前的时程表
crontab file [-u user]-用指定的文件替代目前的crontab。
时程表的格式如下 :
f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执
行的程序。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
当 f1 为 a, b, c,…时表示第 a, b, c,…分钟要执行,f2 为 a, b, c,…时表示第 a, b, c…个小时要执行,其馀类推
使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。
例子 :
#每天早上7点执行一次 /bin/ls :

0 7 * * * /bin/ls
在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :

0 6-12/3 * 12 * /usr/bin/backup
周一到周五每天下午 5:00 寄一封信给[email protected] :

0 17 * * 1-5 mail -s “hi” [email protected] < /tmp/maildata
每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分…执行 echo “haha”

20 0-23/2 * * * echo “haha”
注意 :
当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之
后加上 > /dev/null 2>&1 即可
例子2 :
#每天早上6点10分
10 6 * * * date
#每两个小时
0 */2 * * * date
#晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8 * * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date
#1月份日早上4点
0 4 1 jan * date
范例
$crontab -l 列出用户目前的crontab.
Win下使用vm虚拟机安装linux系统
自己电脑上还是有个自己的虚拟机比较方便,之前用的Ubuntu,发现卡得不行.

现在装了个轻量级的Lubuntu,速度提升了不少.

1.下载Lubuntu,安装.

2.进入,设置root密码,初始化密码,sudo passwd

3.安装VM-Tools,解压到指定目录,安装就好.perl VMware-install.real.pl

3.开启ssh,sudo apt-get安装openssh-server

4.开启共享文件夹,sudo apt-获取删除-vm-工具

5.改bash设置

6.安装码头,sudo APT安装docker.io

7.安装对接者镜像,sudo码头客拉码头.io/hemberg-群/Scrna-seq-课程:最新

=======================================

Ubuntu只适合新手,其实它并不好用,于是我又装了一个centos.

1.解决上网问题:

切换到根用户
进入目录:
/etc/sysconfig/net-script/
找到类似这样的ifcfg-eno 16777736
一般在第一个,用vi编辑
将最后一行的ONBOOT=no改为ONBOOT=YES,如图
最后输入:WQ保存并退出,
S再重启一下网络:
服务网络重启

2.解决ssh登陆问题:如何开启Centos6.4系统的SSH服务ifconfig查看IP

3.普通用户开启sudo权限普通用户设置sudo权限

4.设置共享文件夹,VMware与Centos7.0无法共享文件夹的问题总结

5.安装基本软件,GCC,码头,码头在下的安装、使用

6.改PS1

Shell脚本中的并发(转)
转自http://blog.csdn.net/wangtaoking1/article/details/9838571

主要记录一下Shell脚本中的命令的并发和串行执行。

默认的情况下,Shell脚本中的命令是串行执行的,必须等到前一条命令执行完后才执行接下来的命令,但是如果我有一大批的的命令需要执行,而且互相又没有影响的情况下(有影响的话就比较复杂了),那么就要使用命令的并发执行了。

看下面的代码:

复制代码
#!/bin/bash
for(( i = 0; i < ${count}; i++ ))
do
commands1
done
commands2
复制代码
对于上面的代码,因为每个commands1都挺耗时的,所以打算使用并发编程,这样就可以节省大量时间了。

修改后的代码如下:

复制代码
#!/bin/bash
for(( i = 0; i < ${count}; i++ ))
do
{
commands1
}&
done
commands2
复制代码
这样的话commands1就可以并行执行了。 实质是将commands1作为后台进程在执行,这样主进程就不用等待前面的命令执行完毕之后才开始执行接下来的命令。

但是我的本来目的是让commands1的这个循环都执行结束后,再用command2去处理前面的结果。如果像上面这样写的话,在commands1都还没结束时就已经开始执行commands2了,得到了错误的结果。

再次修改代码如下:

复制代码
#!/bin/bash
for(( i = 0; i < ${count}; i++ ))
do
{
commands1
}&
done
wait
commands2
复制代码
上面这样就可以达到预期的目的了,先是所有的commands1在后台并行执行,等到循环里面的命令都结束之后才执行接下来的commands2。

对于上面的代码,如果count值特别大的时候,我们应该控制并发进程的个数,不然会影响系统其他进程的运行,甚至死机。

接下篇:Shell脚本中的并发(2)

你可能感兴趣的:(Linux)