Shell学习过程中的笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hello_world12138/article/details/53373948

1.  Shell

2.  Wc 统计文件中的行或者字或者字符  -l 列出多少行  -w 列出英文单词个数  -m 多少字符

3.  (管道前的内容) | grep –c ‘hello’ 计算管道前内容中找到的字符串次数,单纯统计  -i 忽略大小写的不同  -n 顺便输出行号

4.  变量的定义:直接在命令行中输入 MYNAME=ZTL,就可以设置一个变量名为MYNAME,内容为ZTL的变量。

5.  有特殊的单引号什么的,可以使用” ” 或者 ‘ ’ 将其括起来,或者使用\:name=”Vbird’sname”  或者 name=Vbird\’s\ name

6.  使用” ”可以保持元贝的特性,如$ :name=”lang is $LANG” 则等效于name=”lang is en_US”。

7.  使用’ ’仅表示为一般的字符(文本):name=’lang is$LANG’ 则等效于name=’lang is $LANG‘。

8.  变量名不能是数字开头。

9.  特殊字符可以使用\进行转义,变成一般字符。

10. username=${username:-root}   –号表示如果前面的内容没有被设置,就用后面的内容进行替换,而加上了:以后,表示如果前面username被设置为空串,也会用后面的内容进行替换。这样做是为了保证用户不小心按下enter键,没有文件名的情况。

11. $(command)表示命令,可以赋值给变量。

12. $? :用于返回执行上一条命令的回传码,如果执行成功,就返回0;如果执行失败,返回非0码。

13. 增加变量内容:PATH=”$PATH”/home/bin,就可以在这个变量后面加上/home/bin这样的内容。

14. 取消设置可以使用unset PATH,进行取消设置该变量。

15. 使用export来使变量变成环境变量。

16. env命令显示所有的环境变量以及它的内容。

17. Set查看与bash操作接口相关的变量以及用户自己定义的变量。

18. Bash也是一个独立的进程,当一个子bash被执行,那么父bash就会处于睡眠的状态,直到子bash退出,才能正常使用父bash中的变量。如果想要在父子bash中公用一个变量,可以使用export+变量名,使其变成环境变量。

19. 变量通过键盘输入:read命令  例如:read –p “please input:” –t 10 myname (提示信息-p,等待时间-t,这时可以通过等待10秒用户输入,进行设置变量内容myname)。

20. 声明变量类型:declare/typeset –a(array) –i(integer) –x(export) –r(readonly)  declare –i sum=100+300+50    则sum=450,而不是100+300+50,声明为-i,那么就不是一开始默认的字符串变量类型了,而是整型变量类型。

21. Ulimit :限制用户对文件系统和程序资源的使用。

22. 命令别名:alias lm=’ls –l| more’,这样,输入lm命令的时候,就有后面的一串命令的作用。可以使用unalias进行取消设置。

23. 历史命令:history,显示之前使用过的命令。 History 4 显示最新的四个命令。

24. 命令的查找顺序:一般的命令运行顺序可以如下1)以相对/绝对路径执行的命令(/bin/ls),最为优先。 2)由alias别名定义后的命令。 3)bash内置的(bulitin)命令。 4)通过PATH变量中顺序查找到的第一个命令执行。 以上为用户输入一个命令,到底优先会执行那个命令的优先顺序。

25. 通配符:*表示0到无穷多个任意字符;?表示有一个任意字符; []表示一定有括号中字符中的任意一个字符; [-] 表示在一个范围中的字符会出现,例如[0-9]表示0-9之中的数字;[^]表示除开中括号以内的字符,可以存在。例如[^a-z]也就是除开小写字母。

26. 数据流重定向 : 1)标准输入:代码0,使用<(把文件内容作为输入)和  <<(输入特定内容作为结束)例如:cat > catfile<<”end”,就可以实现,从键盘输入,当输入内容为end的时候,结束输入进程,不需要按ctrl+d; 2)标准输出:代码1,使用>(覆盖)和  >>(追加)输出到文件或者其他中,如果该文件本来不存在,则会被新建,例如:ls>./msg.txt,那么屏幕上就不会出现内容,直接在文件中保存了该内容; 3)标准错误输出:代码2,使用2> (覆盖)和 2>>(追加)进行输出,属性和标准输出类似。

27. Find /home –name.bashrc > list_right  2>>list_err:实现的功能是,将正确的结果内容,覆盖保存到list_right,将错误信息追加保存到list_err中。    如果要将错误和正确信息放到一个文件中,可以使用 > list_right  2>&1 就可以了

28. 黑洞设备:将所有输入的内容全部销毁。/dev/null ,如果不想要错误的输出信息,可以输出到这个设备中。

29. 数据流重定向的重要意义:1)屏幕输出的信息很重要,需要保存下来;2)后台执行中的程序,不希望它的执行内容显示到屏幕上,干扰正常的显示; 3)一些系统的例行命令执行的结果,希望使用文件将其保存下来; 4)命令执行,输出不需要的错误信息,可以使用2>/dev/null将其舍弃; 5)错误信息和正确信息需要分别输出的时候。

30. 连续执行两个命令:cmd;cmd这样的方式,可以连续执行两条命令。

31. Cmd &&cmd:只有前面的正确执行以后,才能执行后面的;前面的置信错误,就不执行后面的命令了。类似于程序中&&,前面正确,才判断后面的是否正确,要是前面错误,那就直接短路,不用执行后面的了。

32. Cmd || cmd:只有前面的执行错误以后,才执行后面的。只要一个满足正确就可以了。

33. 管道命令: | 管道命令只能执行前一个命令的standard output 而不能接收 standard error output

34. Cut:选取命令,切出信息中的一段。-d:后面接分割字符,根据分割字符,分成数段,与-f一起使用,-f指明取出第几段。 -c:以字符的单位取出固定的字符区间。

35. Cut使用范例:echo $PATH | cut –d ‘:’ –f 3,5  将PATH变量中的第3第5路径取出来。

36. echo $PATH | cut –c 12-  显示信息中的第十二个字符到最后的信息  也可以 12-20个字符

37. Grep:分析一行,如果这行中有我们需要的信息,那么就把这整一行拿出来显示。-c 统计查找到该字符的次数;-i 忽略大小写; -n 顺便显示行号; -v 反向选择,显示不包含‘查找字符串’的行。

38. Sort:排序命令, cat /etc/passwd | sort –t ‘:’ –k 3 以:为分隔符,去第三块内容作为排序的依据。 -t 分隔符,类似于cut命令的-d参数, -f 忽略大小写,-b 忽略最前面的空格部分,-u 同样的信息只显示一行。

39. Uniq:同样的信息只显示一行。 Last | cut –d ‘ ’ –f 1 | sort |uniq –c 对排序完的用户做同样的用户只显示一次的操作。

40. Wc:知道文件中有多少行,多少字,多少字符。-l 列出行  -w :列出多少字,例如hello world就是两个字  -m:多少字符,hello world有11个字符。

41. Tee:可以使得输出的内容,同时存储到文件中,以及屏幕上显示。

42. Tr :删除信息中的文字或者进行替换。

43. 正则表达式:处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。 grep sed awk

44. 语系差别:LANG=C时,0 1 2 3.........A B C D ......a b c d .......z;而LANG=zh_CN.UTF-8时,0 1 2 3.........a A b B c C ..........z Z。两种语系带来的差别是,要是参数为[A-Z],那么LANG=C是正确的意思,而zh_CN.UTF-8则会多余的包含了b-z这几个小写字母,就是因为语系不同。

45. Grep

46. grep –n ‘hello’main.c  查找其中指定的字符串

47. grep –n ‘t[ae]st’regurla.txt 在字符串中查找到test 或者 taste这种单词,匹配不同的单词

48. [^g] 就是不允许在相应位置上有g   [^a-z]不允许相应位置上有小写字母   ‘!$’查找!在行尾

49. Grep –n –A2 –B3‘key’  filename  查找到关键字key之后的两行,和关键字之前的三行。 A—after  B—before

50. 对行首进行查找:使用^ grep –n ‘^the’ regular.txt,对这个文件中行首为the的行进行查找列出。   亦或者想要行首首字母为小写字母, grep –n ‘^[a-z]’ regular.txt,就可以了。

51. 对行尾进行查找:使用$ grep –n ‘\.$’ regular.txt ,对这个文件中末尾使用. 结尾的语句进行列出查找。

52. 将配置文件中的空行和只有#的注释行不显示:grep –v ‘^$’ /etc/syslog.conf | grep –v‘^#’

53. . 表示一定有一个任意字符 ‘g..d’,那么这中间两个字符可以是任意的字符

54. * 表示重复前一个的0到无穷多次的意思。 ‘o*’ 表示有空字符或者一个及以上的o,那么这时候所有的内容都符合,会被全部显示出来;’oo*’ 表示第一个o一定存在,后面可以接多个o,也就是 o oo  ooo;依次类推往后。

55. 需要列出句子中,前后都有g的:grep –n ‘g.*g’ msg.txt  这里的.表示的就是任意字符,*和.组合就可以实现两个g中间有0个或者多个字符,可以输出 gg  gdg  gdfg

56. 限制字符个数: ‘o\{2\}’,查找时候,查找出连续的两个o的单词所在的行。

57. 字符个数限制:’go\{2,5\}g’ 查找,两个g中间有2-5个o的情况。

58. Sed

59. nl 列出文件内容,可以显示行号。

60. Sed中的function功能:

61. a:新增

62. c:替换,后接字符串,替换n行内容。

63. d:删除

64. i:插入

65. p:打印

66. s:替换,直接进行替换工作。

67. nl file.txt | sed ‘2,5d’ 显示的时候删除file.txt中的2-5行,’2,$d’删除2到最后行, d代表删除,实际文件中并没有被删除。

68. nl file.txt | sed ‘2a  drink tea’ 在第二行后面,也就是新增的第三行上加上drink tea  (需要添加两行的时候,使用‘2a drink tea \ 回车 drink beer’回车)

69.  nl file.txt | sed ‘2,5c This is 2-5’ 将第二到第五行替换成字符串This is 2-5

70. Sed –n ‘5,7p’ 表示将5到7行打印出来。

71. Sed ‘s/要被替换的字符串/新的字符串/g’ 替换方式。   ‘s/#.*$//g’ 将#后面的所有的内容删除。

72. Printf

73. Printf  ‘%s %t %s%t  %s%t’ $(cat config.txt) 格式化打印文件内容。

74. Date

75. Date命令时获得系统中的时间,在shell中使用该命令即可。

76. date --date=’2 days ago’ +%Y%m%d ,这样就可以获得前天的时间,这里的’2 days ago’ 不是瞎写的,在date命令中有简要的介绍, 在--date=紧跟字符串。

77. 简要的可以 date +%Y%m%d 获得日期。

78. 其余的使用方式可以在Linux下查询命令获得。

79. awk适用于一行分成多个段,进行处理

80. Last –n 5 | awk ‘{print $1 “\t” $3}’  大括号里面输入命令,做相应操作。$1表示第一列,$3表示第三列。

81. 变量名:NF:每一行拥有的字段总数; NR:目前awk所处理的是第几行数据;FS:目前的分隔字符,默认是空格键。 例如:‘{print $1 NR “\t” $3 NF}’

82. Diff文件比较命令

83. diff –b (忽略多个空格的区别)  -B(忽略空行的区别)  –i(忽略大小写的问题)

84. diff  oldFile.c newFile.c  > password.patch 将区别输出成补丁文件

85. patch –pN < path_file 取消N层的目录

86. path –R –pN < path_file 还原成原来的版本

87. ShellScript

88. Shell 脚本是纯文本文档,第一行的#!/bin/bash 用于声明,这个文件内的语法使用bash的语法。   其余的#都是注释。  

89. *********************************************************************

90. 使用touch命令,在shell脚本下创建文件:

91. #!/bin/bash

92. #Program:

93. #       createthree file, differ from the date in the filename

94. #2016/11/23

95. #

96. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

97. export PATH

98.  

99. #the info before create the file

100.          echo -e  "I will create threefile!"

101.          read -p "Please input the filename:" fileuser

102.           

103.          #get the right name of file

104.          filename=${fileuser:-"filename"}

105.           

106.          #use the date cmd to get filename

107.          date1=$(date --date='2 days ago' +%Y%m%d)

108.          date2=$(date --date='1 days ago' +%Y%m%d)

109.          date3=$(date +%Y%m%d)

110.          file1=${filename}${date1}

111.          file2=${filename}${date2}

112.          file3=${filename}${date3}

113.           

114.          #create the file

115.          touch "$file1"

116.          touch "$file2"

117.          touch "$file3"

118.          ****************************************************************

119.          简单的两个数的相乘shell 脚本:

120.          #cross two number

121.          PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

122.          export PATH

123.           

124.          echo -e "Input two number!"

125.          read -p "First number:" firstNum

126.          read -p "Second number:" secondNum

127.           

128.          #$((content)) can calculate numbers

129.          total=$(($firstNum*$secondNum))

130.          echo -e "The $firstNum * $secondNum is ==> $total"

131.          注:$((运算内容)),可以进行数值变量的计算工作。

132.          ******************************************************************

133.          Shell脚本的执行方式:

134.          1)sh shscript.sh  或者bash shscript.sh:这样执行的脚本是在子进程中,运行结果也并不返回到父进程中。例如在此脚本中设置了PATH为其他内容,在脚本执行完毕以后,PATH还是原先的值。

135.          2)source shscript.sh 或者 ./shscript.sh:这样执行的脚本是在父进程中,运行结果会影响到当前父进程中的变量。

136.          条件判断命令test

137.          Test –e /dmtasi && echo “exist” || echo “No exist” 测试这个文件是否存在,使用判断表达式

138.          -a参数,表示两个测试条件均成立

139.          -o参数,表示两个测试条件中任意一个成立即可

140.          !参数,表示反向状态,取反的意思,!true->false

141.          #!/bin/bash

142.          #Program:

143.          #       if the name is the name offile, print "this is a file"

144.          #       if the name is the name of adirectory, print "this is a directory"

145.          #       eles print "Noexist"

146.          #       test the permissions of thefilename

147.           

148.          PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

149.          export PATH

150.           

151.          read -p "input the filename:" filename

152.          #error input,if the filename is empty

153.          test -z $filename && echo "You must input a filename"&& exit 0

154.           

155.          #test the name is exist, if it is exist, -e return 0

156.          test ! -e $filename && echo "The file '$filename' is notexist" && exit 0

157.          #test the file

158.          test -f $filename && filetype="regular file"

159.          test -d $filename && filetype="diectory"

160.          test -r $filename && perm="readable"

161.          test -w $filename && perm="$perm writeable"

162.          test -x $filename && perm="$perm executable"

163.          #output the result

164.          echo "The file: '$filename' is '$filetype'"

165.          echo "The permissions are: $perm"

166.          注意:test搭配了相关参数以后,执行成功以后,返回true;失败以后返回false。然而!这些test命令执行成功以后,$?(执行指令后的返回码),却是0

167.           

168.          [] :判断符号

169.          [ -z “$PATH” ]; echo $? 测试PATH内容是否为空,参数仿照test命令的

170.          注意:1)中括号中的两边需要有空格隔开,不然会出错;

171.          2)中括号以内的每个组件需要用空格分隔;

172.          3)中括号内的变量最好用双引号括起来;

173.          4)中括号中的常量以单或双引号括起来。

174.          [ “$name” == “Zhang” ] 对于变量的判断。

175.           

176.          Shell script的默认变量($0 $1....

177.          /scriptname.sh opt1 opt2....   这里的/scriptname.sh代表的是$0 ,后面的参数依次是$1,$2,可以在脚本中直接使用。

178.          $#:代表后面接的参数的个数

179.          $@:表示所有的参数,可以用这个直接列出$1 $2.....

180.          Shift:写在脚本中,如shift 则拿走前面一个参数。Shift 3则拿走前面三个参数。

181.           

182.          条件判断式if ...;then....  elif... ;then…  elif…then…  else….then fi

183.          #!/bin/bash

184.          #Program:

185.          #       test the if then elif

186.          #2016/11/24

187.          #

188.           

189.          PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

190.          export PATH

191.          #input a cmd

192.          read -p "Yes or No?(y/n)" yn

193.          #test the cmd

194.          if [ "$yn" == "Y" ] || [ "$yn" =="y" ]; then #此句中,if后需要空格,中括号内两边需要空格,分号之后需要空格,总之要多加空格。

195.                   echo "Okcontinue!"

196.          elif [ "$yn" == "N" ] || [ "$yn" =="n" ]; then

197.                   echo"interrupt!"

198.          else

199.                   echo "I don't know whatyour choice is!"

200.          fi

201.          Case...in...esac状态判断

202.          #!/bin/bash

203.          #Program:

204.          #       test thecase_in_esac

205.          #2016/11/24

206.          #

207.          PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

208.          export PATH

209.          case $1 in  #第一个参数,是什么

210.              "hello")#input a hello

211.                  echo "Hello, how areyou?"

212.                   ;;     #必须以此结尾

213.              "")    #empty

214.               echo"You must input parameters!"

215.                   ;;

216.              *)  #other condition

217.                  echo"Usage $0 {hello}"

218.                   ;;

219.          esac    #结尾符号

220.          Function功能函数

221.          Function的功能类似于函数,也可以接受参数,例子如下

222.          #!/bin/bash

223.          #Program:

224.          #       test the function in theshell script. It will output what you input

225.           

226.          PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

227.          export PATH

228.           

229.          function printit(){

230.              echo "Your choise is $1"

231.          }

232.           

233.          echo "The program will print your selection!"

234.           

235.          case $1 in

236.              "one")

237.               printit 1 #这里的1,就是作为这个函数的参数,在这个函数体中,我们可以使用$1,来获得这个1参数。

238.                   ;;

239.              "two")

240.               printit 2

241.                   ;;

242.              "three")

243.                  printit 3

244.                   ;;

245.              *)

246.               echo"Usage $0(one|two|three)"

247.                   ;;

248.          esac

249.          循环(loop

250.          While do done    (不定循环)

251.          #!/bin/bash

252.          #Program:

253.          #       exist until the user inputyes

254.           

255.          PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

256.          export PATH

257.           

258.          while [ "$yn" != "yes" -a "$yn" !="YES" ]

259.          do

260.              read -p "Please inputyes/YES to stop the while..." yn

261.          done

262.          echo "Ok! you have input the right content!"

263.          until do done(其中的判断条件是,当条件成立的时候,就终止循环,和while结构相反)

264.          范式:

265.          until [ condition ]

266.          do

267.              程序内容

268.          done

269.          For…do…done(固定循环)

270.          #!/bin/bash

271.          #Program:

272.          #       test the for

273.           

274.          PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

275.          export PATH

276.           

277.          #output three animal

278.          for animal in dog cat elephant #以不同的变量,填入animal中

279.          do

280.              #echo "There are$(animal)s..."

281.              echo "there are$animal"

282.          done

283.           

284.          #output all the username

285.          users=$(cut -d ':' -f1 /etc/passwd) #get the name

286.          for username in $users

287.          do

288.              id $username

289.              finger $username

290.          Done

291.          使用for,对于数值的控制

292.          简写:

293.          s=0

294.          For( ( i=1; i<=$nu; i=i+1) )

295.          Do

296.              S=$(($s+$i))

297.          Done

298.          Sh的命令参数,可以用于调试脚本

299.          Sh –n ….sh 仅仅检查语法错误

300.          Sh –v 在执行前,先将script内容显示到屏幕上

301.          Sh –x 将使用到的script 内容显示到屏幕上。用于调试很有用

猜你喜欢

转载自blog.csdn.net/hello_world12138/article/details/53373948