xxy@xxy:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
xxy@xxy:~$ echo ${PATH}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
- 变量与变量内容以一个等号“=”来连接。
- 等号两边不能直接接空格符号。
- 变量名称只能是英文字母与数字,但是开头字符不能是数字。
- 变量内容若有空格符可使用双引号“"”或单引号“'”将变量的内容结合起来,但是
- 双引号内的特殊字符如$等,可以保佑原本的特性,例如:
xxy@xxy:~$ var="lang is $LANG"
xxy@xxy:~$ echo $var
lang is zh_CN.UTF-8
- 单引号内的特殊字符则仅为一般字符(纯文本),例如:
xxy@xxy:~$ var='lang is $LANG'
xxy@xxy:~$ echo $var
lang is $LANG
- 可用转义字符”\“将特殊符号变成一般字符
- 在一串命令中,还需要通过其他命令提供的信息,可以使用反单引号”
命令
“或”$(命令)“,例如:
xxy@xxy:~$ version=$(uname -r)
xxy@xxy:~$ echo $version
4.4.0-130-generic
xxy@xxy:~$ version=`uname -r`
xxy@xxy:~$ echo $version
4.4.0-130-generic
- 若该变量为了增加变量内容时,则可用"$变量名称"或${变量}累加到内容,例如:
PATH="$PATH:/home/bin"
- 若该变量需要在其他子进程执行,则需要以export来使用变量变成环境变量
export PATH
- 通常大写字符位系统默认变量,自行设置变量可以使用小写变量,方便判断。
- 取消变量的方法为使用“unset变量名称”,例如取消version的设置
xxy@xxy:~$ version=$(uname -r)
xxy@xxy:~$ echo $version
4.4.0-130-generic
xxy@xxy:~$ version=`uname -r`
xxy@xxy:~$ echo $version
4.4.0-130-generic
xxy@xxy:~$ unset version
xxy@xxy:~$ echo $version
#!/bin/bash
echo "Hello World!"
#!
是一个约定的标记,告诉系统这个脚本要什么解释器来执行
chmod +x ./test.sh
sh ./test.sh
注意: 一定要写成./test.sh,而不是test.sh,运行其他二进制程序也一样,直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh的,而只有/bin,/sbin,/usr/bin,/usr/sbin等在PATH里,而我的当前目录不在PATH中,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统,就在当前目录中找。
也可以用/bin/sh test.sh
来执行
定义变量的时候,变量名不加美元符号:
your_name='xxy'
变量名和等号之间不能有空格
- 变量名只能用英文字母,数字和下划线,收个字母不能以数字开头
- 中间不能有空格,可以使用下划线_
- 不能使用标点符号
- 不能使用bash里的关键词
echo ${your_name}
使用readonly
命令可以将变量直接定义为只读变量,只读变量的值不能被改变
#!/bin/bash
myname="xxy"
readonly myname
myname="machine"
运行脚本结果如下:
./test.sh: line 4: myname: readonly variable
使用unset命令可以删除变量
unset myname
注意: 变量删除后不能再次使用。unset不能删除只读变量。 删除变量后,echo将不再有输出
单引号字符串的显示:
- 单引号里的任何字符都会原样输出,单引号中的变量的是无效的
- 单引号字符串中不能再出现单引号(对单引号使用转义字符也不行)
双引号的优点:
- 双引号里可以有变量
- 双引号里尅可以出现转义字符
$ str1="abc"
$ str2="bcd"
$ str3="0"$str1
$ echo $str3
0abc
$ str4="0"$str1$str2
$ echo $str4
0abcbcd
$ string="abc"
$ echo ${#string}
3
$ string="0123456789"
$ echo ${string:1:4}
1234
# 查找字符'i'或's'的位置
$ string="runoob is a great company"
$ echo `expr index "$string" is`
8
# mac 里面没有index https://discussions.apple.com/thread/923299
bash支持一维数组(不支持多维数组),并且没有设定数组的大小,起始下标为0
$ my_array=(A B "C" D)
$ echo "第一个元素为: ${my_array[0]}"
第一个元素为: A
$ echo ${my_array[*]}
A B C D
$ echo ${my_array[@]}
A B C D
$ val=`expr 2 + 2`
$ echo $val
4
$ a=10
$ b=20
$ echo `expr $a + $b`
30
$ echo `expr $a - $b`
-10
$ echo `expr $a / $b`
0
$ echo `expr $a \* $b`
200
$ echo `expr $a % $b`
10
$ echo `expr $a == $b`
0
$ echo `expr $a != $b`
1
注意:
- 表达式和运算符之间要有空格,例如2+2是不对的,必须写成2 + 2
- 完整的表达式要被``包含
- 乘号(*)前边必须加反斜杠()才能实现乘法运算
编写test.sh
#!/bin/bash
# author:xxy
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b : a 不等于 b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b : a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b : a 大于 b"
else
echo "$a -gt $b : a 不大于 b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b : a 小于 b"
else
echo "$a -lt $b : a 不小于 b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b : a 大于等于 b"
else
echo "$a -ge $b : a 小于 b"
fi
if [ $a -le $b ]
then
echo "$a -le $b : a 小于等于 b"
else
echo "$a -le $b : a 大于 b"
fi
输出: 10 -eq 20: a 不等于 b 10 -ne 20: a 不等于 b 10 -gt 20: a 不大于 b 10 -lt 20: a 小于 b 10 -ge 20: a 小于 b 10 -le 20: a 小于或等于 b
总结:
-eq
: 判断两个数是否相等-ne
: 判断两个数是否不相等-gt
: 判断左边的数是否大于右边的数-lt
: 判断左边的数是否小于右边的数-ge
: 判断左边的数是否大于等于右边的数-le
: 判断左边的数是否小于等于右边的数
在if语句中,判断条件[ $a -ne $b ]的空格是严格的
!
: 非运算符,表达式为ture则返回false,否则返回true-o
: 或运算符,有一个表达式为true,则返回ture-a
: 与运算符,有两个表达式都为ture才返回true
&&
: 逻辑的AND||
: 逻辑的OR
=
: 检测两个字符串是否相等,相等返回true!=
: 检测两个字符串是否不相等,不相等返回true-z
: 检测字符串长度是否为0,为0返回true [ -z $a ] 返回 falsen
: 检测字符串长度是否为0,不为0返回true [ -n $a ] 返回 truestr
: 检测字符串是否为空,不为空返回ture [ $a ] 返回 true
重定向一般是通过在命令之间插入特定的符号来实现
command1 > file1
先执行command1,然后将输出的内容存入到file1,file1中的内容将被新的内容替换。如果要将新的内容追加到文件末尾,使用>>操作符。
将本来需要从键盘获取输入的命令会转移到从文件获取输入 统计users文件的行数 wc -l < users
一般情况下,每个Unix/Linux命令运行时会打开三个文件:
标准输入文件(stdin):stdin的文件描述符为0
标准输出文件(stdout):stdout的文件描述符为1
标准错误文件(stderr):stderr的文件描述符为2
默认情况下,command > file
将stdout重定向到file,command < file
将stdin重定向到file
将stderr重定向到file,可以用command 2 > file
将stdout和stderr合并后重定向到file,command > file 2>&1
或者 command >> file 2>&1
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到/dev/null:
command > /dev/null
/dev/null是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那什么也读取不到。但是/dev/null文件非常有用,将命令的输出重定向到它,会起到“禁止输出”的效果。 如果希望屏蔽stdout和stderr,可以这样写
command > /dev/null 2>&1
变量赋值等号两边不能有空格
xxy@xxy:~$ VAR="1234"
xxy@xxy:~$ echo $VAR
1234
xxy@xxy:~$ echo $VAR1234 # 将会查找VAR1234这个变量
xxy@xxy:~$ echo ${VAR}1234
12341234
date命令是显示或设置系统时间与日期 -s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号 <+时间日期格式>:指定显示时候,使用指定的日期时间格式
xxy@xxy:~$ date +"%Y-%m-%d %H:%M:%S"
2018-11-25 22:28:48
- 用空格隔开每个项
- 用/(反斜杠)放在shell特定的字符前面
- 对包含空格和其他特殊的字符串要用引号括起来
# 计算字符串长度
xxy@xxy:~$ expr length "this is a test"
14
# 抓取子串
xxy@xxy:~$ expr substr "this is a test" 3 5
is is
# 抓取第一个字符数字串出现的位置
xxy@xxy:~$ expr index "sarsarsar" a
2
# 整数运算
xxy@xxy:~$ expr 14 % 9
5
xxy@xxy:~$ expr 10 + 10
20
xxy@xxy:~$ expr 10+10 # 注意空格
10+10
sed编辑器是一行一行处理文件内容的。正在处理的内容存放在模式空间(缓冲区)内,处理完成以后按照选项的规定进行输出或文件的修改。 sef是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern sapce),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。 接着处理下一行,这样不断重复,知道文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作。 sed也支持正则表达式,如果要使用扩展正则表达式加参数-r sed的执行过程: 1.一次读取一行数据 2.根据提供的规则来匹配相关的数据,比如查找root 3.按照命令修改数据流中的数据,比如替换 4.将结果进行输出 5.重复上面四步
如何使用 语法格式 sed [options] '[commands]' filename
xxy@xxy:~$ echo "this is apple" | sed 's/apple/dog/'
this is dog
xxy@xxy:~$ echo "this is apple" | sed 's/apple/dog/'
this is dog
xxy@xxy:~$ echo "this is apple" >> a.txt
xxy@xxy:~$ sed 's/apple/dog/' a.txt
this is dog
xxy@xxy:~$ cat a.txt
this is apple
sed选项|参数
options | 描述 |
---|---|
-a | 在当前行插入文件 |
-n | 读取下一个输出行,用下一个命令处理新的行而不是用第一个命令 |
-e | 执行多个sed指令 |
-f | 运行脚本 |
-i | 编辑文件内容 |
-i.bak | 编辑的同时创建.bak的备份 |
-r | 使用扩展的正则表达式 |
commands | 描述 |
---|---|
i | 在当前行上面插入文件 |
c | 把选定的行改为新的额指定的文件 |
p | 打印 |
d | 删除 |
r/R | 读取文件/一行 |
W | 另存 |
s | 查找 |
y | 替换 |
h | 拷贝模板块的内容到内存中的缓冲区 |
H | 追加模板块的内容到缓冲区 |
g | 获得内存缓冲区的内容,并替代当前模板中的文本 |
G | 获得内存缓冲区的内容,并追加到当前模板块文本后面 |
D | 删除\n之前的内容 |
替换标记 | 描述 |
---|---|
数字 | 表明新文本将替换第几处模式匹配的地方 |
g | 表示新文本将会替换所有匹配的文本 |
\1 | 子穿匹配标记,前面搜索可以用元字符集(//) |
& | 保留搜索到的字符串用来替换其他字符 |
sed匹配字符集 | 描述 |
---|---|
^ | 匹配行开始,如:/^sed/匹配所有以sed开头的行 |
$ | 匹配行结束,如:/sed$匹配所有以sed结尾的行 |
. | 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d |
* | 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行 |
例1:只替换第一个匹配到的字符,将passwd中root用户替换成xuegod
xxy@xxy:~$ sed 's/root/xuegod/' /etc/passwd
例2:全面替换标记g
xxy@xxy:~$ sed 's/root/xuegod/g' /etc/passwd
例3:将sed中默认的/定界符改成#号
xxy@xxy:~$ sed 's#/bin/bash#/sbin/nologin#' /etc/passwd
如果非得用,加转义符号
xxy@xxy:~$ sed 's/\/bin\/bash/\/sbin\/nologin/' /etc/passwd
(2)按行查找替换 写法如下: 用数字表示范围;$表示行尾 用文本模式配置来过滤 例1:单行替换,将第2行中第一个bin替换成xuegod
xxy@xxy:~$ sed '2s/bin/xuegod/' /etc/passwd
xxy@xxy:~$ sed '2s/bin/xuegod/g' /etc/passwd # 将第二行中所有bin都替换成xuegod
xxy@xxy:~$ sed '2,$s/bin/xuegod/g' /etc/passwd # 将第二行到最后一行的所有bin都替换成xuegod
(3)d 删除第二行到第4行
xxy@xxy:~$ cat a.txt
this is apple
line1
line2
line3
line4
line5
xxy@xxy:~$ sed '2,4d' a.txt
this is apple
line4
line5
(4)添加行
命令i(insert),在当前行前面插入一行 i
命令a(append),在当前行后面添加一行 a\
xxy@xxy:~$ sed '1i\append' a.txt # 在第一行前插入
append
this is apple
line1
line2
line3
line4
line5
xxy@xxy:~$ sed '1a\append' a.txt # 在第1行后面追加
this is apple
append
line1
line2
line3
line4
line5
xxy@xxy:~$ sed '2,4a\append' a.txt # 2,3,4行后面追加append
this is apple
line1
append
line2
append
line3
append
line4
line5
xxy@xxy:~$ sed 'a\append' a.txt # 每一行都追加
this is apple
append
line1
append
line2
append
line3
append
line4
append
line5
append
xxy@xxy:~$ sed '$a\append' a.txt # 在最后一行追加
this is apple
line1
line2
line3
line4
line5
append
(5)修改行命令c(change) c
修改第4行内容
xxy@xxy:~$ sed '1c\line0' a.txt
line0
line1
line2
line3
line4
line5
xxy@xxy:~$ sed '1,3c\line0' a.txt
line0
line3
line4
line5
将line的内容都改成LINE
xxy@xxy:~$ sed '/line0/c\LINE0' a.txt
this is apple
line1
line2
line3
line4
line5
(6)打印,直接输入文件中的内容
xxy@xxy:~$ sed -n '1p' a.txt
this is apple
(7)将修改过或过滤出来的内容保存到另一个文件中
xxy@xxy:~$ sed -n '/root/w c.txt' /etc/passwd
xxy@xxy:~$ cat c.txt
root:x:0:0:root:/root:/bin/bash
(8)-i对源文件修改
xxy@xxy:~$ sed -i 's/line/LINE/' a.txt
xxy@xxy:~$ cat a.txt
this is apple
LINE1
LINE2
LINE3
LINE4
LINE5
(9)查找字符串
xxy@xxy:~$ cat a.txt
per_cpu:0
speakid:maohui 9101-0,9102-0
speakid:sangzhujuan 9201-1,9202-1
xxy@xxy:~$ cat c.sh
echo "重启端口号:$1"
confile=a.txt
port=$1
gpuid=`grep $port $confile | sed -r "s#(speakid:)(.*) (.*)($port)-([0-9])(.*)#\5#"`
echo "gpu: $gpuid"
speakid=`grep $port $confile | sed -r "s#(speakid:)(.*) (.*)($port)-([0-9])(.*)#\2#"`
echo "speakid: $speakid"
xxy@xxy:~$ sh c.sh 9101
重启端口号:9101
gpu: 0
speakid: maohui
grep在数据中查找一个字符串时,是以证书行为单位来进行行数据选取的
grep [-acinv] [--color=auto] ‘查找字符串’ filename
参数 | 描述 |
---|---|
-a | 将binary文件以txt文件的方式查找数据 |
-c | 计算找到‘查找字符串’的次数 |
-i | 忽略大小写的不同,所有大小写视为相同 |
-n | 顺便输出行号 |
-v | 反向选择,即显示没有‘查找字符串’内容的那一行 |
--color=auth | 可以将找到的关键字部分加上颜色显示 |
例:将last当中有出现xxy的那一行取出来
last
显示登陆者信息
xxy@xxy:~/xxy_github/shell_learning$ last | grep xxy
xxy pts/14 :0 Tue Nov 27 22:30 still logged in
xxy pts/8 :0 Tue Nov 27 22:26 still logged in
xxy :0 :0 Tue Nov 27 22:09 still logged in
xxy pts/8 :0 Sun Nov 25 19:29 - 22:54 (03:25)
...
例:与上例相反
xxy@xxy:~/xxy_github/shell_learning$ last | grep -v xxy
reboot system boot 4.4.0-138-generi Tue Nov 27 22:08 - 22:41 (00:32)
reboot system boot 4.4.0-138-generi Sat Nov 17 20:15 - 22:55 (8+02:39)
reboot system boot 4.4.0-138-generi Thu Nov 15 20:53 - 22:53 (01:59)
reboot system boot 4.4.0-138-generi Wed Nov 14 20:16 - 23:21 (03:05)
...
例:在last
的信息输出中,取非xxy,并且仅取第一列
xxy@xxy:~/xxy_github/shell_learning$ last | grep -v 'xxy' | cut -d ' ' -f 1
reboot
reboot
reboot
reboot
reboot
reboot
reboot
...
grep [-A] [-B] [--color=auto] '搜索字符串' filename
参数 | 描述 |
---|---|
-A | 后面可加数字,为after的意思,除了列出该行外,后续的n行也列出来了 |
-B | 后面可加数字,为before的意思,除了列出该行外,前面的n行也列出了 |
--color=auto | 可将正确的那个选取数据列出颜色 |
xxy@xxy:~$ cat a.txt | grep -A2 -B2 -n 1
1-line 0
2:line 1
3-line 2
4-line 3
例题一:查找特定字符串
xxy@xxy:~$ grep -n 'the' regular_express.txt
8:I can't finish the test.
12:the symbol '*' is represented as start.
15:You are the best is mean you are the no. 1.
16:The world <Happy> is the same with "glad".
18:google is the best tools for search keyword.
反选
xxy@xxy:~$ grep -nv 'the' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
5:However, this dress is about $ 3183 dollars.
6:GNU is free air not free beer.
7:Her hair is very beauty.
9:Oh! The soup taste good.
10:motorcycle is cheap than car.
11:This window is clear.
13:Oh! My god!
14:The gd software is a library for drafting programs.
17:I like dog.
19:goooooogle yes!
20:go! go! Let's go.
21:# I am VBird
22:
忽略大小写
xxy@xxy:~$ grep -in 'the' regular_express.txt
8:I can't finish the test.
9:Oh! The soup taste good.
12:the symbol '*' is represented as start.
14:The gd software is a library for drafting programs.
15:You are the best is mean you are the no. 1.
16:The world <Happy> is the same with "glad".
18:google is the best tools for search keyword.
例子二:利用中括号[]来查找集合字符
xxy@xxy:~$ grep -n 't[ae]st' regular_express.txt
8:I can't finish the test.
9:Oh! The soup taste good.
xxy@xxy:~$ grep -n '[^g]oo' regular_express.txt # 反选不想找g开头的oo字符串
2:apple is my favorite food.
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!
xxy@xxy:~$ grep -n [^a-z]oo regular_express.txt #查找前面不包含小写字母的oo组合
3:Football game is not use feet only.
xxy@xxy:~$ grep -n [^[:lower:]]oo regular_express.txt
3:Football game is not use feet only.
xxy@xxy:~$ grep -n '[0-9]' regular_express.txt # 查找数字
5:However, this dress is about $ 3183 dollars.
15:You are the best is mean you are the no. 1.
xxy@xxy:~$ grep -n '[[:digit:]]' regular_express.txt
5:However, this dress is about $ 3183 dollars.
15:You are the best is mean you are the no. 1.
例题三:行首与行尾
xxy@xxy:~$ grep -n '^the' regular_express.txt # 查找以the开头的行
12:the symbol '*' is represented as start.
xxy@xxy:~$ grep -n '^[a-z]' regular_express.txt # 查找小写字母开头的句子
2:apple is my favorite food.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
12:the symbol '*' is represented as start.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
xxy@xxy:~$ grep -n '^[[:lower:]]' regular_express.txt
2:apple is my favorite food.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
12:the symbol '*' is represented as start.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
xxy@xxy:~$ grep -n '^[^a-zA-Z]' regular_express.txt # 查找不以字母开头的句子
1:"Open Source" is a good mechanism to develop programs.
21:# I am VBird
# ^在[]内代表“反向选择”,在[]之外则代表定位在行首的意义
xxy@xxy:~$ grep -n '\.$' regular_express.txt # 查找以小数点结尾的句子
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
11:This window is clear.
12:the symbol '*' is represented as start.
15:You are the best is mean you are the no. 1.
16:The world <Happy> is the same with "glad".
17:I like dog.
18:google is the best tools for search keyword.
20:go! go! Let's go.
xxy@xxy:~$ grep -n '^$' regular_express.txt # 查找“”
22:
例子四:任意一个字符.与重复字符*
在bash总通配符*可以用来表示任意(0或多个)字符,但是正则表达式并不是通配符,两个不同
- .(小数点):代表一定有一个任意字符的意思
- *(星号):代表重复前一个0到无穷多次的意思,为组合形态
xxy@xxy:~$ grep -n 'g..d' regular_express.txt # 查找g??d的字符串
1:"Open Source" is a good mechanism to develop programs.
9:Oh! The soup taste good.
16:The world <Happy> is the same with "glad".
xxy@xxy:~$ grep -n 'ooo*' regular_express.txt # 查找只少两个以上的字符串
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! The soup taste good.
18:google is the best tools for search keyword.
19:goooooogle yes!
xxy@xxy:~$ grep -n 'goo*g' regular_express.txt # 查找g开头,g结尾,中间只少存在一个o
18:google is the best tools for search keyword.
19:goooooogle yes!
xxy@xxy:~$ grep -n 'g.*g' regular_express.txt # .*代表零个或多个任意字符的意思
1:"Open Source" is a good mechanism to develop programs.
14:The gd software is a library for drafting programs.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
xxy@xxy:~$ grep -n 'o\{2\}' regular_express.txt # 找到两个o的字符串
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! The soup taste good.
18:google is the best tools for search keyword.
19:goooooogle yes!
xxy@xxy:~$ grep -n 'go\{2,5\}g' regular_express.txt # 查找g开头后面接2到5个o,再接一个g
18:google is the best tools for search keyword.
xxy@xxy:~$ grep -n 'go\{2,\}g' regular_express.txt # 查找g开头,接任意多个o,再接一个g
18:google is the best tools for search keyword.
19:goooooogle yes!
以周期性的方式执行给定的指令,指令输出以全屏方式显示
watch -n 1 nvidia-smi
conda create --name tf_gpu_env tensorflow-gpu
# tf_gpu_env是这个环境的名字
Anaconda 会自动安装tensorflow所需的依赖,包含正确的CUDA和cudnn
source activate tf_gpu_env
source deactivate