Shell脚本入门(二)

导读:本篇文章讲解 Shell脚本入门(二),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

第 3 章 变量

3.1 系统预定义变量

1)常用系统变量

H

O

M

E

HOME、

HOMEPWD、

S

H

E

L

L

SHELL、

SHELLUSER 等
2)案例实操
(1)查看系统变量的值

[atguigu@hadoop101 shells]$ echo $HOME 
/home/atguigu

(2)显示当前 Shell 中所有变量:set

[atguigu@hadoop101 shells]$ set 
BASH=/bin/bash 
BASH_ALIASES=() 
BASH_ARGC=() 
BASH_ARGV=()

3.2 自定义变量

1)基本语法
(1)定义变量:变量名=变量值,注意,=号前后不能有空格
(2)撤销变量:unset 变量名
(3)声明静态变量:readonly 变量,注意:不能 unset
2)变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建 议大写。
(2)等号两侧不能有空格
(3)在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
3)案例实操
(1)定义变量 A

[atguigu@hadoop101 shells]$ A=5 
[atguigu@hadoop101 shells]$ echo $A 
5

(2)给变量 A 重新赋值

[atguigu@hadoop101 shells]$ A=8 
[atguigu@hadoop101 shells]$ echo $A 
8

(3)撤销变量 A

[atguigu@hadoop101 shells]$ unset A 
[atguigu@hadoop101 shells]$ echo $A

(4)声明静态的变量 B=2,不能 unset

[atguigu@hadoop101 shells]$ readonly B=2 
[atguigu@hadoop101 shells]$ echo $B 
2
[atguigu@hadoop101 shells]$ B=9 
-bash: B: readonly variable

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

[atguigu@hadoop102 ~]$ C=1+2 
[atguigu@hadoop102 ~]$ echo $C 
1+2

(6)变量的值如果有空格,需要使用双引号或单引号括起来

[atguigu@hadoop102 ~]$ D=I love banzhang 
-bash: world: command not found 
[atguigu@hadoop102 ~]$ D="I love banzhang" 
[atguigu@hadoop102 ~]$ echo $D I love banzhang

(7)可把变量提升为全局环境变量,可供其他 Shell

export 变量名 
[atguigu@hadoop101 shells]$ vim helloworld.sh

在 helloworld.sh 文件中增加 echo $B

#!/bin/bash 
echo "helloworld" 
echo $B
[atguigu@hadoop101 shells]$ ./helloworld.sh 
Helloworld

发现并没有打印输出变量 B 的值。

[atguigu@hadoop101 shells]$ export B 
[atguigu@hadoop101 shells]$ ./helloworld.sh 
helloworld 
2

3.3 特殊变量

3.3.1 $n

1)基本语法
$n (功能描述:n 为数字,$0 代表该脚本名称,$1-

9

9 代表第一到第九个参数,十以 上的参数,十以上的参数需要用大括号包含,如

9{10})
2)案例实操

[atguigu@hadoop101 shells]$ touch parameter.sh
[atguigu@hadoop101 shells]$ vim parameter.sh 
#!/bin/bash 
echo '==========$n==========' 
echo $0 echo $1 echo $2 
[atguigu@hadoop101 shells]$ chmod 777 parameter.sh
[atguigu@hadoop101 shells]$ ./parameter.sh cls xz
==========$n========== 
./parameter.sh 
cls 
xz

3.3.2 $#

1)基本语法
$# (功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及 加强脚本的健壮性)。
2)案例实操

[atguigu@hadoop101 shells]$ vim parameter.sh 
#!/bin/bash echo '==========$n==========' 
echo $0 
echo $1 
echo $2 
echo '==========$#==========' 
echo $# 
[atguigu@hadoop101 shells]$ chmod 777 parameter.sh
[atguigu@hadoop101 shells]$ ./parameter.sh cls xz
==========$n========== 
./parameter.sh 
cls
xz
==========$#========== 
2

3.3.3

*、

@

1)基本语法

* (功能描述:这个变量代表命令行中所有的参数,

*把所有的参数看成一个整体)

@

@ (功能描述:这个变量也代表命令行中所有的参数,不过

@@把每个参数区分对待)
2)案例实操

[atguigu@hadoop101 shells]$ vim parameter.sh 
#!/bin/bash echo 
'==========$n==========' 
echo $0 
echo $1 
echo $2 
echo '==========$#==========' 
echo $# 
echo '==========$*==========' 
echo $* 
echo '==========$@==========' 
echo $@ 
[atguigu@hadoop101 shells]$ ./parameter.sh a b c d e f g
==========$n========== 
./parameter.sh 
a
b
==========$#==========
7
==========$*==========
a b c d e f g 
==========$@========== 
a b c d e f g

3.3.4 $?

**1)基本语法 **
$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一 个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明 上一个命令执行不正确了。)
2)案例实操
判断 helloworld.sh 脚本是否正确执行

[atguigu@hadoop101 shells]$ ./helloworld.sh 
hello world 
[atguigu@hadoop101 shells]$ echo $? 
0

第 4 章 运算符

1)基本语法

(

(

)

)

((运算式))” 或 “

(())[运算式]”
2)案例实操:
计算(2+3)* 4 的值

[atguigu@hadoop101 shells]# S=$[(2+3)*4] 
[atguigu@hadoop101 shells]# echo $S

第 5 章 条件判断

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

2)常用判断条件
(1)两个整数之间比较

 -eq 等于(equal) -ne 不等于(not equal) 
 -lt 小于(less than) -le 小于等于(less equal) 
 -gt 大于(greater than) -ge 大于等于(greater equal)
 

注:如果是字符串之间的比较 ,用等号“=”判断相等;用“!=”判断不等。
(2)按照文件权限进行判断

-r 有读的权限(read) 
-w 有写的权限(write-x 有执行的权限(execute) 

(3)按照文件类型进行判断

-e 文件存在(existence) 
-f 文件存在并且是一个常规的文件(file) 
-d 文件存在并且是一个目录(directory)

3)案例实操

(1)23 是否大于等于 22

[atguigu@hadoop101 shells]$ [ 23 -ge 22 ] 
[atguigu@hadoop101 shells]$ echo $? 
0

(2)helloworld.sh 是否具有写权限

[atguigu@hadoop101 shells]$ [ -w helloworld.sh ]
[atguigu@hadoop101 shells]$ echo $? 
0

(3)/home/atguigu/cls.txt 目录中的文件是否存在

[atguigu@hadoop101 shells]$ [ -e /home/atguigu/cls.txt ]
[atguigu@hadoop101 shells]$ echo $? 
1

(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一 条命令执行失败后,才执行下一条命令)

[atguigu@hadoop101 ~]$ [ atguigu ] && echo OK || echo notOK
 OK
[atguigu@hadoop101 shells]$ [ ] && echo OK || echo notOK 
notOK

第 6 章 流程控制(重点)

6.1 if 判断

1)基本语法
(1)单分支

if [ 条件判断式 ];then 
程序 
fi

或者

if [ 条件判断式 ] 
then程序 
fi

(2)多分支

if [ 条件判断式 ] 
then
	程序 
elif [ 条件判断式 ] 
then
	程序 
else
	程序 
fi

注意事项:
①[ 条件判断式 ],中括号和条件判断式之间必须有空格
②if 后要有空格
2)案例实操
输入一个数字,如果是 1,则输出 banzhang zhen shuai,如果是 2,则
输出 cls zhen mei, 如果是其它,什么也不输出。

[atguigu@hadoop101 shells]$ touch if.sh 
[atguigu@hadoop101 shells]$ vim if.sh
#!/bin/bash 
if [ $1 -eq 1 ] 
then 
	echo "banzhang zhen shuai" 
elif [ $1 -eq 2 ] 
then 
	echo "cls zhen mei" 
fi
[atguigu@hadoop101 shells]$ chmod 777 if.sh 
[atguigu@hadoop101 shells]$ ./if.sh 1 
banzhang zhen shuai

6.2 case 语句

1)基本语法

case $变量名 in 
"值 1")如果变量的值等于值 1,则执行程序 1 ;;
"值 2")如果变量的值等于值 2,则执行程序 2 ;; 
…省略其他分支… *) 
如果变量的值都不是以上的值,则执行此程序 ;;
esac

注意事项:
(1)case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
(2)双分号“;;”表示命令序列结束,相当于 java 中的 break。
(3)最后的“*)”表示默认模式,相当于 java 中的 default。
2)案例实操
输入一个数字,如果是 1,则输出 banzhang,如果是 2,则输出 cls,如果是其它,输出 renyao。

[atguigu@hadoop101 shells]$ touch case.sh 
[atguigu@hadoop101 shells]$ vim case.sh 

!/bin/bash case $1 
in "1") 
	echo "banzhang" ;;
"2") 
	echo "cls" 
;;
*)
	echo "renyao"
;;esac

[atguigu@hadoop101 shells]$ chmod 777 case.sh 
[atguigu@hadoop101 shells]$ ./case.sh 1 
1

6.3 for 循环

1)基本语法 1

for (( 初始值;循环控制条件;变量变化 )) 
do 
	程序 
done

2)案例实操
从 1 加到 100

[atguigu@hadoop101 shells]$ touch for1.sh 
[atguigu@hadoop101 shells]$ vim for1.sh 
#!/bin/bash 
sum=0 
for((i=0;i<=100;i++)) 
do 
	sum=$[$sum+$i] 
done 
echo $sum 
[atguigu@hadoop101 shells]$ chmod 777 for1.sh 
[atguigu@hadoop101 shells]$ ./for1.sh 
5050

3)基本语法 2

for 变量 in 值 1 值 2 值 3… 
do 
	程序 
done

4)案例实操
(1)打印所有输入参数

[atguigu@hadoop101 shells]$ touch for2.sh 
[atguigu@hadoop101 shells]$ vim for2.sh 
#!/bin/bash 
#打印数字 
for i in cls mly wls 
do 
	echo "ban zhang love $i" 
	done 
[atguigu@hadoop101 shells]$ chmod 777 for2.sh 
[atguigu@hadoop101 shells]$ ./for2.sh 
ban zhang love cls 
ban zhang love mly
ban zhang love wls

(2)比较

*和

@区别

*和

@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1

2

2 …

2n 的形式输出所有参数。

[atguigu@hadoop101 shells]$ touch for3.sh 
[atguigu@hadoop101 shells]$ vim for3.sh
 
#!/bin/bash 
echo '=============$*=============' 
for i in $* 
do 
	echo "ban zhang love $i" 
done 

echo '=============$@=============' 
for j in $@ 
do 
	echo "ban zhang love $j" 
done 
[atguigu@hadoop101 shells]$ chmod 777 for3.sh 
[atguigu@hadoop101 shells]$ ./for3.sh cls mly wls =============$*============= 
banzhang love cls 
banzhang love mly
banzhang love wls 
=============$@=============
 banzhang love cls
 banzhang love mly 
 banzhang love wls
当它们被双引号“”包含时,$*会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输 

出所有参数;$@会将各个参数分开,以“$1” “

2

2”…“

2n”的形式输出所有参数。

[atguigu@hadoop101 shells]$ vim for4.sh 
#!/bin/bash echo '=============$*=============' 
for i in "$*" 
#$*中的所有参数看成是一个整体,所以这个 for 循环只会循环一次 
do 
	echo "ban zhang love $i" 
done 
echo '=============$@=============' 
for j in "$@" 
	#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次 
do 
	echo "ban zhang love $j"
done 
[atguigu@hadoop101 shells]$ chmod 777 for4.sh 
[atguigu@hadoop101 shells]$ ./for4.sh cls mly wls
 =============$*============= 
 banzhang love cls mly wls 
 =============$@============= 
 banzhang love cls 
 banzhang love mly
 banzhang love wls

6.4 while 循环

1)基本语法

while 
	[ 条件判断式 ] 
do 
	程序
done 
**2)案例实操** 
从 1 加到 100
[atguigu@hadoop101 shells]$ touch while.sh 
[atguigu@hadoop101 shells]$ vim while.sh 
#!/bin/bash 
sum=0 
i=1 
while [ $i -le 100 ] 
do 
	sum=$[$sum+$i] 
	i=$[$i+1] 
done 
echo $sum 
[atguigu@hadoop101 shells]$ chmod 777 while.sh
[atguigu@hadoop101 shells]$ ./while.sh
5050

第 7 章 read 读取控制台输入

1)基本语法
read (选项) (参数)
①选项:-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)如果-t 不加表示一直等待
②参数
变量:指定读取值的变量名
2)案例实操
提示 7 秒内,读取控制台输入的名称

[atguigu@hadoop101 shells]$ touch read.sh 
[atguigu@hadoop101 shells]$ vim read.sh 
#!/bin/bash 
read -t 7 -p "Enter your name in 7 seconds :" NN 
echo $NN
[atguigu@hadoop101 shells]$ ./read.sh 
Enter your name in 7 seconds : atguigu 
atguigu

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/77005.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!