7 shell 脚本语言基础
7.1 实验介绍
7.1.1 实验介绍
在对系统进行运维时,shell 脚本给了我们很大帮助。通过 shell 脚本,可以大大减少工作量。
本实验主要介绍 shell 脚本的概念及使用。
7.1.2 实验目标
掌握全局变量及局部变量;
掌握位置化参数使用;
掌握 shell 中的特殊字符;
掌握常用的 shell 语句。
7.2 shell 变量
7.2.1 用户变量的定义
步骤 1
执行如下命令,设置自定义局部变量。
[root@openeuler ~]# dir=/usr/tmp/
[root@openeuler ~]# echo $dir
/usr/tmp/
[root@openeuler ~]# today=Sunday
[root@openeuler ~]# echo $today
Sunday
[root@openeuler ~]# echo $Today
//无回显
[root@openeuler ~]# str=“Hapy New Year!”
[root@openeuler ~]# echo “Wish You $str”
Wish You Hapy New Year!
###作为交互式输入手段,可以利用 read 命令由标准输入(即键盘)上读取数据,然后赋给指定的变量。
其一般格式是:read 变量 1 [变量 2…]
[root@openeuler ~]# read name
openeuler
//此处输入 openeuler
[root@openeuler ~]# echo $name
openeuler
[root@openeuler ~]# read a b c
kunpeng 2020 huawei
#此处输入 kunpeng 2020 huawei
[root@openeuler ~]# echo $a
kunpeng
[root@openeuler ~]# echo $b
2020
[root@openeuler ~]# echo $c
huawei
步骤 2
执行如下步骤,配置用户变量。
[root@openEuler ~]# vim .bash_profile
~/.bash_profile 是用户独享的配置文件
#在文件最后新增一行,修改完成后保存退出:
a=1000
[root@openEuler ~]# echo $a
#未更新变量文件时,a 值未发生变化
kunpeng
[root@openEuler ~]# source .bash_profile #更新变量文件后,a 值发生变
[root@openEuler ~]# echo $a
1000
[root@openEuler ~]# bash
#打开一个新的 bash
[root@openEuler ~]# echo $a #a 变量未定义
[root@openEuler ~]# exit
#退出新打开的 shell
[root@openEuler ~]# su - root#以登录的方式切换用户,此时会自动读取.bash_profile 文件
[root@openEuler ~]# echo $a #a 变量值生效
1000
[root@openEuler ~]# exit
#退出当前的登录 shell
步骤 3
执行如下步骤,配置系统环境变量。
[root@openEuler ~]# vim /etc/profile
/etc/profile 是系统的配置文件,所有用户共享
#在文件最后新增一行,输入如下信息,并保存退出:
b=2000
[root@openEuler ~]# echo $b
#变量未更新
2020
[root@openEuler ~]# source /etc/profile
#更新变量
[root@openEuler ~]# echo $b
2000
#变量值发生了变化
[root@openEuler ~]# bash
#打开一个新的 bash
[root@openEuler ~]# echo $b #b 变量未定义
[root@openEuler ~]# exit
#退出新打开的 shell
[root@openEuler ~]# su - root#以登录的方式切换用户,此时会自动读取.bash_profile 文件
[root@openEuler ~]# echo $b #a 变量值生效
2000
[root@openEuler ~]# useradd huawei
#新增一个用户
[root@openEuler ~]# su - huawei
#切换到该用户
[huawei@openEuler ~]$ echo $b
2000
#变量 b 生效
[huawei@openEuler ~]$ exit
#退出当前用户
logout
7.2.2 位置参数
步骤 1
在/root 目录下新建三个文件 m1.c、m2.c、ex1.sh,内容如下:
m1.c:
main()
{
printf(“Begin \n”);
}
m2.c:
# include < stdio.h >
{
printf(“OK! \n”);
}
ex1.sh:
#!/bin/bash
# ex1.sh: shell script to combine files and count lines
cat $1 $2 $3 $4 $5 $6 $7 $8 $9 | wc -l
# end
步骤 2 执行脚本 ex1.sh。
[root@openeuler ~]# chmod u+x ex1.sh
[root@openeuler ~]# sh ex1.sh m1.c m2.c
8
7.3 shell 中的特殊字符
步骤 1
新建脚本 ex3.sh,写入如下内容:
#!/bin/bash
echo “current directory ispwd
”
echo “home directory is $HOME”
echo “file*.?”
echo " directory ‘$HOME’"
步骤 2
执行脚本 ex3.sh
[root@openeuler ~]# chmod u+x ex3.sh
[root@openeuler ~]# sh ex3.sh
current directory is ‘pwd’
home directory is /root
file*.?
directory ‘/root’
7.4 条件判断与循环结构
7.4.1 if 语句
7.4.1.1 语法示例
步骤 1
新建脚本 ex4.sh,写入如下内容:
#!/bin/bash
a=3
b=$1
if [ $a == $b ]
then
echo “You win!”
else
echo “Please guess again.”
fi
步骤 2
执行脚本 ex4.sh。
[root@openeuler ~]# chmod u+x ex4.sh
[root@openeuler ~]# ./ex4.sh 3
You win!
[root@openeuler ~]# ./ex4.sh 4
Please guess again.
7.4.4 for 语句
步骤 1
新建脚本 ex7.sh,写入如下内容:
#!/bin/bash
for Num in {1..10}
do
echo $Num
done
步骤 2
执行脚本 ex7.sh
[root@openeuler ~]# sh ex7.sh
1
2
3
4
5
6
7
8
9
10
步骤 3
新建一个 namefile 文件,写入如下内容:
user1
user2
user3
user4
步骤 4
新建脚本 ex8.sh,写入如下内容:
#!/bin/bash
for Name in $(cat ./namefile)
do
echo $Name
done
步骤 5
执行脚本 ex8.sh。
[root@openeuler ~]# sh ex8.sh
user1
user2
user3
user4
7.4.5 case 语句
步骤 1
新建脚本 ex9.sh,写入如下内容:
#!/bin/bash
echo ‘Input a number between 1 to 4’
printf ‘Your number is:\n’
read aNum
case $aNum in
- echo ‘You select 1’
;;- echo ‘You select 2’
;;- echo ‘You select 3’
;;- echo ‘You select 4’
;;
*) echo ‘You do not select a number between 1 to 4’
;;
esac
步骤 2
执行脚本 ex9.sh。
[root@openEuler ~]# sh ex9.sh
Input a number between 1 to 4
Your number is:
1
You select 1