shell和shell脚本
-
shell是一种应用程序,用户通过该应用程序提供的界面访问操作系统内核的服务。
-
shell脚本(shell script)是一种为shell编写的脚本程序。
第一个shell脚本
-
格式:shell脚本一般以如下的格式开始
#!/bin/bash # 或者 #!/usr/bin/php
一般‘#!’是一个约定的标记,其告诉系统该脚本需要什么解释器来执行。
-
脚本的执行
./test.sh
注意,脚本的执行一定要写为
./test.sh
,而不是test.sh
,运行其他二进制的程序也是一样的道理。如果直接写test.sh
,linux系统会去PATH
中查找有没有test.sh
,而只有/bin, /sbin, /usr/bin,/usr/sbin
等这些路径在PATH中,当前目录一般不再PATH中,所以写成test.sh
是找不到命令的,要使用./test.sh
表明在当前路径下查找。 -
脚本作为解释器参数
这种运行方式是,直接运行解释器,解释器的参数就是shell脚本的文件名:
#!/bin/sh test.sh #!/bin/php test.php
使用这种方式运行的脚本,不需要在第一行制定解释器信息。
变量
变量定义
定义变量时,变量名不加符号$
,比如:
test_var="abcd"
注意:变量名和等号之间不能有空格,这点跟其他的语言不太一样。
使用变量
使用一个定义过的变量,只需要在变量名前加符号$
,比如:
test_var="abcd"
echo $test_var
echo ${test_var}
变量名外边的花括号是可选的,加括号是为了在一个比较长的代码中识别出变量的边界。
推荐给所有变量加上花括号,这是一个好的变成习惯。
变量重定义
test_var="abcd"
echo ${test_var}
test_var="efgh"
echo ${test_var}
重定义时,只需要对其重新赋值即可。
注释
以符号#
开头的为注释,编译器不会执行。
多行注释
sh
不支持多行注释,每一行的头部加一个#
可以注释掉该行。
技巧:如果开发过程中,遇到大段的代码需要临时注释起来,过一会儿又需要取消注释,此时可以使用如下方法。
大段注释可以把需要注释掉的一段代码用一对花括号括起来,定义成一个函数,没有地方调用该函数,当然这一块代码就不会执行,能够达到和注释一样的效果。
字符串
shell中的字符串可以用单引号,也可以使用双引号,也可以不适用引号。
单引号
str=‘this is a string’
单引号使用的限制:
- 单引号中的任何字符都会原样输出,单引号字符串中的变量是无效的。
- 单引号字符串中不能出现单引号(对单引号使用转义符后也不行)
双引号
test_var="abcd"
str="Hello, I know your name is \"$test_var\" ! \n"
#上一行代码中\是"的转义符
- 双引号字符串中可以有变量
- 双引号中可以出现转义字符
字符串操作
字符串拼接
stringA="abcd"
stringB="efgh"
echo $stringA $stringB
获取字符串长度
string="abcd"
echo ${#string}
#输出:4
提取子字符串
string="alibaba is a great company"
echo ${string:1:4}
#输出:liba
流程控制
和JAVA,PHP等语言不一样,sh的流程控制不为空,在sh中,如果if对应的else分支没有语句执行,就不要写这个else。
if else
-
if
if condition then command1 command2 ... commandN fi
写成一行(适用于终端命令提示符):
if 'ps -ef | grep ssh'; then echo hello; fi
末尾的
fi
就是if
倒过来拼写。- if else
if condition then command1 command2 ... commandN else command fi
-
if else-if else
if condition1 then command1 elif condition2 command2 else commandN fi
- for while
for var in item1 item2 ... itemN do command1 command2 ... commandN done
写成一行:
for var in item1 item2 ... itemN; do command1; command2… done;
-
C风格的for
for (( EXP1; EXP2; EXP3 )) do command1 command2 command3 done
-
无限循环
while : do command done
常用的命令
-
字符串领域:
grep, awk, sed
三剑客。grep负责找出特定的行,awk将行拆分成多个字段,sed则可以实现更新插入删除等写操作。 -
ps:查看进程列表
-
grep
-
awk
-
sed
-
xargs
-
curl
感谢github@qinjx 的整理。