shell脚本编程实践(二)

1 内容格式化

1.1 输出格式化

1.1.1 echo解读

基础知识

命令简介

echo命令的功能是将内容输出到默认显示设备,一般起到一个提示的作用。
OPTIONS:
-n    不要在最后自动换行
-e    若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:

转义字符
\a        发出警告声;
\b        删除前一个字符;
\c        最后不加上换行符号;
\f        换行但光标仍旧停留在原来的位置;
\n        换行且光标移至行首;
\r        光标移至行首,但不换行;
\t        插入tab;
\v        与\f相同;
\        插入\字符;
\0nnn    打印nnn(八进制)所代表的ASCII字符;  备注:数字0  不要理解成字母o
\xNN      打印NN(十六进制)所代表的ASCII字符;

-–help    显示帮助
-–version显示版本信息

简单实践

实践1 - 信息的输出

echo后边用单引号包围要添加的内容
[root@localhost ~]# echo 'hello world' >> /tmp/hello.txt
[root@localhost ~]# cat /tmp/hello.txt
hello world

实践2 - 引号信息输出

通过引号的错开实现引号的输出
[root@localhost ~]# echo "I'm a king of the world."
I'm a king of the world.

实践3 - 特殊符号的输出

使用 -e 选项启用转义字符的解析
[root@localhost ~]# echo -e "The 2021 State of DevOps Report\n\t- is here"
The 2021 State of DevOps Report
        - is here

实践4 - 内容的拼接

使用 -n 选项启用信息输出不换行
[root@localhost ~]# echo -n hello;echo world
helloworld

1.1.2 字体颜色

基础知识

场景需求

echo本质上是将信息内容输出到当前的屏幕终端,如果只是一种颜色的话,可能导致视觉疲劳。所以,一般情况下,我们在显示信息的时候,往往会通过颜色的方式实现特定内容的颜色高亮显示。

echo命令可以修改字体类型,字体背景色以及字体颜色,转义序列\033可以用于改变字体属性。

格式解读

格式如下:
    echo -e "\033[字背景颜色;文字颜色m字符串\033[0m"
    echo -e "\033[41;36m 显示的内容 \033[0m"

在这里插入图片描述

颜色分类

色彩 绿
字体色 30 31 32 33 34 35 36 37
背景色 40 41 42 43 44 45 46 47

结束控制符

最后面控制选项说明
  \033[0m 关闭所有属性          \033[1m 设置高亮度          \033[4m 下划线
  \033[5m 闪烁                 \033[7m 反显                 \033[8m 消隐
注意:
    \033 是八进制的ESCAPE字符,我们可以用 \e 来代替

简单实践

实践1 - 字体颜色和背景颜色

字体颜色示例
echo -e "\033[30m 黑色字 \033[31m 红色字 \033[32m 绿色字 \033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[35m 紫色字 \033[36m 天蓝字 \033[37m 白色字 \033[0m"
 
背景颜色示例
echo -e "\033[40;37m 黑底白字 \033[41;37m 红底白字 \033[42;37m 绿底白字 \033[0m"
echo -e "\033[43;37m 黄底白字 \033[44;37m 蓝底白字 \033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天蓝底白字 \033[47;30m 白底黑字 \033[0m"

在这里插入图片描述

实践2 - 信息颜色显示

定制堡垒机的测试页面脚本
[root@localhost ~]# cat simple_jumpserver.sh
#!/bin/bash
# 功能:定制堡垒机的展示页面
# 作者:wangshuji
# 版本:V0.1
# 联系:superopsmsb.com

echo -e "\e[31m \t\t 欢迎使用堡垒机"

echo -e "\e[32m
-----------请选择你要登录的远程主机-----------
 1: 10.0.0.14 (nginx)
 2: 10.0.0.15 (tomcat)
 3: 10.0.0.19 (apache)
 q: 使用本地主机
----------------------------------------------
"'\033[0m'
echo -e "请输入您要选择的远程主机编号: "

在这里插入图片描述

1.1.3 printf格式化

基础知识

场景需求

    虽然我们能够通过 echo的方式实现信息某种程度的格式化输出,但是很多信息的输出偏重于手工的干预,效率太慢。我们需要一种功能更强大、效率更高的格式化手段。
    -- printf

printf简介

    printf 命令模仿 C 程序库(library)里的 printf() 程序。由于 printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。
    printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。

基本语法

查看帮助
[root@localhost ~]# help printf
printf: printf [-v var] 格式 [参数]

在这里插入图片描述

格式化替换符
    %s         字符串
    %d,%i     十进制整数
    %f         浮点格式
    %c         ASCII字符,即显示对应参数的第一个字符
    %b         相对应的参数中包含转义字符时,可以使用此替换符进行替换,对应的转义字符会被转义
    %o         八进制值
    %u         不带正负号的十进制值
    %x         十六进制值(a-f)
    %X         十六进制值(A-F)
    %%         表示%本身
格式化转义符号
    \a        警告字符,通常为ASCII的BEL字符
    \b        后退
    \c        抑制(不显示)输出结果中任何结尾的换行字符
    \f        换页(formfeed)
    \n        换行
    \r        回车(Carriage return)
    \t        水平制表符
    \v        垂直制表符
    \\        一个字面上的反斜杠字符
    \ddd    表示1到3位数八进制值的字符。仅在格式字符串中有效
    \0ddd    表示1到3位的八进制值字符
格式化字符解释
–        将字段里已格式化的值向左对齐
空格       在正值前置一个空格,在负值前置一个负号
+        总是在数值之前放置一个正号或负号,即便是正值也是
#        下列形式选择其一:
            %o有一个前置的o;                    %x与%X分别前置的0x与0X;
            %e,%E与%f总是在结果中有一个小数点;  %g与%G为没有结尾的零。
0        以零填补输出,而非空白.这仅发生在字段宽度大于转换后的情况

简单实践

实践1 - 命令演示

普通echo命令演示换行信息和非换行信息
[root@localhost ~]# echo "Hello, Shell Base"
Hello, Shell Base
[root@localhost ~]# echo -n "Hello, Shell Base"
Hello, Shell Base[root@localhost ~]#

printf命令演示换行信息和非换行信息
[root@localhost ~]# printf "Hello, Shell Base\n"
Hello, Shell Base
[root@localhost ~]# printf "Hello, Shell Base"
Hello, Shell Base[root@localhost ~]#

实践2 - 替换符号演示

基本信息演示 - 单引号和双引号效果一样
[root@localhost ~]# printf "姓名:%s, 语文:%d, 数学:%d\n" "张三" 89 98
姓名:张三, 语文:89, 数学:98
[root@localhost ~]# printf '姓名:%s, 语文:%d, 数学:%d\n' "张三" 89 98
姓名:张三, 语文:89, 数学:98
注意:
    相关信息会按照顺序依次替换到格式化的替换符位置
数字格式展示
[root@localhost ~]# printf '姓名:%s, 身高:%f米, 体重:%f公斤\n' "张三" 1.7 66
姓名:张三, 身高:1.700000米, 体重:66.000000公斤
[root@localhost ~]# printf '姓名:%s, 身高:%.2f米, 体重:%.1f公斤\n' "张三" 1.7 66
姓名:张三, 身高:1.70米, 体重:66.0公斤
注意:
    通过 %.nf,n代表小数点后面的可显示的位数。

实践3 - 简单格式化

() 用于信息的批量化显示
[root@localhost ~]# printf "(%d %s)\n" 1 张三 2 李四 3 王五
(1 张三)
(2 李四)
(3 王五)

printf默认不携带最后的换行
[root@localhost ~]# printf "(%d %s)  " 1 张三 2 李四 3 王五
(1 张三)  (2 李四)  (3 王五)  [root@localhost ~]#

借助于echo的功能实现换行的效果
[root@localhost ~]# printf "(%d %s)  " 1 张三 2 李四 3 王五; echo
(1 张三)  (2 李四)  (3 王五)

实践4 - 格式化补充

%s字符串格式化
[root@localhost ~]# printf '姓名:%-10s语文:%d, 数学:%d\n' "张三" 89 98 "李四" 87 97
姓名:张三    语文:89, 数学:98
姓名:李四    语文:87, 数学:97
注意:
    %-10s,代表信息后面携带10个空格,便于格式化
%d数字格式补全
[root@localhost ~]# printf "%5d %s\n" 1 张三
    1 张三
[root@localhost ~]# printf "%05d %s\n" 1 张三
00001 张三
[root@localhost ~]# printf "%05d %s\n" 100 张四
00100 张四
注意:
    0的作用就是不用空格补全,而是用0填充,实现格式化

实践5 - 环境变量的使用

定制环境变量
[root@localhost ~]# VAR1=hello; VAR2=shell

颜色显示
[root@localhost ~]# printf "\033[32m%s \033[31m%s\033[0m\n" $VAR1 $VAR2
hello shell

1.1.4 综合案例

java部署

准备工作

创建目录
mkdir /data/{
   softs,server} -p
cd /data/softs

下载java或者上传java
ls /data/softs
安装java
tar xf jdk-8u121-linux-x64.tar.gz -C /data/server
cd /data/server/
ln -s jdk1.8.0_121 java
配置java环境变量
echo 'export JAVA_HOME=/data/server/java' >> /etc/profile.d/java.sh
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile.d/java.sh
source /etc/profile.d/java.sh

检查效果
java -version
手工清理环境
rm -f /etc/profile.d/java.sh
rm -rf /data/server/java /data/server/jdk1.8.0_121

信息显示

定制java环境部署脚本

[root@localhost ~]# cat /data/scripts/java_install.sh
#!/bin/bash
# 功能: java环境的定制
# 版本:v0.1
# 作者:书记
# 联系:www.superopsmsb.com

# 定制基本信息
JAVA_SOFT='jdk-8u121-linux-x64.tar.gz'
JAVA_DIR='jdk1.8.0_121'
JAVA_NAME='java'
SERVER_HOME='/data/server'
SOFTS_HOME='/data/softs'
RED="echo -e \E[1;31m"
END="\E[0m"

# 安装软件
tar xf $SOFTS_HOME/$JAVA_SOFT -C $SERVER_HOME
ln -s $SERVER_HOME/$JAVA_DIR $SERVER_HOME/$JAVA_NAME

# 定制环境变量
cat > /etc/profile.d/java.sh << EOF
export JAVA_HOME=$SERVER_HOME/$JAVA_NAME
export PATH=\$JAVA_HOME/bin:\$PATH
EOF

# 加载java环境变量文件
source /etc/profile.d/java.sh

# 检查效果
java -version > /tmp/txt 2>&1
java_version=$(grep version /tmp/txt  | cut -d '"' -f2)
runtime_version=$(grep Runtime /tmp/txt  | cut -d ' ' -f6 | cut -d ")" -f1)
jvm_type=$(grep VM /tmp/txt | cut -d " " -f8)

# 信息显示
$RED---------$JAVA_NAME软件运行情况---------$END
printf "\033[32m%s:\033[33m%s\033[0m\n" "java软件版本" $java_version
printf "\033[32m%s:\033[33m%s\033[0m\n" "java运行时环境版本" $runtime_version
printf "\033[32m%s:\033[33m%s\033[0m\n" "jvm运行模式" $jvm_type
$RED----------------------------------$END

2 脚本交互

2.1 基础知识

2.1.1 shell登录解读

基础知识

shell配置文件

系统级别生效配置文件
    /etc/profile
        系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行
    /etc/profile.d/*.sh
        被/etc/profile文件调用,执行当前目录下所有的文件中关于shell的设置
    /etc/bashrc
        为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。
用户级别生效配置文件
    ~/.bash_profile
        设定用户专用的shell信息,当用户登录时,该文件仅仅执行一次
    ~/.bashrc
        该文件包含用户专用的bash信息,当登录时以及每次打开新的shell时,该文件被读取
用户退出生效配置文件
    ~/.bash_logout: 当每次退出系统(退出bash shell),执行该文件.
    ~/.bash_history: 
        用户登录时自动读取其中的内容并加载到内存hiatory记录中
        logout时将内存中的history记录写入该文件中

shell的登录方式

交互式登录
    方法1:密码登录
        直接通过终端输入账号密码登录
        复制终端
    方法2:su 变更shell操作用户的身份
        su - 用户名
        超级用户除外,需要键入该使用者的密码。
非交互式登录
    方法1:脚本执行
    方法2:su 用户名
登录shell的文件生效流程
    /etc/profile.d/*.sh
        -> /etc/profile
            -> /etc/bashrc
                -> ~/.bashrc
                    -> ~/.bash_profile
非登录shell的文件生效流程
    /etc/profile.d/*.sh
        -> /etc/bashrc
            -> ~/.bashrc 
注意:
    若多配置文件中设置相同的变量,则后面配置文件中变量的值会覆盖前面配置文件中同一变量的值。
su的相关参数
    -:当前用户不仅切换为指定用户的身份,同时所用的工作环境也切换为此用户的环境。
    -l:同 - 的使用类似,完整切换工作环境,后面需要添加欲切换的使用者账号。
    -p:表示切换为指定用户的身份,但不改变当前的工作环境(不使用切换用户的配置文件)。
    -m:和 -p 一样;
    -c 命令:仅切换用户执行一次命令,执行后自动切换回来,该选项后通常会带有要执行的命令。

配置文件修改后生效的方法

修改profile和bashrc文件后需生效两种方法
    1. 重新启动shell进程
    2. source|. 配置文件

注意:
    source 会在当前shell中执行脚本,所有一般只用于执行置文件,或在脚本中调用另一个脚本的场景

简单实践

准备工作

为所有的shell相关的配置文件添加关键信息
echo "echo '1 - /etc/profile'" >> /etc/profile
echo "echo '2 - /etc/profile.d/2.sh'" >> /etc/profile.d/2.sh
echo "echo '3 - /etc/bashrc'" >> /etc/bashrc
echo "echo '4 - ~/.bash_profile'" >> ~/.bash_profile
echo "echo '5 - ~/.bashrc'" >> ~/.bashrc

非登录效果

[root@localhost ~]# su - python
上一次登录:五 6月 10 16:16:37 CST 2022pts/1 上
2 - /etc/profile.d/2.sh
1 - /etc/profile
3 - /etc/bashrc
[python@localhost ~]$ su root
密码:
2 - /etc/profile.d/2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值