Shell脚本知识点,编写时参考
Shell 脚本(shell script)是一种为 shell 编写的脚本程序。常说的shell通常都是指 shell 脚本,但shell和shell script是两个不同的概念。通常说“shell编程”都是指 shell 脚本编程,不是指开发 shell 自身。
一、Linux提供的shell解析器
[fff@hadoop101 ~]$ cat /etc/shells
/bin/sh 是bash的一个快捷方式
/bin/bash bash是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有的功能
/sbin/nologin 表示非交互,不能登录操作系统
/bin/dash 小巧,高效,功能相比少一些
/bin/tcsh 具有C语言风格的一种shell,具有许多特性,但是也有一些缺陷
?。 /bin/csh 是csh的增强版本,完全兼容csh
(一)bash和sh的关系
sh(Bourne Shell)是一个早期的重要shell
bash(Bourne-Again Shell)主要目标是与==POSIX==标准保持一致,同时兼顾对sh的兼容,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。
二者区别在于:bash有没开启POSIX模式。
sh 遵循POSIX规范:“当某行代码出错时,不继续往下解释”。
bash 就算出错,也会继续向下执行。
简单说,sh是bash的一种特殊的模式,sh就是开启了POSIX标准的bash, /bin/sh 相当于 /bin/bash --posix。
二、脚本入门
脚本格式
(1)开头
#!/bin/bash
或
#!/bin/env bash
#需要指定解析器
#!/bin/bash 是指此脚本使用/bin/bash来解释执行。
其必须在第一行才能生效,不在第一行,就是注释
(2)注释
单行注释:#
多行注释:
:<<EOF
注释内容
EOF
(3)特殊变量
1、$n
功能描述:n为数字,获取脚本名称或传入参数
$0:代表该脚本名称
$1-$9:代表第一到第九个参数
十以上的参数:十以上的参数需要用大括号包含,如${10}
2、$#
功能描述:获取所有输入参数个数,常用于循环
3、 ∗ 与 * 与 ∗与@
功能描述:这个变量代表**命令行中所有的参数 [ 传递给函数或脚本的所有参数 ]**
区别:
*$把所有的参数看成一个整体
$@把每个参数区分对待
不被双引号“”包含时
- 都以$1 2 … 2 … 2…n的形式输出所有参数。
被双引号“”包含时
- “$*”会将所有的参数作为一个整体,以“$1 2 … 2 … 2…n”的形式输出所有参数;
- “$@”会将各个参数分开,以“$1” “ 2 ” … ” 2”…” 2”…”n”的形式输出所有参数。
例子:
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
do
echo "hi $i"
done
for j in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "hi $j"
done
4、$?
功能描述:最后一次执行的命令的返回状态。
变量值为0,证明上一个命令正确执行;
变量值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了
[fff@hadoop101 ~]$ echo $?
0
三、流程控制
(一)if 判断
语法:
单个判断条件
if [ 条件判断式 ]
then
程序
fi
多个判断条件
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
注意事项:
(1)if 后要有空格
(2)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(二)case 语句
语法:
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
-
case行尾必须为单词 “in”,每一个模式匹配必须以右括号 “ )”结束。
-
双分号 “;;” 表示命令序列结束,相当于java中的break。
-
最后的 “ *)”表示默认模式,相当于java中的default。
例子:群起Hadoop集群
#!/bin/bash
case $1 in
"start" )
/opt/module/hadoop-3.1.3/sbin/start-dfs.sh
ssh hadoop103 /opt/module/hadoop-3.1.3/sbin/start-yarn.sh
/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver
;;
"stop" )
/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh
ssh hadoop103 /opt/module/hadoop-3.1.3/sbin/stop-yarn.sh
/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver
;;
esac
(三)for 循环
语法:
形式一:
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
例子:
#!/bin/bash
s=0
for((i=0;i<=100;i++))
do
s=$[$s+$i]
done
echo $s
形式二:
for 变量 in 值1 值2 值3…
do
程序
done
例子:将输入的命令发送到所有的会话窗口
#! /bin/bash
#Desc:作用:将输入的命令发送到所有的会话窗口
for i in hadoop102 hadoop103 hadoop104
do
echo --------- $i ----------
ssh $i "$*"
done
(四)while 循环
语法:
while [ 条件判断式 ]
do
程序
done
例子:从1加到100
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo $s
四、自定义函数
语法:
[ function ] funname[()]
{
Action;
[return int;]
}
funname
注意事项:
(1)必须在调用函数之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。
(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
五、检查脚本
查看脚本语法错误 : bash -n 脚本名称
查看脚本的执行流程 :bash -x 脚本名称