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 内容显示到屏幕上。用于调试很有用