注:
- 本文说的都是bash(Bourne Again Shell),是sh(Bourne Shell)的扩展
- 扩展名不会影响脚本执行,见名知意就行,一般情况下扩展名是sh
- Shell注释:以 # 开头的行就是注释,会被解释器忽略,但是sh里面没有多行注释,只能每行加一个#
- 从Ubuntu 6.10开始,默认使用dash,需要手动执行命令将dash改为bash, 至于bash和dash的区别,详见https://blog.csdn.net/hshl1214/article/details/51122663
- 命令:sudo dpkg-reconfigure dash
- 然后在出现的页面中选择NO,之后就可以正常运行脚本了
运行Shell脚本的两种方法:
-
作为可执行程序
- 让脚本文件具有可执行权限
chmod +x file 加上执行权限,否则会提示无执行权限。 - ./文件名
- 注意,例要执行test.sh脚本,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
- 让脚本文件具有可执行权限
-
作为解释器参数
/bin/sh test.sh
/bin/php test.php
Shell变量
-
定义变量的时,变量前不加美元符号,变量名和等号之间不能有空格
name="小明"
-
使用语句给变量赋值
for file in `ls /etc` for file in $(ls /etc)
-
使用变量 使用一个定义过的变量,只要在变量名前加 $ 符号即可
第二次给变量赋值的时候也不能加 $
变量名外加上花括号能够帮助识别器识别变量的边界,推荐给所有变量加上花括号 -
只读变量 readonly
myUrl="http://www.w3cschool.cc" readonly myUrl
-
删除变量 unset
unset 变量名
-
Shell字符串
字符串可以用单引号,也可以使用双引号,也可以不用引号。-
获取字符串长度
string="abcd" echo ${#string} #输出 4
-
提取子字符串
#从第2个字符开始截取4个字符 string="runoob is a great site" echo ${string:1:4} # 输出 unoo
-
查找字符串
string="runoob is a great company" echo `expr index "$string" is` # 输出 8
-
-
Shell数组 Shell只支持一维数组
-
定义数组 数组名=(值1 值2 值3 ……)
或
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen -
读取数组
${数组名[下标]}
使用@符号可以获取数组中的所有元素
例:echo ${array_name[@]} -
获取数组的长度
length=${#array_name[@]} length=${#array_name[*]}
-
Shell传递参数
请参考:菜鸟教程参数传递 在执行脚本的时候可以向脚本传递参数,脚本获取参数的格式为:$n
Shell基本运算符
-
原生的bash不支持数学运算,但可以通过 awk 和 expr 命令来实现
expr 是一款表达式计算工具,可以用来完成表达式的求值操作
例:两个数相加 (注意==使用的是反引号,不是单引号==)#!/bin/bash val=`expr 2 + 2` echo "两数之和为 : $val"
-
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
-
== != 用来比较两个数字
Shell test命令
请参考:菜鸟教程 test命令
Shell流程控制
-
if else 相关
if condition1 then command1 elif condition2 then command2 else commandN fi
-
for循环
for var in item1 item2 ... itemN do command1 command2 ... commandN done
-
while 循环
while condition do command done
-
无限循环
#无限循环语法格式: while : do command done #或者 while true do command done #或者 for (( ; ; ))
-
util 循环 until循环执行一系列命令直至条件为真时停止。
until condition do command done
-
case
例:echo '输入 1 到 4 之间的数字:' echo '你输入的数字为:' read aNum case $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;; esac
-
跳出循环
- break
- continue
Shell函数
-
函数定义
[ function ] funname [()] { action; [return int;] }
-
函数参数
funWithParam(){ echo "第一个参数为 $1 !" echo "第二个参数为 $2 !" echo "第十个参数为 $10 !" echo "第十个参数为 ${10} !" echo "第十一个参数为 ${11} !" echo "参数总数有 $# 个!" echo "作为一个字符串输出所有参数 $* !" } funWithParam 1 2 3 4 5 6 7 8 9 34 73
Shell 输入/输出重定向
1. 常见符号
```
> >> < <<
```
2. 输出重定向
```
command1 > file1
```
注意:任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符
3. 输入重定向
```
command1 < file1
```
4. Here Document
Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。
```
command << delimiter
document
delimiter
```
注意:结尾的delimiter前后一定要顶格写,前面及后面都不能有任何字符
例:
```
cat << EOF
欢迎来到
菜鸟教程
www.runoob.com
EOF
```
5. /dev/nul是一个特殊的文件,写入到它的内容都会被丢弃,将命令的输出重定向到它会起到“禁止输出”的效果
```
$ command > /dev/null
```
Shell 文件包含
. filename # 注意点号(.)和文件名中间有一空格
或
source filename
例: 有两个脚本,内容如下 test1.sh
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
url="http://www.runoob.com"
test2.sh
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
#使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者使用以下包含文件代码
# source ./test1.sh
echo "菜鸟教程官网地址:$url"
然后执行test2.sh
$ chmod +x test2.sh
$ ./test2.sh
#结果:菜鸟教程官网地址:http://www.runoob.com
注:本文参考:菜鸟教程文档 如需转载请注明出处:http://www.cnblogs.com/zhuchenglin/p/8743180.html
来源:oschina
链接:https://my.oschina.net/u/4325061/blog/4017157