1.shell简介
1.1 什么是shell
Shell 是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
交互的方式:从键盘输入命令,通过/bin/bash的解析,可以立即得到Shell的回应
[root@clsn ~]# ls
anaconda-ks.cfg
[root@clsn ~]# echo ls |bash
anaconda-ks.cfg
非交互的方式: 脚本
1.2 shell脚本
shell脚本就是一种专门使用shell编写的脚本程序,它虽然没有C++、Java、Python等一系列高级语言功能强大,但是在服务器运维领域以及嵌入式开发领域,shell脚本具有举足轻重的地位。
脚本语言定义:
为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言。
特点:程序代码即是最终的执行文件,只是这个过程需要解释器的参与,所以说脚本语言与解释型语言有很大的联系。脚本语言通常是被解释执行的,而且程序是文本文件。
典型的脚本语言有,JavaScript,Python,shell等。
1.3 运行shell脚本
- 方式1(输入脚本的绝对路径或相对路径)
说明:首先要赋予helloworld.sh脚本的+x权限,再执行脚本
比如./hello.sh 或者使用绝对路径/root/shcode/hello.sh
- 方式2(sh+脚本)
说明:不用赋予脚本+x权限,直接执行即可。
比如 sh hello.sh,也可以使用绝对路径
shell脚本编写如下,并将其保存为test.sh
,进入存放此文件目录
#!/bin/bash
echo "Hello World"
- 当作为可执行程序运行时候
chmod +x test.sh # 赋予可执行权限
./test.sh # 执行程序
- 作为解释器参数运行
/bin/sh test.sh # 执行命令
/bin/php test.php # 执行命令
1.4 shell注释
- 单行注释:和python注释相同,以#号开头作为单行注释
# 这是一个注释
# author:ohuohuoo
# date:`date`
- 多行注释:可以将其定义为一个花括号的注释函数,也可以用多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
# EOF可以换成其他符号
:<<E!
注释内容...
注释内容...
注释内容...
!
1.5 shell编写的基本步骤
- 建立shell文件
- 赋予shell文件可执行程序权限(使用chmod命令修改权限)
- 执行shell文件(直接运行赋予权限后的二进制文件)
2.shell变量
- Linux Shell中的变量分为,系统变量和用户自定义变量。
- 系统变量:
$HOME
、$PWD
、$SHELL
、$USER
等等,比如:echo $HOME
等等. - 显示当前shell中所有变量:
set
2.1 变量定义
- 定义变量: 变量名=值
- 撤销变量: unset变量
- 声明静态变量: readonly变量,注意:不能unset
#!/bin/bash
#TASK1:define variable A
A=100
#Output A : $
echo A=$A
echo "A=$A"
#TASK2: cancel A
unset A
echo "A=$A"
#task3 define static variable B=2
readonly B=2
echo "B=$B"
#unset B 不允许操作
#将指令返回的结果赋给变量
C=date
D=`date`
E=$(date)
echo "C=$C"
echo "D=$D"
echo "E=$E"
#使用环境变量TOMCAT_HOME
echo "tomcat_home=$TOMCAT_HOME"
"var.sh" 28L, 372C
结果:
shell中,英文符号"$"
用于取变量值
如果在变量中使用系统命令,需要加上 " `"符号(ESC键下方)
DATE1=`date`
DATE2=$(date)
2.2 使用变量
使用变量的时,用英文符号"$"取变量值,对于较长的变量名,建议加上{ }花括号,帮助解释器识别变量的边界,如下
name="test_name"
echo "My name is ${name}and you"
2.3 环境变量
- export变量名=变量值(功能描述:将shell变量输出为环境变量/全局变量)
- source 配置文件(功能描述:让修改后的配置信息立即生效)
- echo $变量名 (功能描述:查询环境变量的值)
2.4 传递参数
- 在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:
$n
。 - n 代表一个数字,
$0
为命令本身,$1
1为执行脚本的第一个参数,$2
为执行脚本的第二个参数,以此类推……,10以上参数用大括号包含${10}
echo "传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
执行:
chmod +x test.sh
./test.sh 1 2 3
结果:
$*
: 代表命令行中所有的参数,$*
把所有的参数看成一个整体;$@
: 代表命令行中所有的参数,不过$@
把每个参数区分对待;$#
: 代表命令行中所有参数的个数;$$
脚本运行的当前进程ID号$!
后台运行的最后一个进程的ID号
2.5 预定义变量
3.shell字符串
3.1 字符串类型
-
使用单引号
str='this is a string'
-
使用双引号
name="ohouhuoo"
str="please input your \"$name"\"
echo -e $str
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;可以在双引号中使用变量;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用;
- 可以在双引号中使用转移字符;
3.2 字符串操作
获取字符串长度
使用" #
"符号对字符串进行取值
string="abcd"
echo ${#string} # 输出 4
提取子字符串
使用字符串的截取命令,用于提取部分字符串
string="this is a test"
echo ${string:2:6} # 表示从第3个字符开始截取
查找字符串
用于查找字符的位置,输出结果为字符在字符串中所占的数据位置,如果查找多个字符,那哪个字母先出现就计算哪个;
string="this is a test"
echo `expr index "$string" it` # 输出 1
查找it中i和t两个字符,t先出现,输出为1
4.shell数组
4.1 定义数组
# 一般定义
array_name=(value1 value2 value3 value4)
# 多级定义
array_test=(
value1
value2
value3
value4
)
#
array_text[0]=value0
array_text[1]=value1
array_text[3]=value3
...
4.2 数组操作
读取数组
和读取变量名相同,使用$符号,需要加上下标名
valuen=${array_name[n]}
echo ${array_name[@]} # 读取所有
获取数组长度
获取数组长度的方法与获取字符串长度的方法相同
# 取得数组元素的个数
length=${#array_name[@]} # 从头到尾取
# 或者
length=${#array_name[*]} # 取所有
# 取得数组单个元素的长度
lengthn=${#array_name[n]} # 取特定
5.shell运算符
shell想要使用这些运算符,需要结合其他命令和工具来使用(因为shell中不支持简单的数学运算),如使用算符运算符就需要搭配的常用的工具有两种
- awk
- expr
#!/bin/bash
#计算(2+3)*4
#1)
RES1=$(((2+3)*4))
echo "res1=$RES1"
#2)
RES2=$[(2+3)*4]
echo "res2=$RES2"
#3) expr
TEMP=`expr 2 + 3`
#打空格 否则输出字符串
#乘法 \*
RES3=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "res4=$RES3"
#计算命令行两个参数的和
SUM=$[$2+$1]
echo "sum=$SUM"
算数运算符
运算符 | 说明 | 例子 |
---|---|---|
+ | 加 | expr $a + $b |
- | 减 | expr $a - $b |
\* | 乘 | expr $a \* $b |
/ | 除 | expr $a / $b |
% | 取余 | expr $a % $b |
= | 赋值 | a = $b |
== | 相等则返回 true | [ $a != $b ] |
!= | 不相等返回 true | [ $a != $b ] |
- 符号左右打空格 否则输出字符串
关系运算符
指定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。 |
布尔运算符
逻辑运算符
字符串运算符
文件测试运算符
6.shell编程中的命令
6.1 echo命令
6.2 printf命令
6.3 test命令
7.shell流程控制
7.1 if else条件
格式:
if condition
then
command1
command2
...
commandN
fi
# 写成单行
if condition;then command1; command2;fi
#存在不满足的条件
if condition
then
command1
command2
...
commandN
else
command
fi
举例:
#!/bin/bash
#1)"ok"是否等于"ok"
#判断语句:使用=
if [ "ok" = "ok" ]
then
echo "equal"
fi
#2)23是否大于22
#判断语句:使用 -ge
if [ 23 -ge 22 ]
then
echo "大于"
fi
#3):/root/shcode/ifdemo.txt 目录中文件是否存在
#判断语句:使用 -f
if [ -f /root/shcode/ifdemo.txt ]
then
echo "存在"
fi
#4)
if [ ppp ]
then
echo "output evyth"
fi
7.2 case条件
格式:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
- 取值后面需要加上
in
- 每一模式必须以
右括号
结束 - 每个模式结束后使用
;;
符号结尾 - 如果没有找到对应的模式。以
*
结尾,并跳出case - case需要搭配
esac
结尾,与C语言中的switch … case语句类似
举例:
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read num
case $num in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
执行脚本,运行如下:
输入 1 到 5 之间的数字:4
你输入的数字为 4!
输入 1 到 5 之间的数字:8
你输入的数字不是 1 到 5 之间的! 游戏结束
case中想要跳出循环有两个命令:break
和continue
7.3 for循环
格式:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
# 写成一行同样使用分号将语句分开
- in列表中可以包含替换、字符串和文件名等
- in列表是可选的,如果默认不适用,将会循环使用命令行中的位置参数
举例:
for num in 1 2 3 4 5
do
echo "The value is: $num"
done
结果:
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
7.4 while循环
格式:
while condition
do
command
done
输入值跳出循环举例:
echo '按下 <Q> 退出'
echo -n '输入你最喜欢的歌名: '
while read SONG
do
echo "啊!$SONG 真是一首好歌"
done
7.5 until循环
8.shell函数
8.1 定义函数
[ function ] funname [()]
{
action;
[return int;]
}
- function fun () 表示有返回参数的函数(如同C语言中的有返回类型的函数(int,char等))
- fun() 表示无返回参数的函数(类似于C语言中的void类型函数)
- 使用return可以返回参数值(一般为数值n),如果不使用,将默认以最后一条命令运行的结果作为返回值
8.2 参数定义
此外想要使用shell函数传递参数时,需要在函数体的内部,通过 $n 的形式来获取参数的值,与其他语言不同的是,这不是在定义函数的时候就给定参数,而是在函数体中获取到的参数,例如,$1表示第一个参数,$2表示第二个参数,参数调用列表如下
参数处理 | 说明 |
---|---|
$# | 传递到脚本或函数的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
举例:
#!/bin/bash
FunParam(){
echo "输入第一个参数 $1 !"
echo "输入第二个参数 $2 !"
echo "输入第十个个参数 $10 !"
echo "参数总数共 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
FunParam 1 2 3 4 5 6 7 8 9 10
结果
第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
参数总数有 10 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 10!