@@ -57,7 +57,7 @@ Bash是Bourne shell的替代品,属GNU Project,二进制文件路径通常
5757
5858在CentOS里,/bin/sh是一个指向/bin/bash的符号链接:
5959
60- [root@centosraw pp ]# ls -l /bin/*sh
60+ [root@centosraw ~ ]# ls -l /bin/*sh
6161 -rwxr-xr-x. 1 root root 903272 Feb 22 05:09 /bin/bash
6262 -rwxr-xr-x. 1 root root 106216 Oct 17 2012 /bin/dash
6363 lrwxrwxrwx. 1 root root 4 Mar 22 10:22 /bin/sh -> bash
@@ -106,7 +106,7 @@ shell只定义了一个非常简单的编程语言,所以,如果你的脚本
106106
107107- 它的函数只能返回字串,无法返回数组
108108- 它不支持面向对象,你无法实现一些优雅的设计模式
109- - 它是解释型的,一边解释一边执行,连PHP那种预编译都不是,如果你的脚本包含语法错误 ,只要没执行到这一行,它就不会报错
109+ - 它是解释型的,一边解释一边执行,连PHP那种预编译都不是,如果你的脚本包含错误(例如调用了不存在的函数) ,只要没执行到这一行,就不会报错
110110
111111### 环境兼容性
112112如果你的脚本是提供给别的用户使用,使用sh或者bash,你的脚本将具有最好的环境兼容性,perl很早就是linux标配了,python这些年也成了一些linux发行版的标配,至于mac os,它默认安装了perl、python、ruby、php、java等主流编程语言。
@@ -154,13 +154,24 @@ shell只定义了一个非常简单的编程语言,所以,如果你的脚本
154154
155155除了显式地直接赋值,还可以用语句给变量赋值,如:
156156
157- for file in "usr bin etc"
157+ for file in `ls / etc`
158158
159159### 使用变量
160160使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
161161
162162 your_name="qinjx"
163163 echo $your_name
164+ echo ${your_name}
165+
166+ 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
167+
168+ for skill in Ada Coffe Action Java do
169+ echo "I am good at ${skill}Script"
170+ done
171+
172+ 如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
173+
174+ 推荐给所有变量加上花括号,这是个好的编程习惯。IntelliJ IDEA编写shell script时,IDE就会提示加花括号。
164175
165176### 重定义变量
166177已定义的变量,可以被重新定义,如:
@@ -194,32 +205,62 @@ sh里没有多行注释,只能每一行加一个#号。就像这样:
194205 #
195206 ##### 用户配置区 结束 #####
196207
197- 如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,就连有语法错误,都不碍事,没有人调用的时候,解释器根本不处理这块代理的 。
208+ 如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果 。
198209
199210## 字符串
200- 字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了,哈哈),字符串可以用单引号,也可以用双引号。单双引号的区别跟PHP类似。
201-
202- - 单引号里的任何字符都会
211+ 字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了,哈哈),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。
203212
204213### 单引号
214+
205215 str='this is a string'
216+
206217单引号字符串的限制:
207218
208219- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
209220- 单引号字串中不能出现单引号(对单引号使用转义符后也不行)
210221
211222### 双引号
223+
212224 your_name='qinjx'
213- str="Hello, I know your are \' $your_name \' "
225+ str="Hello, I know your are \" $your_name\"! \n "
214226
215227- 双引号里可以有变量
216228- 双引号里可以出现转义字符
217229
230+ ### 字符串操作
231+ #### 拼接字符串
232+
233+ your_name="qinjx"
234+ greeting="hello, "$your_name" !"
235+ greeting_1="hello, ${your_name} !"
236+
237+ echo $greeting $greeting_1
238+
239+ #### 获取字符串长度:
240+
241+ string="abcd"
242+ echo ${#string} #输出 4
243+
244+ #### 提取子字符串
245+
246+ string="alibaba is a great company"
247+ echo ${string:1:4} //输出liba
248+
249+ #### 查找子字符串
250+
251+ string="alibaba is a great company"
252+ echo `expr index "$string" is`
253+
254+ #### 更多
255+ 参见本文档末尾的参考资料中[ Advanced Bash-Scripting Guid Chapter 10.1] ( http://tldp.org/LDP/abs/html/string-manipulation.html )
256+
257+
218258## 管道
219259
220260## 条件判断
221261
222262## 流程控制
263+ 不可为空
223264### if else
224265### for while
225266### switch case
@@ -241,4 +282,9 @@ sh里没有多行注释,只能每一行加一个#号。就像这样:
241282### awk
242283### sed
243284### xargs
244- ### curl
285+ ### curl
286+
287+ ## 参考资料
288+ - [ Advanced Bash-Scripting Guide] ( http://tldp.org/LDP/abs/html/ ) ,非常详细,非常易读,大量example,既可以当入门教材,也可以当做工具书查阅
289+ - [ Unix Shell Programming] ( http://www.tutorialspoint.com/unix/unix-shell.htm )
290+ - [ Linux Shell Scripting Tutorial - A Beginner's handbook] ( http://bash.cyberciti.biz/guide/Main_Page )
0 commit comments