shell变量(备份脚本)

1. shell类型

查看linux系统中包含的shell类型

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

查看当前linux操作系统中使用的版本

[root@zhanghao ~]# echo $SHELL
/bin/bash

linux脚本开头

#!/bin/bash

在linux所有的脚本中,其实都是#!后面的/bin/bash表示bash的解释器的路径,名字叫shebang

2. 终端打印

2.1 echo打印

[root@zhanghao ~]# echo "welcome to linux"
welcome to linux
[root@zhanghao ~]# echo -e "test\a"
test

[root@zhanghao ~]# echo -e "test\ntest"
test
test

[root@zhanghao ~]# echo -e "test\rtest"
test

[root@zhanghao ~]# echo -e "test\ttest"
test    test

[root@zhanghao ~]# echo -e "test\ftest"
test
    test

[root@zhanghao ~]# echo -e "test\etest"
testest

帮助手册

NAME
       echo - display a line of text

SYNOPSIS
       echo [SHORT-OPTION]... [STRING]...
       echo LONG-OPTION

DESCRIPTION
       Echo the STRING(s) to standard output.

       -n     不输出换行符(\n)

       -e     输出中启用反斜杠转义符

       -E     不用反斜杠转义符

       --help 显示帮助信息

       --version 输出版本信息
              

      echo -e情况下,以下的反斜杠有效:

       \\     输出斜杆

       \a     警报(BEL)

       \b     退格

       \c     \c之后的字符串不进行输出
       
       \e     换码,\e后面的一个字符删除

       \f     错开显示,\f之后的字符换行,但是光标位置保持不变

       \n     换行

       \r     光标移到行首

       \t     插入tab

       \v     和\f是相同的

2.2 printf打印

默认不输出换行符,所以要手动添加换行符\n

[root@zhanghao ~]# printf "welcome to linux"
welcome to linux[root@zhanghao ~]#

格式化输出格式

- :表示靠左输出
% :表示格式输出起始
n.m : n表示字符宽度,m表示小数点后面精确的位数

printf "%-5s %-4s %-1.2s\n" name age mark
printf "%-5s %-4s %-1.2s\n" lisi 30 8.333

输出结果:

[root@zhanghao shell]# bash print.sh 
name  age  mark
lisi  30   8.33

2.3 颜色输出

字体颜色输出


#!/bin/bash

echo -e "\e[1;30m color \e[0m"
echo -e "\e[1;31m color \e[0m"
echo -e "\e[1;32m color \e[0m"
echo -e "\e[1;33m color \e[0m"
echo -e "\e[1;34m color \e[0m"
echo -e "\e[1;35m color \e[0m"
echo -e "\e[1;36m color \e[0m"
echo -e "\e[1;37m color \e[0m"

输出结果
在这里插入图片描述

背景色输出

[root@zhanghao shell]# cat color.sh 
#!/bin/bash

echo -e "\e[1;40m color \e[0m"
echo -e "\e[1;41m color \e[0m"
echo -e "\e[1;42m color \e[0m"
echo -e "\e[1;43m color \e[0m"
echo -e "\e[1;44m color \e[0m"
echo -e "\e[1;45m color \e[0m"
echo -e "\e[1;46m color \e[0m"
echo -e "\e[1;47m color \e[0m"

输出结果
在这里插入图片描述

3. 变量

3.1 普通变量

定义变量

key=value

### 将命令的输出结果复制给key
key=$(cmd)

### 将变量设置为只读
readonly key

### 清除变量的值
unset key
  • = 两边没有空格
  • 如果value中没有空格,则可以不用添加引号,如果有空格,需要添加单引号和双引号

输出命令

echo $key
echo ${key}

3.2 环境变量

进程环境变量

这个配置文件中没有换行符,默认用null(\0),进行分割用tr替换换行符

[root@zhanghao shell]# cat /proc/1139/environ | tr '\0' '\n'
MAIL_CONFIG=/etc/postfix
MAIL_LOGTAG=postfix
LANG=C
GENERATION=2
  • set 显示所有shell变量,包括全局变量
  • env只是查看全局变量

输出系统环境变量PATH

[root@zhanghao shell]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

添加目录到环境变量

[root@zhanghao shell]# export PATH="$PATH:/shell"
[root@zhanghao shell]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/shell

3.3 位置变量

执行shell脚本时候,可以传递参数,在shell脚本中可以使用变量调用

[root@zhanghao shell]# cat test.sh 
#!/bin/bash
echo '位置变量[$@]:' $@
echo '位置变量[$*]:' $*
echo '位置变量[$#]:' $#
echo '位置变量[$0]:' $0
echo '位置变量[$1]:' $1
echo '位置变量[$2]:' $2
echo '位置变量[$3]:' $3

输出结果

#### 执行脚本
[root@zhanghao shell]# bash test.sh 1 2 3 4
位置变量[$@]: 1 2 3 4
位置变量[$*]: 1 2 3 4
位置变量[$#]: 4
位置变量[$0]: test.sh
位置变量[$1]: 1
位置变量[$2]: 2
位置变量[$3]: 3

3.4 预定义变量

变量名 含义
$@ 输出所有的传入参数,可以用来循环遍历
$* 和$@是一样的,这个输出没有换行符
$# 计算传入的参数的个数
$0 输出脚本名称
$1 输出第一个变量
$$ 当前shell的PID
$? 返回上一条指令的返回状态,执行成功为0,执行失败非0

echo '当前目录:' $PWD
echo '当前用户的家目录:' $HOME
echo '当前用户:' $USER
echo '当前用户的UID:' $UID
echo '当前shell类型:' $SHELL

输出结果

[root@zhanghao shell]# bash test.sh 
当前目录: /shell
当前用户的家目录: /root
当前用户: root
当前用户的UID: 0
当前shell类型: /bin/bash

4. 备份脚本


#!/bin/bash
###################
# DATE: 2019-08-25
# AUTHOR: haozi
# Backup file
##################

DATE=`date +'%y-%m-%d'`
BACKUP_DIR=backup
SRC_DIR=/shell
SRC=($@)
INDEX=$#
SUCCESS=`echo -e "\e[1;32msuccess\e[0m"`
FAIL=`echo -e "\e[1;31mfail\e[0m"`
RET=no

if [ $1 == '-h' -o $1 == '-H' ]; then
   echo -e "Help Document\n"
   printf "%-10s %-30s\n" "     " "backup.sh [options] file1 file2 directory1 directory2"
   printf "%-10s %-10s %-20s\n" "     " "-h or -H" "Display help document"
   printf "%-10s %-10s %-20s\n" "     " "-y or -Y" "Skip confirmation"
   echo -e "\e[1;31m option is only one \e[0m"
   exit 0
elif [ $1 == '-y' -o $1 == '-Y' ]; then
   RET=yes
   START=1
else
   START=0
fi

#### 校验备份backup-$data目录是否存在,如果存在,则备份为.bak备份目录
if [ -e $BACKUP_DIR-$DATE ]; then
   if [ ! $RET == "yes" ]; then
        read -p "Backup directory $BACKUP_DIR-$DATE aleady exist, it will rename $BACKUP_DIR-$DATE as $BACKUP_DIR-$DATE.bak [y/n]:" RET
        if [ $RET == "y" -o $RET == "Y" ]; then
              mv $BACKUP_DIR-$DATE $BACKUP_DIR-$DATE.bak
        else
              exit 1
        fi
    fi
else
   mkdir $BACKUP_DIR-$DATE
fi


#### 拷贝备份的文件和目录到备份临时目录,backup-$date下面
cd $SRC_DIR
for ((index=$START; index<$INDEX; index++)) 
do
   if [ -d ${SRC[$index]} ]; then
         cp -r ${SRC[$index]} $BACKUP_DIR-$DATE/ && printf "%-10s %-6s %-4s \n" ${SRC[$index]} "=====>" $SUCCESS || printf "%-10s %-6s %-4s \n" ${SRC[$index]} "=====>" $FAIL
   else
         cp ${SRC[$index]} $BACKUP_DIR-$DATE/ && printf "%-10s %-6s %-4s \n" ${SRC[$index]} "=====>" $SUCCESS || printf "%-10s %-6s %-4s \n" ${SRC[$index]} "=====>" $FAIL
   fi
done


#### 开始压缩备份目录
echo -e "####################### start zip ##################\n"
tar zcvf $BACKUP_DIR-$DATE.tar.gz $BACKUP_DIR-$DATE
if [ ! $? -eq 0 ]; then
   echo "backup==============>$FAIL"
   exit 2
else
   echo "backup==============>$SUCCESS"
fi
echo "####################### end zip ##################"

输出效果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hao_zhang_shrek/article/details/100062780