导图社区 shell
shell思维导图,分享的内容有: shell 中()、[]、{}、(())、[[]]等各种括号的使用 shell 进程替换 shell test命令 shell 管道命令与过滤器
编辑于2023-04-16 10:44:18 北京市shell
shell 中()、[]、{}、(())、[[]]等各种括号的使用
小括号、圆括号()
单小括号()
命令组
①括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用 ②括号中多个命令之间用分号隔开,最后一个命令可以没有分号; ③各命令和括号之间不必有空格
命令替换
①等同于 cmd ,shell扫描一遍命令行,发现了(cmd)结构,便将(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。 ②有些shell不支持,如tcsh
初始化数组
如array=(a b c d)
双小括号(())
简单测试 for ((i=0;i<5;i++));do echo -n $i;done 结果: 01234 echo 加上-n参数可以使数据字符串后不再换行 for i in $(seq 0 4);do echo -n $i;done 结果: 01234 for i in `seq 0 4`;do echo -n $i;done 结果:无 for i in {0..4};do echo -n $i;done 结果:无
①整数扩展。这种扩展计算是整数型的计算,不支持浮点型。((exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者是"假",而一个非零值的表达式所返回的退出状态码将为0,或者是"true"。若是逻辑判断,表达式exp为真则为1,假则为0
②只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95,(16进位转十进制)
③单纯用 (( )) 也可重定义变量值,比如 a=5; ((a++)) 可将 $a 重定义为6
④常用于算术运算比较,双括号中的变量可以不使用符号前缀。括号内支持多个表达式用逗号分开。只要括号中的表达式符合C语言运算规则,比如可以直接使用for((i=0;i<5;i++)),如果不使用双括号,则为for i in seq 0 4或者for i in 0..4。再如可以直接使用if ((i<5)), 如果不使用双括号,则为if [ $i -lt 5 ]
中括号、方括号[]
单中括号[]
①bash 的内部命令,[]和test是等同的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码
②test和[]
点我
③字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。
④在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号
双中括号[[]]
①[[]]是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换
②支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
③使用[[ … ]]条件判断结构,而不是[ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a !=1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]
④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码
测试
[[ 2 lt 3 ]] && echo true 结果:true [[ 2 \< 3 ]] && echo true 结果:bash: 期待二元条件运算符 bash: `\<' 附近有语法错误 [ 2 \< 3 ] && echo true 结果:true [ 2 < 3 ] && echo true bash: 3: 没有那个文件或目录
大括号、花括号{}
常规用法
花括号拓展。(通配(globbing))将对花括号中的文件名做扩展。在大括号中,不允许有空白,除非这个空白被引用或转义
对大括号中的以逗号分割的文件列表进行拓展。如touch {a,b}.txt 结果为a.txt b.txt 对大括号中以点点()分割的顺序文件列表起拓展作用,如:touch {a..d}.txt 结果为a.txt b.txt c.txt d.txt
代码块,又被称为内部组,这个结构事实上创建了一个匿名函数 。与小括号中的命令不同,花括号内的命令不会新开一个子shell运行,即脚本余下部分仍可使用括号内变量。括号内的命令间用分号隔开,最后一个也必须有分号。{}的第一个命令和左括号之间必须要有一个空格
几种特殊的替换结构
命令:$ {var:-string} 替换规则:若变量var为空,则用在命令行中用string来替换{var:−string},var的值不变; 变量var不为空时,则用变量var的值来替换{var:-string},var的值不变 举栗:1、a=2 2、echo $a #result is 2 3、echo ${a:-123} #result is 2 4、echo ${b:-123} #result is 123 5、echo $a #result is 2 6、echo $b #result is empty
注意:${var:−string}的值会变化,但是${var}的值没有变化
命令:$ {var:-string} 替换规则:当var为空时,string会赋给var与{var:−string},var的值变化; 当var不为空时,会用变量var的值来替换{var:−string}; 与上述原则不同的是当var为空时,var会被赋值,很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值 举栗:1、a=2 2、echo ${a:=123} #result is 2 3、echo ${a} #result is 2 4、echo ${b:=123} #result is 123 5、echo $b #result is 123
注意:若变量var为空,则{var:=string}与{var}的值都会被赋值为string 若变量var不为空,则{var:=string}与{var}的值都还为var
命令:$ {var:+string} 替换规则:替换规则与第一种完全相反 当var不为空时用string来替换{var:−string},若var为空时则不替换 不管var是否为空,${var}的值都不会发生变化 举栗:1、a=2 2、echo ${a:+44} #result is 44 3、echo ${a} #result is 2 4、echo ${c} #result is empty 5、echo ${c:+44} #result is empty 6、echo ${c} #result is empty
命令:$ {var:?string} 替换规则:若变量var不为空,则用变量var的值来替换${var:?string}; 若变量var为空,则把string输出到标准错误中,并从脚本中退出。 我们可利用此特性来检查是否设置了变量的值。 举栗:#!/bin/bash var=4 echo '${var:?33}: '${var:?33} echo '${s:?33}: '${s:?33} echo 'aaaaaaaaaaaa'
执行:bash test1.sh 2>result.h 结果:${var:?33}: 4 执行: cat result.h 结果:test1.sh: line 4: s: 33 当var为空时,会从脚本中退出,所以没有打印aaaaaaaaaaaa
tips:在上面替换结构中string不一定是常值的,可用另外一个变量的值或是一种命令的输出。
四种模式匹配替换结构 字符串的提取和替换
$符号后面的括号()
${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。 (cmd)命令替换,和cmd效果相同,结果为shell命令cmd的输出,不过某些Shell版本不支持()形式的命令替换, 如tcsh。 $((expression)) 和 expr expression 效果相同, 计算数学表达式expr的数值。 其中expr只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算
[[]] [] (())的对比
(())
用法:((expression))不需要注意空格 说明:1、在 (( )) 中使用变量可以加也可以不加$前缀,(( )) 会自动解析变量名 2、只用于进行整数运算 3、可以使用<、<=、>、>=等进行整数运算 4、表达式可以只有一个,也可以有多个,多个表达式之间以逗号,分隔 5、对于多个表达式的情况,以最后一个表达式的值作为整个 (( )) 命令的执行结果。 6、支持逻辑运算符,逻辑运算符为&& || 支持逻辑运算符:((a>7 && b==c))
test/[]
用法:test expression或[ expression ]注意空格 说明:1、Shell 内置命令 2、>、<、== 只能用来比较字符串 3、比较数字需要使用 -eq、-gt 等选项; 4、不管是比较字符串还是数字,test 都不支持 >= 和 <=。 5、变量名建议用双引号""包围起来。 6、比较字符串时需要对 >、< 进行转义 7、支持逻辑运算符,逻辑运算符为-o -a 脚本:1、[ -z "$str1" ]||[ -z "$str2" ]#建议对变量名加双引号 2、[[ $str1 \< $str2 ]] #需要对 < 进行转义 支持逻辑运算符:1、[ -z "$str1" ] || [ -z "$str2" ] 对 2、使用-o -a !选项 [ -z "$str1" -o -z "$str2" ] 对 3、[ -z "$str1" || -z "$str2" ] 错
[[]] [[ ]] 是 test 的升级版,对细节进行了优化,并且扩展了一些功能
用法:[[ expression ]] 注意空格 说明:1、Shell 内置关键字,不是命令,在使用时没有给函数传递参数的过程,所以 test 命令的某些注意事项在 [[ ]] 中就不存在了 2、>、<、== 只能用来比较字符串 3、比较数字需要使用 -eq、-gt 等选项。 4、不需要把变量名用双引号""包围起来,即使变量是空值,也不会出错。 5、不需要、也不能对 >、< 进行转义,转义后会出错。 6、支持正则表达式!!(在 Shell [[ ]] 中,可以使用=~来检测字符串是否符合某个正则表达式,它的用法为:[[ str =~ regex ]] 其中,str 表示字符串,regex 表示正则表达式。) 7、支持逻辑运算符,逻辑运算符为&& || 脚本:1、[[ -z $str1 ]] || [[ -z $str2 ]] #不需要对变量名加双引号 2、[[ $str1 < $str2 ]] #不需要也不能对 < 进行转义 支持逻辑运算符:1、使用逻辑运算符 [[ -z $str1 ]]||[[ -z $str2 ]] 对 2、[[ -z $str1 -o -z $str2 ]] 错 3、使用逻辑运算符 [[ -z $str1 || -z $str2 ]] 对
[[ ]] 剔除了 test 命令的-o和-a选项,你只能使用 || 和 &&
[[ ]] 对数字的比较不友好,所以使用 if 判断条件时,建议用(())来处理整型数字,用[[]]来处理字符串或者文件。
单小括号,(cmd1;cmd2;cmd3) 新开一个子shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号。 单花括号,{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令,cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号,第一条命令和左括号之间必须用空格隔开。 对{}和()而言, 括号中的重定向符只影响该条命令,而括号外的重定向符影响到括号中的所有命令
shell 进程替换
shell进程替换的用法
写法:1、<(commands);2、>(commands) 含义:1、它借助于输入重定向,可以将它的输出结果作为另一个命令的输入; 2、它借助于输出重定向,可以接受另一个命令的标准输出结果 注意点:commands 是一组命令列表,多个命令之间以分号;分隔。注意,<或>与圆括号之间是没有空格的。 本质:1、/dev/fd/n文件接受(commands)的输出,作为另一个命令的输入 2、从/dev/fd/n文件中读取内容,作为(commands)的输入
使用进程替换的必要性
举例: 普通模式:echo "aaaaa" | read AA echo $AA 结果:输出结果为空 说明:echo 命令在父 Shell 中执行,而 read 命令在子 Shell 中执行,当 read 执行结束时,子 Shell 被销毁,AA 变量也就消失了。 管道中的命令总是在子 Shell 中执行的,任何给变量赋值的命令都会遭遇到这个问题。
举例: 使用进程替换:read AA< <(echo "aaaaa") echo $AA 结果:输出结果为aaaaa 说明:整体上来看,Shell 把echo "aaaaa"的输出结果作为 read 的输入。<()用来捕获 echo 命令的输出结果,<用来将该结果重定向到 read。
注意,两个<之间是有空格的,第一个<表示输入重定向,第二个<和()连在一起表示进程替换。 read 命令和第二个 echo 命令都在当前 Shell 进程中运行,读取的数据也会保存到当前进程的 AA 变量,所以使用 echo 能够成功输出。
举例:进程替换用作「接受标准输入」的例子 使用进程替换:echo "qpy" > >(read; echo "你好,$REPLY") 结果:运行结果:你好,qpy 说明:因为使用了重定向,read 命令从echo "qpy"的输出结果中读取数据。
进程替换的本质
命令:echo >(true) 输出:/dev/fd/63 命令:echo <(true 输出:/dev/fd/63 命令:echo >(true) <(true) 输出:/dev/fd/63 /dev/fd/62
说明:/dev/fd/目录下有很多序号文件,进程替换一般用的是 63 号文件,该文件是系统内部文件,我们一般查看不到。 /dev/fd/63文件起到了数据中转或者数据桥梁的作用,借助重定向,它将>()内部的命令和外部的命令联系起来,使得数据能够在这些命令之间流通。
命令:echo "qpy" > >(read; echo "hello, $REPLY") 输出:hello, qpy 说明:第一个>表示输出重定向,它把第一个 echo 命令的输出结果重定向到/dev/fd/63文件中。 >()中的read命令从/dev/fd/63中读取内容,然后用echo 命令输出 read 读取到的内容。
为了能够在不同进程之间传递数据,实际上进程替换会跟系统中的文件关联起来,这个文件的名字为/dev/fd/n(n 是一个整数)。该文件会作为参数传递给()中的命令,()中的命令对该文件是读取还是写入取决于进程替换格式是<还是>: 如果是>(),那么该文件会给()中的命令提供输入;借助输出重定向,要输入的内容可以从其它命令而来。 如果是<(),那么该文件会接收()中命令的输出结果;借助输入重定向,可以将该文件的内容作为其它命令的输入。
进程替换和命令替换非常相似。命令替换是把一个命令的输出结果赋值给另一个变量,例如dir_files=`ls -l`或date_time=$(date);而进程替换则是把一个命令的输出结果传递给另一个(组)命令。
shell test命令
test命令的用法
用法:用法1 test expression 用法2 [ expression ] 注意点:注意[]和expression之间的空格,这两个空格是必须的,否则会导致语法错误
两种用法是等价的,当 test 判断 expression 成立时,退出状态为 0,否则为非 0 值。
与数值比较相关的test选项
选 项 作 用 num1 -eq num2 判断 num1 是否和 num2 相等。 num1 -ne num2 判断 num1 是否和 num2 不相等。 num1 -gt num2 判断 num1 是否大于 num2 。 num1 -lt num2 判断 num1 是否小于 num2。 num1 -ge num2 判断 num1 是否大于等于 num2。 num1 -le num2 判断 num1 是否小于等于 num2。
使用(())命令的脚本 #!/bin/bash read -p 'please input num1: ' num1 read -p 'please input num2: ' num2 if (($num1==$num2)) then echo 'the num is equal' elif ((num1>num2)) then echo 'the num1 is large than num2' else echo 'the num1 is small num2' fi
运行结果: 第一次执行 please input num1: 10 please input num2: 10 the num is equal
使用test命令的脚本 #!/bin/bash read -p 'please input num1: ' num1 read -p 'please input num2: ' num2 if test $num1 -eq $num2 then echo 'the num is equal' elif [ $num1 -gt $num2 ] then echo 'the num1 is large than num2' else echo 'the num1 is small num2' fi
运行结果: 第二次执行 please input num1: 4 please input num2: 6 the num1 is small num2
注意,test 只能用来比较整数,小数相关的比较还得依赖 bc 命令 1.test 命令中的变量还是需要加$ 2.(())中的变量可以加也可以不加$ 3.test中的比较两数值的大小用的是-eq/-gt/-lt等,(())中用的是符号>/</==等 4.[]命令中表达式前后的空格不要忘记!!
与字符串判断相关的 test 选项
选 项 作 用 -z str 判断字符串 str 是否为空。 -n str 判断宇符串 str 是否为非空。 str1 = str2 str1 == str2 =和==是等价的,都用来判断 str1 是否和 str2 相等。 str1 != str2 判断 str1 是否和 str2 不相等。 str1 \> str2 判断 str1 是否大于 str2。\>是>的转义字符,这样写是为了防止>被误认为成重定向运算符。 str1 \< str2 判断 str1 是否小于 str2。同样,\<也是转义字符。
注意,==、>、< 在大部分编程语言中都用来比较数字,而在 Shell 中,它们只能用来比较字符串,不能比较数字,这是非常奇葩的。 其次,不管是比较数字还是字符串,Shell 都不支持 >= 和 <= 运算符,切记。
Shell test 字符串比较举例: 脚本:#!/bin/bash read -p 'input str1: ' str1 read -p 'input str2: ' str2 if [ -z "$str1" ]||[ -z "$str2" ] then echo 'the strings should not be empty' elif [ $str1 = $str2 ] then echo 'str1=str2' elif [ $str1 \> $str2 ] then echo 'str1 > str2' elif [ $str1 \< $str2 ] then echo 'str1<str2' fi
结果: input str1: aa input str2: the strings should not be empty input str1: aa input str2: bb str1<str2 input str1: aa input str2: aa str1=str2 input str1: bb input str2: a str1 > str2
1.判断字符串为空时将变量 $str1 和 $str2 都被双引号包围起来,这样做是为了防止 $str1 或者 $str2 是空字符串时出现错误 2.比较两个字符串时,除了[]中表达式的前后需要空格还要注意str1=str2时,=前后也需要空格!!
与文件检测相关的test选项
文件类型判断 选 项 作 用 -b filename 判断文件是否存在,并且是否为块设备文件。 -c filename 判断文件是否存在,并且是否为字符设备文件。 -d filename 判断文件是否存在,并且是否为目录文件。 -e filename 判断文件是否存在。 -f filename 判断文件是否存在,井且是否为普通文件。 -L filename 判断文件是否存在,并且是否为符号链接文件。 -p filename 判断文件是否存在,并且是否为管道文件。 -s filename 判断文件是否存在,并且是否为非空。 -S filename 判断该文件是否存在,并且是否为套接字文件。 文件权限判断 选 项 作 用 -r filename 判断文件是否存在,并且是否拥有读权限。 -w filename 判断文件是否存在,并且是否拥有写权限。 -x filename 判断文件是否存在,并且是否拥有执行权限。 -u filename 判断文件是否存在,并且是否拥有 SUID 权限。 -g filename 判断文件是否存在,并且是否拥有 SGID 权限。 -k filename 判断该文件是否存在,并且是否拥有 SBIT 权限。 文件比较 选 项 作 用 filename1 -nt filename2 判断 filename1 的修改时间是否比 filename2 的新。 filename -ot filename2 判断 filename1 的修改时间是否比 filename2 的旧。 filename1 -ef filename2 判断 filename1 是否和 filename2 的 inode 号一致, 可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法
脚本:#!/bin/bash read -p 'input filename1: ' filename1 read -p 'imput filename2: ' filename2 if [ -z "$filename1" ]||[ -z "$filename2" ];#判断输入值是否为空 then echo 'the input is empty' elif [ ! -e "$filename1" ]||[ ! -e "$filename2" ];#判断输入文件是否存在,如果不存在提示并退出 then echo 'please input exist file' exit 2 elif [ ! -s "$filename1" ]||[ ! -s "$filename2" ];#判断输入文件是否为空,为空则提示退出 then echo 'please input not empty file' exit 2 elif [ -d "$filename1" ]||[ -d "$filename2" ];#判断输入文件是否为目录,是则提示退出 then echo 'please input filename, not dir' exit 2 elif [ $filename1 -nt $filename2 ];#判断文件新旧 then echo 'file1 new file2' elif [ $filename1 -ot $filename2 ];#判断文件新旧 then echo 'file1 old file2' elif [ $filename1 -ef $filename2 ];#判断文件是否相同 then echo 'file1 equal file2' else echo 'some error' fi
结果:input filename1: aa imput filename2: the input is empty input filename1: aa imput filename2: bb please input exist file touch aaa input filename1: aaa imput filename2: /data/1learn_linux/ please input not empty file input filename1: /data/1learn_linux/ imput filename2: /data/1learn_linux/learn_test_str.sh please input filename, not dir input filename1: /data/1learn_linux/learn_test_str.sh imput filename2: /data/1learn_linux/learn_test.sh file1 new file2 input filename1: /data/1learn_linux/learn_test.sh imput filename2: /data/1learn_linux/learn_test_str.sh file1 old file2 input filename1: /data/1learn_linux/learn_test.sh imput filename2: /data/1learn_linux/learn_test.sh file1 equal file2
1.空格 2.逻辑非要放在表达式前边,例如 [ ! -e "$filename1" ] -e "$filename1"代表的是文件存在的情况 ! -e "$filename1"代表的是文件不存在时的情况
与逻辑运算相关的test选项
选 项 作 用 expression1 -a expression 逻辑与,表达式 expression1 和 expression2 都成立,最终的结果才是成立的。 expression1 -o expression2 逻辑或,表达式 expression1 和 expression2 有一个成立,最终的结果就成立。 !expression 逻辑非,对 expression 进行取反。
改写上面的代码,使用逻辑运算选项: 脚本:#!/bin/bash read -p 'input filename1: ' filename1 read -p 'imput filename2: ' filename2 if [ -z "$filename1" -o -z "$filename2" ];#判断输入值是否为空 then echo 'the input is empty' elif [ ! -e "$filename1" -o ! -e "$filename2" ];#判断输入文件是否存在,如果不存在提示并退出 then echo 'please input exist file' exit 2 else echo 'files exist' fi
结果:input filename1: aa imput filename2: bb please input exist file input filename1: /data/1learn_linux/ imput filename2: aa please input exist file input filename1: aa imput filename2: /data/1learn_linux/ please input exist file input filename1: /data/1learn_linux/ imput filename2: /data/1learn_linux/ files exist
1.逻辑非!与-o混用时,注意!只起作用于当前表达式,不是-o链接起来的整个表达式 2.使用-o,将两个[]合为1个
注意点与总结
test中变量用双引号包围起来 假设 test 命令对应的函数是 func(),使用test -z $str1命令时,会先将变量 $str1 替换成字符串: 如果 $str1 是一个正常的字符串,比如 abc123,那么替换后的效果就是test -z abc123,调用 func() 函数的形式就是func("-z abc123")。test 命令后面附带的所有选项和参数会被看成一个整体,并作为实参传递进函数。 如果 $str1 是一个空字符串,那么替换后的效果就是test -z ,调用 func() 函数的形式就是func("-z "),这就比较奇怪了,因为-z选项没有和参数成对出现,func() 在分析时就会出错。 如果我们给 $str1 变量加上双引号,当 $str1 是空字符串时,test -z "$str1"就会被替换为test -z "",调用 func() 函数的形式就是func("-z \"\""),很显然,-z选项后面跟的是一个空字符串(\"表示转义字符),这样 func() 在分析时就不会出错了
所以,当在 test 命令中使用变量时,强烈建议将变量用双引号""包围起来,这样能避免变量为空值时导致的很多奇葩问题。
总结 test 命令比较奇葩,>、<、== 只能用来比较字符串,不能用来比较数字,比较数字需要使用 -eq、-gt 等选项;不管是比较字符串还是数字,test 都不支持 >= 和 <=。 对于整型数字的比较,建议使用 (()),(()) 支持各种运算符,写法也符合数学规则,用起来更加方便
test 是 Shell 内置命令,用来检测某个条件是否成立。test 通常和 if 语句一起使用,并且大部分 if 语句都依赖 test。 test 命令有很多选项,可以进行数值、字符串和文件三个方面的检测
shell 管道命令与过滤器
管道命令的用法
将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成了管道(pipe)。管道使用竖线|连接多个命令,这被称为管道符。
Linux 管道的具体语法格式如下: command1 | command2 command1 | command2 [ | commandN... ] 当在两个命令之间设置管道时,管道符|左边命令的输出就变成了右边命令的输入。只要第一个命令向标准输出写入,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道。 这里需要注意,command1 必须有正确输出,而 command2 必须可以处理 command1 的输出结果;而且 command2 只能处理 command1 的正确输出结果,不能处理 command1 的错误信息。
使用管道命令的好处:
命令:3条命令来备份数据库 mysqldump -u root -p '123456' wiki > /tmp/wikidb.backup gzip -9 /tmp/wikidb.backup scp /tmp/wikidb.backup username@remote_ip:/backup/mysql/ 作用:mysqldump 命令用于将wike数据库备份到文件 /tmp/wikidb.backup。 gzip 命令用于压缩较大的数据库文件以节省磁盘空间;其中-9表示最慢的压缩速度最好的压缩效果。 scp 命令用于将数据库备份文件复制到 IP 地址为 remote_ip 的备份服务器的 /backup/mysql/ 目录下。其中username是登录远程服务器的用户名,命令执行后需要输入密码。
使用管道命令 命令:mysqldump -u root -p '123456' wiki | gzip -9 | ssh username@remote_ip "cat > /backup/wikidb.gz" 作用:命令的语法紧凑并且使用简单。 通过使用管道,将三个命令串联到一起就完成了远程 mysql 备份的复杂任务。 从管道输出的标准错误会混合到一起。 ssh username@remote_ip "cat > /backup/wikidb.gz"是将上个命令中生成的文件通过cat命令获取文件内容并保存到/backup/wikidb.gz中
重定向和管道的区别
简单地说,重定向操作符>将命令与文件连接起来,用文件来接收命令的输出;而管道符|将命令与命令连接起来,用第二个命令来接收第一个命令的输出
例如:command > file command1 | command1
Linux管道实例
将 ls 命令的输出发送到 grep 命令,查看文件 log.txt 是否存在于当前目录下 ls | grep log.txt 输出:log.txt
重定向管道的输出到一个文件 ls -al | grep log.txt >output.txt cat output.txt 输出:-rw-rw-r--. 1 lucky lucky 0 4月 15 17:26 log.txt
显示按用户名排序后的当前登录系统的用户的信息 who | sort 输出:lucky :0 2019-04-16 12:55 (:0) lucky pts/0 2019-04-16 13:16 (:0) who 命令的输出将作为 sort 命令的输入
管道与重定向
管道与输入重定向 输入重定向操作符<可以在管道中使用,以用来从文件中获取输入,其语法类似下面这样: command1 < input.txt | command2 command1 < input.txt | command2 -option | command3 实例:使用 tr 命令从 os.txt 文件中获取输入,然后通过管道将输出发送给 sort 或 uniq 等命令 命令:cat os.txt ddd bbb CCC ccc tr a-z A-Z <os.txt | sort 输出:BBB CCC CCC DDD
管道与输出重定向 你也可以使用重定向操作符>或>>将管道中的最后一个命令的标准输出进行重定向,其语法如下所示: command1 | command2 | ... | commandN > output.txt command1 < input.txt | command2 | ... | commandN > output.txt 实例: 使用 tr 命令将 os.txt 文件中的内容转化为大写,并使用 sort 命令将内容排序,使用 uniq 命令去除重复的行,最后将输出重定向到文件 ox.txt.new。 命令:cat os.txt ddd bbb CCC ccc tr a-z A-Z <os.txt | sort|uniq>os.txt.new cat os.txt.new 输出:BBB CCC DDD
过滤器
如果一个 Linux 命令是从标准输入接收它的输入数据,并在标准输出上产生它的输出数据(结果),那么这个命令就被称为过滤器。 过滤器通常与 Linux 管道一起使用。
命令 说明 awk 用于文本处理的解释性程序设计语言,通常被作为数据提取和报告的工具。 cut 用于将每个输入文件(如果没有指定文件则为标准输入)的每行的指定部分输出到标准输出。 grep 用于搜索一个或多个文件中匹配指定模式的行。 tar 用于归档文件的应用程序。 head 用于读取文件的开头部分(默认是 10 行)。如果没有指定文件,则从标准输入读取。 paste 用于合并文件的行。 sed 用于过滤和转换文本的流编辑器。 sort 用于对文本文件的行进行排序。 split 用于将文件分割成块。 strings 用于打印文件中可打印的字符串。 tac 与 cat 命令的功能相反,用于倒序地显示文件或连接文件。 tail 用于显示文件的结尾部分。 tee 用于从标准输入读取内容并写入到标准输出和文件。 tr 用于转换或删除字符。 uniq 用于报告或忽略重复的行。 wc 用于打印文件中的总行数、单词数或字节数。
过滤器举栗
awk与管道结合 功能:查看系统中的所有的账号名称,并按名称的字母顺序排序 命令:awk -F: '{print $1}' /etc/passwd | sort|head -5 输出:_apt asample backup bin daemon 知识点:-F: 以:作为分隔符,默认分隔符是空格;'{print $1}'打印第一列信息 功能:列出当前账号最常使用的 5个命令 命令:history | awk '{print $2}' | sort | uniq -c | sort -rn | head -5 输出:17 cat 14 vim 11 sudo 7 ll 7 cd 知识点:uniq -c 在每列旁边显示该行重复出现的次数;sort -rn 按照数值的大小反向排序 功能:显示当前系统的总内存大小,单位为 KB 命令:free | grep Mem | awk '{print $2}' 输出:12029860 知识点:free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer
cut 与管道命令结合 功能:查看系统中登录 Shell 是/bin/bash的用户名和对应的用户主目录的信息 命令:grep "bin/bash" /etc/passwd|cut -d : -f1,6 输出:root:/root roaddb:/home/roaddb asample:/home/asample 知识点:/ctc/passwd 文件用来存放用户账号的信息,文件中的每一行会记录一个账号的信息,每个字段之间用冒号分隔,第一个字段即是账号的账户名,第六个字段就是账号的主目录的路径。 功能:查看当前机器的CPU类型 命令:cat /proc/cpuinfo |grep name|cut -d : -f 2|uniq 输出:Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz 功能:查看当前目录下的子目录数 命令:ls -l|cut -c 1|grep d|wc -l 输出:4 知识点:命令cut -c 1是截取每行的第一个字符
grep命令 功能:查看系统日志文件中的错误信息 命令:grep -i "error:" /var/log/messages | less 输出: 知识点:grep -iv [指定字条串] [文件] 在文件中搜索字符串匹配的行并输出 -i 不区分大小写 -v 排除指定字符串 功能:查看系统中 HTTP 服务的进程信息 命令:ps aux | grep httpd 输出: 知识点: 功能:查找我们的程序列表中所有命令名中包含关键字 zip 的命令 命令:ls /bin /usr/bin | sort | uniq | grep zip 输出:bunzip2 bzip2 bzip2recover funzip gpg-zip gunzip 知识点: 功能:查找 /etc 目录下所有包含 IP 地址的文件 命令:find /etc -type f -exec grep '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' {} \; 输出: 知识点:
tar命令 功能:复制一个目录的整体结构 命令:tar cf - /home/mozhiyan | ( cd /backup/; tar xf - ) 功能:跨网络地复制一个目录的整体结构 命令:tar cf - /home/mozhiyan | ssh remote_host "( cd /backup/; tar xf - )" 功能:跨网络地压缩复制一个目录的整体结构 命令:tar czf - /home/mozhiyan | ssh remote_host "( cd /backup/; tar xzf - )" 功能:检査 tar 归档文件的大小,单位为字节 命令:cd /; tar cf - etc | wc -c 功能:检查 tar 归档文件压缩为 tar.gz 归裆文件后所占的大小 命令:tar czf - etc.tar | wc -c 功能:检查 tar 归档文件压缩为 tar.bz2 归裆文件后所占的大小 命令:tar cjf - etc.tar | wc -c
head 命令 功能:显示 ls 命令的前 10 行输出 命令:ls /usr/bin | head 输出: 知识点:默认的输出行数为 10 行 功能:显示 ls 命令的前 5 行内容。 命令:ls /usr/bin | head -n 5 输出:
uniq命令 功能:去掉输出中重复的行 命令:sort testfile | uniq 输出: 功能:显示输出中各重复的行出现的次数,并按次数多少倒序显示 命令:sort testfile | uniq -c | sort -nr 输出:
wc命令 功能:统计当前登录到系统的用户数 命令:who | wc -l 输出:2 知识点:wc 命令用于统计包含在文本流中的字符数、单同数和行数 功能:统计当前的 Linux 系统中的进程数 命令:ps -ef | wc -l 输出:70
亿图脑图MindMaster
亿图脑图MindMaster 是亿图软件最新推出的一款跨平台、多功能的思维导图软件。是帮助您快速成为思维导图设计能手的全面解决方案!MindMaster分为免费版和专业版,终结了思维导图软件好用则价高,免费则难用的尴尬局面。软件提供了丰富的智能布局、多样性的展示模式、结合精美的设计元素和预置的主题样式,努力帮用户打造一款真正的效率神器。自推出以来深受广大用户的欢迎,被广泛应用于解决问题,时间管理,业务战略和项目管理等领域中。
1. 多端同步服务
电脑端
轻松开始思维导图制作
主题
Enter键插入主题
子主题
Ctrl+Enter或Insert键插入子主题
浮动主题
插入独立的浮动主题
多个主题
同时插入多个主题
导入导出
导入
MindManager文件
XMind(含Zen)文件
Edraw文件
FreeMind文件
Markdown文件
Word文件
导出
图像格式
JPEG、PNG、GIF、BMP
Tiff
MS Office文件
Word
PPT
Excel
Html网页
源文件
MindManager文件
有道笔记
iOS端
Web端
2. 让思维导图更加专业
关系线
用线条表示两个主题之间的关系
标注
对主题插入详细的说明或注意点
外框
将主题与其子主题用外框包围,强调其整体关系
概要
总结主题内容,加深理解
自定义样式
图形形状
颜色
样式
线条
图标
优先级
进度
表情
箭头
旗帜
星
符号
自定义
添加、管理自定义图标
丰富的矢量元素
剪贴画
商业、教育、人物、自然、科技等
免费版可使用部分,专业版支持全部免费试用
实例模板
丰富的可编辑的免费模板
适合小白用户,迅速上手
图片
插入、拖入图片,直观表达思路
标签
资源
在任务管理的人事分配中使用
自定义
添加,管理自定义的标签
超链接
图片,文件等文件
文件夹
网址
当前文档
附件
对导图内容进行补充说明
注释
对导图内容进行补充说明
编号
对思维导图插入编号
可对每层主题分别进行编号
3. 多彩的样式设计
内置主题
免费使用软件内置的丰富主题
免费版可用6种,专业版可用所有(33种)
自定义样式
提取自定义样式设计并保存为常用主题
主题配色
自定义主题配色
专业版还可使用彩虹色、单色、对称色、交替色四种配色
甘特图
从思维导图生成甘特图
升级专业版,即可免费使用
从思维导图一键生成甘特图
支持思维导图与甘特图的同步编辑
导出甘特图至PDF格式
任务管理
多用于日程计划、任务管理相关思维导图的制作
对思维导图插入任务信息,生成的甘特图中有对应的任务信息
背景
背景颜色
50种图片背景
支持上传本地图片作为背景插入
手绘模式
升级专业版,即可免费使用
在电脑上也可以制作出漂亮的手绘模式思维导图
4. 头脑风暴
幻灯片
自动生成幻灯片
支持按照思维导图主题的逻辑顺序自动生成幻灯片
全屏模式
在全屏模式下播放思维导图幻灯片演示
遍历
升级专业版,即可免费使用
主题
分支
在全屏模式下遍历主题或分支
多页导出与打印
升级专业版,即可免费使用
导出至PPT、PDF格式
打印
快速整理思路
5. 公式
升级专业版,即可免费使用
强大的内置公式编辑器
导图社区
集颜值与内涵于一身的导图知识社区
海量导图供您选择
您可以分享、使用、探讨......
分享与协同合作
分享
一键分享到SNS
云服务
个人
随时随地查看
1G云容量
可用于在线协作
用于远程办公、远程会议
需使用在线端
表格
升级专业版,即可免费使用
全新表格功能,轻松hold住巨大的信息量