Skip to content

Commit 33a8db8

Browse files
committed
字符串操作
1 parent 911b507 commit 33a8db8

File tree

1 file changed

+55
-9
lines changed

1 file changed

+55
-9
lines changed

shell.md

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)