Shell脚本知识点----编写时参考[if、case、for、while、自定义函数、特殊变量……]

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 … 2n的形式输出所有参数。

被双引号“”包含时

  • “$*”会将所有的参数作为一个整体,以“$1 2 … 2 … 2n”的形式输出所有参数;
  • “$@”会将各个参数分开,以“$1” “ 2 ” … ” 2”…” 2n”的形式输出所有参数。

例子:

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
注意事项:
  1. case行尾必须为单词 “in”,每一个模式匹配必须以右括号 “ ”结束。

  2. 双分号 “;;” 表示命令序列结束,相当于java中的break。

  3. 最后的 “ *”表示默认模式,相当于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 脚本名称

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值