shell脚本编程(一)

时间:2022-01-03 00:13:00

一.变量

shell中变量的类型
1)本地变量(局部变量)
2)环境变量(全局变量)
3)位置变量
4)特殊变量

1.本地变量

也叫自定义变量,用户根据自己的需求自己定义的变量
作用域(作用范围):在整个shell脚本中生效;如果是在命令行定义的变量,作用范围就是当前shell。

定义变量:   变量名=变量值  定义本地变量  
注意:等号两边一定不能有空格
[root@shell ~]# name=mary 
[root@shell ~]# echo $name
mary
[root@shell ~]# bash //开启一个子shell
[root@shell ~]# echo $SHLVL ** //查看当前在第几级shell
3
[root@shell ~]# echo $name //在子shell中是看不到父shell中的本地变量
[root@shell ~]# exit
exit
[root@shell ~]# echo $SHLVL 
2

2.环境变量

作用范围:当前shell及其子shell

定义环境变量:

1)将已经定义的本地变量导出成环境变量   export
[root@shell ~]# export name
[root@shell ~]# echo $name
mary
[root@shell ~]# bash
[root@shell ~]# echo $name //在子shell中可以看到name的值了
mary
2)在定义变量时,直接将其定义为环境变量
[root@shell ~]# echo $SHLVL
2
[root@shell ~]# export age=88
[root@shell ~]# bash
[root@shell ~]# echo $age
 88
3)declare -x name 定义环境变量
    注意:在子shell中修改变量的值,不影响父shell中的变量的值的。
[root@shell ~]# echo $SHLVL
3
[root@shell ~]# age=66
[root@shell ~]# echo $age
66
[root@shell ~]# exit
exit
[root@shell ~]# echo $age
88     
    如果想让环境变量永久生效,那么就写在环境变量配置文件中即可。
取消变量的值
[root@shell ~]# unset name
[root@shell ~]# echo $name    

3.位置变量

[root@shell ~]# ls /root /tmp
ls  ——  $0
/root  —— $1
/tmp  —— $2
[root@shell ~]# cd /script/
[root@shell ~]# vim position.sh
#!/bin/bash
echo '$0='$0     
echo '$1='$1     
echo '$2='$2     
echo '$3='$3     
echo '$4='$4     
echo '$5='$5     
echo '$6='$6     
echo '$7='$7     
echo '$8='$8     
echo '$9='$9     
echo '$10='$10     
echo '$11='${11}     
echo '$#='$#
echo '$*='$*
echo '$@='$@
[root@shell ~]# chmod +x position.sh 
[root@shell ~]# ./position.sh a b c d e f g h i j k l m
$0=./position.sh
$1=a
$2=b
$3=c
$4=d
$5=e
$6=f
$7=g
$8=h
$9=i
$10=a0
$11=k
$#=13                             // 参数的个数
$*=a b c d e f g h i j k l m      //打印参数列表
$@=a b c d e f g h i j k l m
    $0  —— 表示当前运行的脚本或者命令本身
    $1 ~ ${10} —— 表示脚本的位置参数,$1表示第一个参数,依此类推
    $# —— 表示位置参数的个数
    $@和$* —— 表示参数的列表

4.特殊变量

$$ 	查看当前shell的pid
	[root@shell ~]# echo $$

!$和$_
    上一条命令的最后一个参数
    [root@shell ~]# vim filename
    [root@shell ~]# cat !$
        或者  alt+.(点)  也可以    

$?:上一条命令的执行状态的返回值
   执行状态返回值(0-255),分两类
    0:表示上一条命令执行成功
    非0:表示上一条命令执行失败

5.变量的引用

    1、$变量名
     echo $变量名
    2、${变量名}   —— 为了防止歧义
[root@shell ~]# fruit=banana
[root@shell ~]# echo "There are some $fruits."
There are some .
[root@shell ~]# echo "There are some ${fruit}s."
There are some bananas.      

二.算术运算

1、$[] 和 $(())
[root@shell ~]# echo $[1+2]
3
[root@shell ~]# echo $((1+2))
3
[root@shell ~]# echo $[2**16]
65536
2、let   常用于while循环变量更新
        let 变量=值
[root@shell ~]# let sum=1+2
[root@shell ~]# echo $sum
3   
[root@shell ~]# a=8
[root@shell ~]# b=5
[root@shell ~]# let ji=$a*$b
[root@shell ~]# echo $ji
40
[root@shell ~]# let i++ //在循环中更新变量值常用的,每次i的值加1
3、Linux计算器
[root@shell ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
5/6
0
scale=3    //指定精度,精度就是小数点后保留几位小数
9/8
1.125
ctrl + d 退出

三.脚本编程

1、使用shell脚本的原因

  1)功能比较强大,可以移植
  2)节省时间,提高工作效率,可以重复执行命令

2、shell脚本的好处

      减少重复性工作,提升效率

3、组成shell脚本的元素 即shell脚本基本格式

  #!/bin/bash      ——  顶格写 shabang,也称为幻数,用来指明脚本中的命令是由什么环境来解析的
  perl: #!/usr/bin/perl
  python:#!/usr/bin/python
  一行到多行的注释行    以#开头的
     注释里面写:作者、编写时间、更新时间、脚本的功能介绍等等

4、shell脚本的调试

  1)对脚本整体进行调试
    sh -x 脚本的名字     //-x:会将脚本执行过程中每一行都打印到标准输出
  2)对脚本的局部调试
            set -x     //开启调试功能
            set +x     //关闭调试功能
[root@shell ~]# cd /script/
[root@shell ~]# vim sc1.sh
#!/bin/bash
for i in $(seq 5)
    do
        echo $i
    done
[root@shell ~]# sh -x sc1.sh
[root@shell ~]# vim sc1.sh
#!/bin/bash
for i in $(seq 5)
    do
        set -x
        echo $i
        echo hello $i
        set +x
    done
[root@shell ~]# sh sc1.sh

5、脚本的运行

1)脚本编写完成,添加执行权限,使用相对路径或者绝对路径的方式运行脚本
[root@shell ~]# ./sc1.sh
bash: ./sc1.sh: Permission denied
[root@shell ~]# chmod +x sc1.sh 
[root@shell ~]# ./sc1.sh 
2)编写完成,使用sh或者bash命令运行脚本(可以没有执行权限)
[root@shell ~]# sh sc1.sh      //有无执行权限均可

6、简单的小脚本

脚本:命令的堆砌,加上流程控制语句
[root@shell ~]# vim sc3.sh
#!/bin/bash
free -m
df -h
date

四.读取变量

read:能够从标准输入读取用户输入的值,然后传递给脚本中的变量

echo:打印变量值、打印字符串等
    -e:让echo支持以下符号
        \t:tab
        \n:换行
[root@shell ~]# echo -e "hello\tworld\nhello everyone"
hello   world
hello everyone
    -n:不换行

1、read读取用户输入

[root@shell ~]# vim sc4.sh
#!/bin/bash
echo -n "Please input the username you want to add: "
read username     //read 变量名
useradd $username && echo "user $username added."
[root@shell ~]# sh sc4.sh 
Please input the username you want to add: Loyal-Wang
user Loyal-Wang added.

2、read 自身显示提示信息 -p 打印提示的 —— prompt:提示

[root@shell ~]# cp sc4.sh sc5.sh
[root@shell ~]# vim sc5.sh
#!/bin/bash
read -p "Please input the username you want to add: " username  //read -p 提示信息 变量名
useradd $username && echo "user $username added."    //提示信息和变量名之间必有空格
[root@shell ~]# sh sc5.sh 
Please input the username you want to add: doushuine
user doushuine added.

3、read 不回显用户输入的信息 -s

[root@shell ~]# cp sc5.sh sc6.sh
[root@shell ~]# vim sc6.sh
#!/bin/bash
read -p "Please input the username you want to add: " username
read -s -p "Please input the password you want to set: " password
echo   //换行
useradd $username && echo "user $username added."
echo $password | passwd --stdin $username &>/dev/null && echo "password set successfully."
[root@shell ~]# sh sc6.sh 
Please input the username you want to add: taa
Please input the password you want to set: 
user taa added.
password set successfully.
echo:可以用来打印空行或者换行。

4、限制读取时间 -t

[root@shell ~]# cp sc6.sh sc7.sh
[root@shell ~]# vim sc7.sh
#!/bin/bash
read -p "Please input the username you want to add: " -t 5 username               //单位是秒
read -s -p "Please input the password you want to set: " password
echo "***"
useradd $username && echo "user $username added."
echo $password | passwd --stdin $username &>/dev/null && echo "password set successfully."
    read: 
        -p:打印提示信息
        -s:不回显用户输入的信息
        -t 时间:限制读取输入的等待时间
        -n  数字:输入指定的字符个数

五.bash的配置文件:

    全局配置
        /etc/profile, /etc/profile.d/*.sh, /etc/bashrc
    个人配置
        ~/.bash_profile, ~/.bashrc

    profile类的文件:
        设定环境变量
        运行命令或脚本

    bashrc类的文件:
        设定本地变量
        定义命令别名