## shell脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
**简单的shell脚本**
~~~
#!/bin/bash
echo "Hello World !"
~~~
**运行shell脚本的两种方法**
1. 作为可执行程序
~~~
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
~~~
2. 作为解析器参数
~~~
/bin/sh test.sh
/bin/php test.php
~~~
**shell 变量**
>[danger]变量命名规则:
>* 变量名和等号之间不能有空格
>*命名只能使用英文字母,数字或下划线,首个字符不能以数字开头
>* 中间不能有空格可以用下划线_
>*不能使用标点符号
>*不能使用bash里的关键字(可用help命令查看保留的关键字)
变量命名
~~~
RUNOOB
LD_LIBRARY_PATH
_var
var2
~~~
**使用shell变量**
~~~
your_name="qinjx"
echo $your_name
echo ${your_name}
~~~
**shell中的只读变量**
~~~
#!bin/sh
my_name="shell"
readonly my_name
my_name="shell_test"
[root@mini2 shell]# sh testdo.sh
testdo.sh: line 4: my_name: readonly variable
~~~
**shell中删除变量**
变量被删除后不能再次使用。unset 命令不能删除只读变量。
~~~
#!/bin/sh
my_name="shell"
unset my_name
echo $my_name
~~~
**shell字符串**
>[success] 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
1. 单引号
~~~
#!/bin/sh
str='this is str'
echo $str
~~~
2. 双引号
~~~
#!/bin/sh
my_name='shell'
str="I study $my_name"
echo $str
~~~
**shell中的字符串拼接**
~~~
[root@mini2 shell]# vi testdo.sh
#!bin/sh
my_name="shell"
str="Hello,"$my_name"!"
echo $str
str1="Hello,${my_name}!"
echo $str1
my_name1='shell_study'
str2='hello,'$my_name1'!'
echo $str2
str3='hello,${my_name1}!'
echo $str3
[root@mini2 shell]# sh testdo.sh
Hello,shell!
Hello,shell!
hello,shell_study!
hello,${my_name1}!
~~~
**shell中获取字符串的长度**
~~~
#!bin/sh
str="abcd"
echo ${#str}
[root@mini2 shell]# sh testdo.sh
4
~~~
**shell中提取子字符串**
~~~
[root@mini2 shell]# vi testdo.sh
#!bin/sh
str="abcd"
echo ${str:1:2}
[root@mini2 shell]# sh testdo.sh
bc
~~~
**shell中查找子字符串**
查找i或c的位置(哪个字母先出现就计算出哪个)
~~~
[root@mini2 shell]# vi testdo.sh
#!bin/sh
str="where is abcd"
echo `expr index "$str" ic`
[root@mini2 shell]# sh testdo.sh
7
~~~
**shell中的数组**
~~~
#定义数组
array=(value0 value1 value2)
[root@mini2 shell]# vi testdo.sh
#!bin/sh
array=(value0 value1 value2)
echo ${array[1]} #${数组名[下标]}
echo ${array[@]} #使用@符号可以获取数组中所有元素
[root@mini2 shell]# sh testdo.sh
value1
value0 value1 value2
~~~
**获取数组的长度**
~~~
[root@mini2 shell]# vi testdo.sh
#!bin/sh
array=(value0 value1 value2)
length=${#array[@]} #获取数组的长度
length1=${#array[*]} #获取数组的长度
length2=${#array[1]} #获取数组中某个元素的长度
echo $length $length1 $length2
[root@mini2 shell]# sh testdo.sh
3 3 6
~~~
**shell中的注释**
1. 单行注释
以"#"开头的行就是注释,会被解释器忽略
2. 多行注释
~~~
[root@mini2 shell]# vi testdo.sh
#!bin/sh
:<<EOF
这是多行注释
这是多行注释
EOF
或者
[root@mini2 shell]# vi testdo.sh
#!bin/sh
:<<!
这是多行注释
这是多行注释
!
~~~
**shell中传递参数**
~~~
#!bin/sh
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
[root@mini2 shell]# chmod +x testdo.sh
[root@mini2 shell]# sh testdo.sh 1 2 3
Shell 传递参数实例!
执行的文件名:testdo.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
~~~
|参数 |说明|
|--|--|
|$# |传递到脚本的参数个数
|$*| 以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。|
|$$ |脚本运行的当前进程ID号|
|$! |后台运行的最后一个进程的ID号|
|$@ |与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。|
|$- |显示Shell使用的当前选项,与set命令功能相同。|
|$? |显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。|
~~~
[root@mini2 shell]# vi testdo.sh
#!bin/sh
echo "Shell 传递参数实例!";
echo "第一个参数为:$1";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";
[root@mini2 shell]# sh testdo.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3
~~~
>[danger]$* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
~~~
#!/bin/bash
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
#执行脚本,输出结果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3
~~~
**shell中运算符**
Shell 和其他编程语言一样,支持多种运算符,包括:
* 算数运算符
* 关系运算符
* 布尔运算符
* 字符串运算符
* 文件测试运算符
> expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
~~~
[root@mini2 shell]# vi testdo.sh
#!bin/sh
val=`expr 2 + 2`
echo "两数之和为:$val"
[root@mini2 shell]# sh testdo.sh
两数之和为:4
~~~
1. 算术运算符
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
| 运算符 |说明| 举例|
|--|--|--|
| +| 加法| `expr $a + $b` 结果为 30。|
|-| 减法 |`expr $a - $b` 结果为 -10。|
|*| 乘法| `expr $a \* $b` 结果为 200。|
|/ |除法| `expr $b / $a` 结果为 2。|
|%| 取余| `expr $b % $a` 结果为 0。|
|=| 赋值 |a=$b 将把变量 b 的值赋给 a。|
|==| 相等。|用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。|
|!= |不相等。|用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。|
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
~~~
[root@mini2 shell]# vi testdo.sh
val=`expr 2 + 2`
#!bin/sh
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
~
"testdo.sh" 27L, 309C written
[root@mini2 shell]# sh testdo.sh
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b
#计算(2+3) X 4
[root@mini2 shell]# echo `expr \`expr 2 + 3\` \* 4` 或 $(((2+3)*4))
~~~
2. 关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
| 运算符| 说明 | 举例|
|--|--|--|
| -eq| 检测两个数是否相等,相等返回 true。| [ $a -eq $b ] 返回 false。|
| -ne| 检测两个数是否不相等,不相等返回 true。| [ $a -ne $b ] 返回 true。|
| -gt |检测左边的数是否大于右边的,如果是,则返回 true。| [ $a -gt $b ] 返回 false。|
| -lt| 检测左边的数是否小于右边的,如果是,则返回 true。| [ $a -lt $b ] 返回 true。|
| -ge| 检测左边的数是否大于等于右边的,如果是,则返回 true。| [ $a -ge $b ] 返回 false。|
| -le| 检测左边的数是否小于等于右边的,如果是,则返回 true。| [ $a -le $b ] 返回 true。|
~~~
[root@mini2 shell]# vi testdo.sh
#!/bin/sh
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a 大于 b"
else
echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a 小于 b"
else
echo "$a -lt $b: a 不小于 b"
fi
[root@mini2 shell]# sh testdo.sh
10 -eq 20: a 不等于 b
10 -ne 20: a 不等于 b
10 -gt 20: a 不大于 b
10 -lt 20: a 小于 b
10 -ge 20: a 小于 b
10 -le 20: a 小于或等于 b
~~~
**shell中的for循环**
第一种:
~~~
for N in 1 2 3
do
echo $N
done
或者写成一行:
for N in 1 2 3;do echo $N;done
或者
for N in {1,2,3};do echo $N;done
[root@mini2 shell]# vi testdo.sh
#!/bin/sh
for N in $*
do
echo $N
done
[root@mini2 shell]# sh testdo.sh 1 2 3
1
2
3
~~~
第二种:
~~~
for ((i=0;i<=5;i++))
do
echo "welcome $i"
done
或者
[root@mini2 shell]# for ((i=0;i<=5;i++));do echo "welcome $i";done
~~~
**shell中的while循环**
~~~
#!/bin/sh
int=1
while(( $int<=5 ))
do
echo $int
let int++ #或者 加上双引号“int++”
done
[root@mini2 shell]# sh testdo.sh
1
2
3
4
5
~~~
**shell中的until循环**
>[danger]until 循环执行一系列命令直至条件为 true 时停止。
>until 循环与 while 循环在处理方式上刚好相反。
>一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。
~~~
[root@mini2 shell]# vi testdo.sh
#!/bin/sh
a=0
until [ ! $a -lt 10 ] #不小于10的情况下执行
do
echo $a
a=`expr $a + 1`
done
[root@mini2 shell]# sh testdo.sh
0
1
2
3
4
5
6
7
8
9
~~~
**shell中的case**
~~~
[root@mini2 shell]# vi testdo.sh
#!/usr/bin
echo "输入1到2之间的数字"
echo '你输入的数字为'
read aNum
case $aNum in
1) echo '你选择了1'
;;
2) echo '你选择了2'
;;
*) echo '你没有输入1-2之间的数字'
;;
esac
[root@mini2 shell]# sh testdo.sh
输入1到2之间的数字
你输入的数字为
1
你选择了1
[root@mini2 shell]# sh testdo.sh
输入1到2之间的数字
你输入的数字为
2
你选择了2
[root@mini2 shell]# sh testdo.sh
输入1到2之间的数字
你输入的数字为
3
你没有输入1-2之间的数
~~~
**shell中的if**
第一种:
~~~
[root@mini2 shell]# vi testdo.sh
#!/usr/bin
echo '你输入的数字为'
read aNum
if(( $aNum<2 ))
then
echo "小于2"
elif(( $aNum==2 ))
then
echo "等于2"
else
echo "大于2"
fi
[root@mini2 shell]# sh testdo.sh
你输入的数字为
1
小于2
[root@mini2 shell]# sh testdo.sh
你输入的数字为
2
等于2
[root@mini2 shell]# sh testdo.sh
你输入的数字为
3
大于2
[root@mini2 shell]#
~~~
第二种:
~~~
#!/usr/bin
echo '你输入的数字为'
read aNum
if [ $aNum -lt 2 ]
then
echo "小于2"
elif [ $aNum -eq 2 ]
then
echo "等于2"
elif [ $aNum -gt 2 ]
then
echo "大于2"
fi
[root@mini2 shell]# sh testdo.sh
你输入的数字为
1
小于2
[root@mini2 shell]# sh testdo.sh
你输入的数字为
2
等于2
[root@mini2 shell]# sh testdo.sh
你输入的数字为
3
大于2
[root@mini2 shell]#
~~~
**shell中的跳出循环**
1. break命令
break命令允许跳出所有循环(终止执行后面的所有循环)。
~~~
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
break
;;
esac
done
执行以上代码,输出结果为:
输入 1 到 5 之间的数字:3
你输入的数字为 3!
输入 1 到 5 之间的数字:7
你输入的数字不是 1 到 5 之间的! 游戏结束
~~~
2. continue
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
~~~
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的!"
continue
echo "游戏结束"
;;
esac
done
~~~
- 前言准备
- Linux新服务器的前期配置
- 认识linux下的Web服务器
- Linux的基本配置
- LNMP一键安装包快速部署web服务器
- LAMP服务器环境部署
- LAMP服务器管理
- LNMP服务器环境部署
- LNMP服务器管理
- lnmp一键安装包-常见问题
- 使用包管理器快速部署环境
- 包管理器快速部署LAMP服务器环境
- 升级php和mysql版本
- 包管理器快速部署LNMP服务器环境
- 使用源码包部署Linux服务器web环境
- 编译LAMP服务器环境部署
- apache安装与配置
- mysql的安装与配置
- PHP的安装与配置
- 编译LNMP服务器环境部署
- nginx服务启动脚本
- 源码安装常见问题
- Centos6与Centos7的区别
- 默认控制系统服务工具不同
- 设置开机启动的方式不同
- 编写service启动脚本
- 编写systemctl启动脚本
- 服务器安全
- 隐藏服务器信息
- Linux服务器防火墙设置
- 防火墙设置脚本
- 邮件发送
- 任务脚本的编写
- 服务器磁盘和服务器健康状态脚本
- 服务器登录报警脚本
- 数据库备份脚本
- 定时任务及应用
- 常见问题
- linux中使用ping命令不同的问题
- Linux中无法发送邮件
- mailx通过ssl方式发送邮件
- Mysql配置文件
- Linux TCP/UDP 常用端口
- Linux常见命令
- 系统信息
- 关机 (系统的关机、重启以及登出 )
- 文件和目录
- 文件搜索
- 挂载一个文件系统
- 磁盘空间
- 用户和群组
- 文件的权限
- 文件的特殊属性
- 打包和压缩文件
- RPM包
- YUM软件包升级器
- DEB 包 (Debian, Ubuntu 以及类似系统)
- APT 软件工具 (Debian, Ubuntu 以及类似系统)
- 查看文件内容
- 文本处理
- 字符设置和文件格式转换
- 文件系统分析
- 初始化一个文件系统
- SWAP文件系统
- 备份
- 光盘
- 网络-(以太网和WIFI无线)
- vi命令
- cut命令 截取
- Mysql
- MySQL备份-增量备与恢复命令实战
- mysqlbinlog
- mysql的安装
- 卸载mysql
- mysql多实例安装
- mysql 常用基础命令操作
- linux安装jdk、rpm安装mysql
- linux制作本地yum源
- shell脚本