02.Shell编程

1、Shell概述

  Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。

2、Shell解析器

① Linux提供的Shell解析器

[root@hadoop ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin

② sh和bash的关系

[root@hadoop bin]# ll | grep bash
-rwxr-xr-x  1 root root      960472 Dec  7  2016 bash
lrwxrwxrwx  1 root root           4 Aug 18  2017 sh -> bash

​ 可以看出sh是bash的软连接

③ Centos默认的解析器是bash

[root@izwz923wscm1q3eumry71kz bin]# echo $SHELL
/bin/bash

3、Shell脚本入门

1.脚本格式

​ 脚本以#!/bin/bash开头(指定解析器)

2.第一个Shell脚本:helloworld

[root@hadoop shell]$ touch helloworld.sh
[root@hadoop shell]$ vi helloworld.sh

在helloworld.sh中输入如下内容
#!/bin/bash
echo "helloworld"

3.脚本的常用执行方式

​ ①采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)

sh+脚本的相对路径/绝对路径 或 bash+脚本的相对路径/绝对路径
[root@hadoop shell]$ bash helloworld.sh 
Helloworld
[root@hadoop shell]$ sh helloworld.sh 
Helloworld

​ ②采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)

[root@hadoop shell]$ chmod 777 helloworld.sh
[root@hadoop shell]$ ./helloworld.sh 
Helloworld

注意:第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。

4.多命令处理

需求:在/root目录下创建一个note.txt,在note.txt文件中增加“I love shell”。

[root@hadoop shell]$ touch batch.sh
[root@hadoop shell]$ vi batch.sh

在batch.sh中输入如下内容
#!/bin/bash

cd /home/atguigu
touch cls.txt
echo "I love cls" >>cls.txt

4、Shell中的变量

4.1 系统变量

常用系统变量:$HOME、$PWD、$SHELL、$USER

查看系统变量的值:
	[root@hadoop shell]$ echo $HOME

显示当前Shell中所有变量:
	[root@hadoop shell]$ set

4.2 自定义变量

基本语法:

​ ① 定义变量:变量=值

​ ② 撤销变量:unset 变量

​ ③ 声明静态变量:readonly变量,注意:不能unset

变量定义规则:

​ ① 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。

​ ② 等号两侧不能有空格

​ ③ 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。

​ ④ 变量的值如果有空格,需要使用双引号或单引号括起来。

4.3 特殊变量

①$n

基本用法:$n(功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})

[root@hadoop shell]# touch parameter.sh 
[root@hadoop shell]# vim parameter.sh

#!/bin/bash
echo "$0  $1   $2"

[root@hadoop shell]# chmod 777 parameter.sh

[root@hadoop shell]# ./parameter.sh cls  xz
./parameter.sh  cls   xz

②$#

基本用法:$#(功能描述:获取所有输入参数个数,常用于循环)。

[root@hadoop shell]# vim parameter.sh

#!/bin/bash
echo "$0  $1   $2"
echo $#

[root@hadoop shell]# chmod 777 parameter.sh

[root@hadoop shell]# ./parameter.sh cls  xz
parameter.sh cls xz 
2

$*、$@

基本用法:
$*(功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)

[root@hadoop shell]# vim parameter.sh

#!/bin/bash
echo "$0  $1   $2"
echo $#
echo $*
echo $@

[root@hadoop shell]# bash parameter.sh 1 2 3
parameter.sh  1   2
3
1 2 3
1 2 3

④$?

基本用法:$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

[root@hadoop shell]# ./helloworld.sh 
hello world
[root@hadoop shell]# echo $?
0

5、运算符

基本语法:
1、“$((运算式))”或“$[运算式]”
2、expr + , - , *, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格

(1)计算3+2的值
[root@hadoop shell]# expr 2 + 3
5
(2)计算3-2的值
[root@hadoop shell]# expr 3 - 2 
1
(3)计算(2+3)X4的值
	(a)expr一步完成计算
	[root@hadoop shell]# expr `expr 2 + 3` * 4
	20
	(b)采用$[运算式]方式
	[root@hadoop shell]# S=$[(2+3)*4]
	[root@hadoop shell]# echo $S

6、条件判断

基本语法:[ condition ](注意condition前后要有空格),注意:条件非空即为true,[] 返回false。

常用判断条件:

​ ① 两个整数之间比较

​ = 字符串比较

​ -lt 小于(less than) -le 小于等于(less equal)

​ -eq 等于(equal) -gt 大于(greater than)

​ -ge 大于等于(greater equal) -ne 不等于(Not equal)

​ ② 按照文件权限进行判断

​ -r 有读的权限(read) -w 有写的权限(write)

​ -x 有执行的权限(execute)

​ ③ 按照文件类型进行判断

​ -f 文件存在并且是一个常规的文件(file)

​ -e 文件存在(existence) -d 文件存在并是一个目录(directory)

(1)23是否大于等于22
[root@hadoop shell]# [ 23 -ge 22 ]
[root@hadoop shell]# echo $?
0
(2)helloworld.sh是否具有写权限
[root@hadoop shell]# [ -w helloworld.sh ]
[root@hadoop shell]# echo $?
0
(3)/home/shell/cls.txt目录中的文件是否存在
[root@hadoop shell]# [ -e /home/shell/cls.txt ]
[root@hadoop shell]# echo $?
1

7、流程控制

7.1 if判断

基本语法:
1、
if [ 条件判断式 ];then
	程序
fi
2、
if [ 条件判断式 ]
	then
		程序
elif[ 条件判断式 ]
	then
		程序
else
	程序
fi
注意事项:
	1.[ 条件判断式 ],中括号和条件判断式之间必须有空格
	2.if后要有空格

实操:
##单个if流程的使用
if [ $1 -ge 3 ];then
        echo "hello if"
fi
##if-elif-else的使用
#!/bin/bash
if [ $1 -ge 3 ]
	then
		echo "hello if"
elif [ $1 -ge 2 ]
	then
		echo "hello if2"
else
	echo "hello if3"
fi


7.2 case语句

基本语法:
case $变量名 in
"值1")
	程序1
;;
"值2")
	程序2
;;
*)
	其他程序
;;
esac

注意事项:
	1.case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
	2.双分号“;;”表示命令序列结束,相当于java中的break。
	3.最后的“*)”表示默认模式,相当于java中的default。
实操:
#!/bin/bash
case $1 in
"1")
	echo "Hello A"
;;
"2") 
	echo "Hello B"
;;
*)
	echo "Hello C"
;;
esac


7.3 for循环

基本语法1:
for((初始值;循环控制条件;变量变化))
	do
		程序
	done
实操:
s=0
for((i=0;i<100;i++))
do
	s=$[ s+i ]
done
echo $s

基本语法2:
for 变量 in 值1 值2 值3...
	do
		程序
done

实操:
for i in "$@"
do
	echo "I love this $i"
done

注:$*和$@的区别
当不被双引号包围的时候,$*和$@参数均会以$1 $2 ... $n的的形式输出
当被双引号包围的时候,$*参数会被当做一个整体输出


7.4 whilie 循环

基本语法:
while [ 条件判断式 ] 
  do 
    程序
  done

实操:
#!/bin/bash
i=5
while [ $i -gt 1 ]
do 
	i=$[ i =$i-1 ]
	echo $i
done

8、read读取控制台输入

原文地址:https://www.cnblogs.com/hucheng1997/p/11733563.html