该文档系统讲解了Shell脚本语言的基础知识,包括变量定义、位置参数、特殊字符、条件判断与循环结构。

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

  1. echo ‘You select 1’
    ;;
  2. echo ‘You select 2’
    ;;
  3. echo ‘You select 3’
    ;;
  4. 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