跟着GPT学习shell脚本,理论与实践相结合的学习计划。(一)

学习计划:初学者到高手

第1-2周:基础入门
  • 目标:了解Shell脚本的基本概念,掌握基础命令。
  • 内容
    • Shell脚本是什么,为什么使用Shell脚本。
    • 基本的Shell命令(如ls, cd, mkdir, rm等)。
    • 简单的脚本编写和执行方法。
  • 实践:编写一个简单的脚本,比如一个自动创建和删除文件夹的脚本。
第3-4周:进阶学习
  • 目标:学习Shell脚本的控制结构和数据处理。
  • 内容
    • 条件判断(if-else)和循环(for,while)。
    • 文件和字符串的基本操作。
    • 简单的函数使用。
  • 实践:编写一个更复杂的脚本,比如一个自动备份文件的脚本。
第5-8周:高级应用
  • 目标:掌握Shell脚本的高级特性,提高效率。
  • 内容
    • 高级数据处理(如awk, sed)。
    • 脚本的调试和错误处理。
    • 性能优化。
  • 实践:编写一个复杂的数据处理脚本或自动化任务脚本。
第9-12周:项目实战
  • 目标:通过实际项目来巩固和提高。
  • 内容
    • 选择一个实际项目,如自动化部署脚本。
    • 从规划到实现,完整的项目流程。
  • 实践:完成项目,进行测试和优化。
持续学习:
  • 继续关注Shell脚本的新特性和最佳实践。
  • 加入在线社区,如GitHub,参与开源项目

第1周:Shell脚本基础入门

学习目标
  • 了解Shell脚本的基本概念。
  • 掌握基础的Shell命令。
  1. Shell脚本简介

    • 定义:Shell脚本是一种用来自动化执行多个命令的脚本语言。它是在Unix或Linux操作系统上运行的一种程序,用来方便地执行命令序列。
    • 作用:自动化任务处理,如文件管理、程序执行、文本处理等。
  2. 基础Shell命令

    • ls:列出目录内容。
    • cd [目录]:更改当前目录。
    • mkdir [目录名]:创建新目录。
    • rm [文件或目录]:删除文件或目录。
    • echo [文本]:显示一行文本。
  3. 编写和执行简单脚本

    • 创建一个文本文件,如my_script.sh
    • 在文件中写入Shell命令,如echo "Hello, Shell!"
    • 通过在终端中输入bash my_script.sh来执行脚本。
实践任务
  • 任务:编写一个简单的Shell脚本,该脚本能够创建一个名为test_dir的目录,然后在该目录中创建一个名为hello.txt的文件,并在文件中写入Hello, Shell!
  • 步骤
    1. 打开文本编辑器,创建一个新文件,命名为create_dir_and_file.sh
    2. 编写脚本内容
#!/bin/bash
mkdir test_dir
echo "Hello, Shell!" > test_dir/hello.txt

                  3. 保存文件,并在终端中运行脚本。
                  4. 检查test_dir目录和hello.txt文件是否已创建,并查看文件内容。

第2周:深入理解和练习基础命令

学习目标
  • 掌握更多的基础Shell命令。
  • 学会使用命令参数和选项。
  1. 深入基础命令

    • cp [源文件] [目标位置]:复制文件或目录。
    • mv [源文件] [目标位置]:移动文件或目录,也可用于重命名。
    • grep [模式] [文件]:搜索文件中的文本。
    • find [路径] [选项]:在目录中查找文件。
  2. 命令参数和选项

    • 大多数命令都有参数和选项可以使用,以增强其功能。
    • 例如,ls -l(以长格式列出文件详细信息),grep -i(忽略大小写进行搜索)。
  3. 管道和重定向

    • 管道 |:将一个命令的输出作为另一个命令的输入。例如,ls | grep "txt" 会找出所有包含"txt"的文件名。
    • 重定向 >>>:用于将命令的输出保存到文件中。例如,echo "Hello" > file.txt 会创建或覆盖文件file.txt,并写入"Hello"。
实践任务
  • 任务:编写一个Shell脚本,该脚本能完成以下功能:
    1. 在当前目录下创建一个名为practice的新目录。
    2. practice目录中创建几个测试文件。
    3. 使用grep命令查找包含特定文本的文件。
    4. grep命令的输出重定向到一个新文件中。
#!/bin/bash
mkdir practice
cd practice
echo "Test file 1" > test1.txt
echo "Another test file 2" > test2.txt
echo "Different file 3" > test3.txt
grep "test" *.txt > results.txt

第3周:探索控制结构和数据处理

学习目标
  • 理解并使用Shell脚本的控制结构。
  • 学习文件和字符串的基本操作。

控制结构

  • 条件判断if-else):根据条件执行不同的命令。
if [ 条件 ]; then命令
else另一些命令
fi

循环forwhile):重复执行一系列命令。

  for 循环示例:

for i in 1 2 3; doecho $i
done

   while 循环示例:

count=1
while [ $count -le 3 ]; doecho $count((count++))
done

        脚本中的比较符号:

shell脚本中-eq、-ne、-gt、-ge、-lt、-le_shell脚本中-gt-CSDN博客

文件和字符串操作

  • 读取文件内容:使用 cat 或循环逐行读取。
  • 字符串操作:比较、连接和提取字符串。
  • 例如,字符串比较:if [ "$str1" == "$str2" ]; then
实践任务
  • 任务:编写一个Shell脚本,实现以下功能:
    1. 创建一个包含多个数字的文件。
    2. 读取文件中的数字,并计算它们的总和。
#!/bin/bash
echo -e "2\n4\n6" > numbers.txt
total=0
while read num; dototal=$((total + num))
done < numbers.txt
echo "Total sum is: $total"
  1. #!/bin/bash

    • 这是一个"shebang"行,用于指示脚本应该用哪个解释器来执行。在这个例子中,它指定使用bash来执行这个脚本。
  2. echo -e "2\n4\n6" > numbers.txt

    • echo命令用于输出文本。
    • -e选项允许echo解释转义字符,如\n(新行)。
    • "2\n4\n6"是被输出的字符串,包含数字2、4和6,每个数字后面跟着一个换行符。
    • >是重定向符号,用于将echo命令的输出写入numbers.txt文件。如果文件已存在,则会被覆盖。
  3. total=0

    • 这行代码初始化变量total为0。在循环中,total将用于累加所有数字。
  4. while read num; do

    • 这是一个while循环的开始。循环会一直执行,直到读取文件的行结束。
    • read num命令读取输入(在这个例子中是文件numbers.txt的每一行)并将其存储在变量num中。
  5. total=$((total + num))

    • 这行代码更新变量total的值。它使用$((...))来进行算术运算,将total的当前值加上变量num的值。
  6. done < numbers.txt

    • 这是while循环的结束部分。
    • < numbers.txtnumbers.txt文件的内容重定向到while循环中,即read命令读取的输入来自于这个文件。
  7. echo "Total sum is: $total"

    • 最后,这行代码输出计算得到的总和。
    • 这里使用了双引号来允许变量$total在字符串中被扩展(即替换为其值)。

 第4周:深入学习Shell函数和文本处理

学习目标
  • 理解并使用Shell函数。
  • 学习基础的文本处理工具。

Shell函数

  • 函数允许您将代码组织成可重用的模块。
  • 基本语法:
function_name () {# 函数体命令
}

文本处理工具

  • sed:流编辑器,用于执行文本替换、删除、插入等操作。
  • awk:强大的文本分析工具,适用于模式扫描和处理。
  • 示例:使用awk来分析文件并输出特定列。
实践任务
  • 任务:编写一个Shell脚本,实现以下功能:
    1. 使用函数来组织代码。
    2. 使用sedawk对文本文件进行处理。
#!/bin/bash# 定义一个函数
print_file () {cat $1
}# 使用sed来替换文本
replace_text () {sed -i 's/old/new/g' $1
}echo "Creating a sample file..."
echo "This is old text" > sample.txtecho "Before replacement:"
print_file sample.txtecho "Replacing text..."
replace_text sample.txtecho "After replacement:"
print_file sample.txt
  1. #!/bin/bash

    • 这行是shebang,它告诉系统使用bash解释器来执行这个脚本。
  2. 定义函数 print_file

    • print_file () {
      • 这行开始定义一个名为print_file的函数。
    • cat $1
      • cat命令用于显示文件的内容。$1是函数的第一个参数,在这里它将被解释为传递给函数的文件名。
    • }
      • 这行结束函数定义。
  3. 定义函数 replace_text

    • replace_text () {
      • 开始定义一个名为replace_text的函数。
    • sed -i 's/old/new/g' $1
      • 这行使用sed命令对文件进行文本替换。-i表示原地编辑文件。's/old/new/g'sed的替换命令,意味着将所有出现的“old”替换为“new”。$1代表函数的第一个参数,即要处理的文件名。
    • }
      • 结束函数定义。
  4. 脚本主体:

    • echo "Creating a sample file..."
      • 输出提示信息。
    • echo "This is old text" > sample.txt
      • 创建一个名为sample.txt的新文件,并写入文本“This is old text”。
    • echo "Before replacement:"
      • 输出提示信息。
    • print_file sample.txt
      • 调用print_file函数,将sample.txt作为参数传递,打印文件内容。
    • echo "Replacing text..."
      • 输出提示信息。
    • replace_text sample.txt
      • 调用replace_text函数,将sample.txt作为参数传递,对文件进行文本替换。
    • echo "After replacement:"
      • 输出提示信息。
    • print_file sample.txt
      • 再次调用print_file函数,打印替换文本后的文件内容。

第5周:学习高级数据处理和脚本调试

学习目标
  • 掌握使用awksed进行高级文本处理。
  • 学习Shell脚本的调试技巧。
学习内容
  1. 高级文本处理

    • awk高级用法:处理复杂文本格式,如字段提取、模式匹配、统计信息等。
    • sed高级用法:进行更复杂的文本替换和删除操作。
  2. 脚本调试

    • 使用set -xset +x在脚本中开启和关闭调试模式。
    • 使用bash -x your_script.sh来运行脚本,以显示每个命令及其参数。
实践任务
  • 任务:编写一个Shell脚本,使用awk处理文本文件,并包含脚本调试元素。
#!/bin/bash
set -x  # 开启调试# 使用awk处理文本
process_text_with_awk () {awk '{print $1, $3}' $1
}echo "Creating a sample file..."
echo -e "1 apple 3.5\n2 banana 4.2\n3 cherry 2.8" > fruits.txtecho "Processed text:"
process_text_with_awk fruits.txtset +x  # 关闭调试
  1. set -x

    • 这行命令开启了脚本的调试模式。在调试模式下,脚本会打印每个命令及其扩展后的参数到标准输出,帮助理解脚本的执行过程。
  2. 定义函数 process_text_with_awk

    • process_text_with_awk () {
      • 这行开始定义一个名为process_text_with_awk的函数。
    • awk '{print $1, $3}' $1
      • 使用awk命令处理文本。awk会读取传入的文件(在这个例子中是函数的第一个参数$1),并对每一行执行花括号内的操作。这里的操作是打印每行的第一个和第三个字段,字段默认由空格分隔。
    • }
      • 这行结束函数的定义。
  3. 创建示例文件:

    • echo "Creating a sample file..."
      • 打印提示信息。
    • echo -e "1 apple 3.5\n2 banana 4.2\n3 cherry 2.8" > fruits.txt
      • 创建一个名为fruits.txt的新文件,并写入三行文本。每行包含一个数字、一个水果名和一个价格,字段间由空格分隔。
  4. 调用函数处理文本:

    • echo "Processed text:"
      • 打印提示信息。
    • process_text_with_awk fruits.txt
      • 调用process_text_with_awk函数,并传入fruits.txt作为参数。
  5. set +x

    • 这行命令关闭了脚本的调试模式。执行到这一行时,脚本会停止打印后续命令的执行细节。

第6周:Shell脚本的错误处理和性能优化

学习目标
  • 学习在Shell脚本中处理错误。
  • 了解如何优化Shell脚本的性能。
学习内容
  1. 错误处理

    • 使用set -e使脚本在出现错误时立即退出。
    • 使用trap命令捕获并处理信号和脚本退出。
    • 检查命令的返回值来决定是否继续执行。
  2. 性能优化

    • 避免在循环中使用管道和外部命令。
    • 使用内建命令和shell功能而不是外部程序。
    • 减少不必要的文件读写操作。
实践任务
  • 任务:编写一个Shell脚本,包含错误处理和性能优化的元素。
#!/bin/bash
set -e  # 出现任何错误时退出脚本trap 'echo "Error occurred at $LINENO"; exit 1' ERR# 一个可能失败的操作
possibly_failing_operation () {false  # 这个命令会失败
}# 性能优化的操作
optimized_operation () {for i in {1..1000}; do: # 内建的空操作done
}echo "Running possibly failing operation..."
possibly_failing_operationecho "Running optimized operation..."
optimized_operationecho "Script completed successfully."

trap 'echo "Error occurred at $LINENO"; exit 1' ERR

  • trap命令用于在脚本接收到指定的信号时执行特定的操作。在这里,它被配置为在脚本因任何错误而退出时(接收到ERR信号),输出错误发生的行号($LINENO变量)并以状态1退出。

第7周:探索Shell脚本中的数组和字符串操作

学习目标
  • 理解并使用Shell脚本中的数组。
  • 掌握字符串操作和处理技巧。
学习内容
  1. 数组操作

    • 创建和使用数组:array=(元素1 元素2 元素3)
    • 访问数组元素:${array[索引]}
    • 获取数组长度:${#array[@]}
    • 循环遍历数组元素。
  2. 字符串操作

    • 字符串拼接:直接将字符串放在一起。
    • 子字符串提取:${字符串:起始位置:长度}
    • 字符串替换:${字符串/旧字符串/新字符串}
实践任务
  • 任务:编写一个Shell脚本,实现数组和字符串的操作。
#!/bin/bash# 数组操作
fruits=("apple" "banana" "cherry")
echo "First fruit: ${fruits[0]}"
echo "All fruits: ${fruits[@]}"
echo "Number of fruits: ${#fruits[@]}"# 字符串操作
greeting="Hello, World!"
echo "Substring: ${greeting:7:5}"
replaced_greeting=${greeting/World/Shell}
echo "Replaced Greeting: $replaced_greeting"
  1. 数组操作部分

    • fruits=("apple" "banana" "cherry")
      • 这行创建了一个名为fruits的数组,包含三个元素:applebananacherry
    • echo "First fruit: ${fruits[0]}"
      • 这行打印数组fruits的第一个元素(索引为0)。结果是apple
    • echo "All fruits: ${fruits[@]}"
      • 这行打印数组fruits的所有元素。${fruits[@]}表示数组中的所有元素。
    • echo "Number of fruits: ${#fruits[@]}"
      • 这行打印数组fruits的长度,即它包含的元素数量。${#fruits[@]}用于获取数组长度。
  2. 字符串操作部分

    • greeting="Hello, World!"
      • 这行创建了一个名为greeting的字符串变量,内容为Hello, World!
    • echo "Substring: ${greeting:7:5}"
      • 这行打印字符串greeting从第7个字符开始的5个字符。结果是World
    • replaced_greeting=${greeting/World/Shell}
      • 这行将字符串greeting中的World替换为Shell,并将结果赋值给新变量replaced_greeting
    • echo "Replaced Greeting: $replaced_greeting"
      • 这行打印修改后的问候语。结果是Hello, Shell!

第8周:Shell脚本的高级特性和自动化任务

学习目标
  • 探索Shell脚本的高级特性,如子shell和进程替换。
  • 学习如何利用Shell脚本进行自动化任务。
学习内容
  1. 高级特性

    • 子shell:在子shell中运行命令(使用括号())。
    • 进程替换:使用<()>()将命令输出作为文件处理。
  2. 自动化任务

    • 使用Shell脚本自动化日常任务,如备份文件、监控系统状态等。
    • 编写脚本以定期执行任务(使用cron计划任务)。
实践任务
  • 任务:编写一个Shell脚本,演示子shell的使用,并创建一个简单的自动化任务。
  • 脚本示例
#!/bin/bash# 子shell示例
(cd /tmp && echo "Current directory: $(pwd)")# 自动化任务示例
backup_files () {tar -czf "backup-$(date +%Y%m%d).tar.gz" $1
}echo "Performing backup..."
backup_files /path/to/important/filesecho "Backup completed."
子Shell(Subshell)

子Shell是在一个新的Shell会话中执行命令的一种方式,它独立于当前的Shell。在子Shell中执行的命令不会影响当前Shell的环境(如变量和当前目录)。子Shell通常用于临时改变目录、设置局部变量或执行一系列命令,而不希望这些改变影响到当前的Shell环境。

自动化任务

自动化任务指的是通过脚本或程序自动执行一系列操作,而不需要人工干预。在Shell脚本中,自动化任务通常用于定期执行某些任务,如备份文件、监控系统状态、自动更新等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/201674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

农用烘干机市场分析:我国市场规模为190亿元

农用烘干机是运用在农业烘干领域的传统干燥设备之一&#xff0c;主要是为了农副产品直接使用或满足进一步加工的需要。农用烘干机具有操作弹性大、适应性强、处理能力大、设备运转可靠等优点&#xff0c;能大幅度提高农副产品烘干效率。现阶段&#xff0c;我国农用烘干机的市场…

AI助力智慧农业,基于YOLOv6最新版本模型开发构建不同参数量级农田场景下庄稼作物、杂草智能检测识别系统

智慧农业随着数字化信息化浪潮的演变有了新的定义&#xff0c;在前面的系列博文中&#xff0c;我们从一些现实世界里面的所见所想所感进行了很多对应的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《自建数据集&#xff0c;基于YOLOv7开发构建农田场景下杂草…

element中el-table表头通过header-row-style设置样式

文章目录 一、知识点二、设置全部表头2.1、方式一2.2、方式二 三、设置某个表头四、最后 一、知识点 有些时候需要给element-ui表头设置不同样式&#xff0c;比如居中、背景色、字体大小等等&#xff0c;这时就可以用到本文要说的属性header-row-style。官网说明如下所示&…

通用plantuml 时序图(Sequence Diagram)模板头

通用plantuml文件 startuml participant Admin order 0 #87CEFA // 参与者、顺序、颜色 participant Student order 1 #87CEFA participant Teacher order 2 #87CEFA participant TestPlayer order 3 #87CEFA participant Class order 4 #87CEFA participant Subject order …

关于支持向量机(SVM)的QSAR的结果的分析

图中的灰色部分代表了预测pIC50值与实测pIC50值之间的95%置信区间&#xff08;confidence interval&#xff09;。这个区间提供了一个预测误差的范围&#xff0c;意味着在统计上&#xff0c;我们有95%的把握认为真实值会落在这个区间内。具体来说&#xff0c;这个置信区间围绕着…

23、pytest通过skip跳过测试用例

官方实例 # content of test_skip.py import pytest import syspytest.mark.skip(reason"no way of currently testing this") def test_the_unknown():passdef valid_config():return Falsedef test_function():if not valid_config():pytest.skip("unsupport…

技术博客:Vue中各种混淆用法汇总

技术博客&#xff1a;Vue中各种混淆用法汇总 摘要 本文主要介绍了在Vue中使用的一些常见混淆用法&#xff0c;包括new Vue()、export default {}、createApp()、Vue.component、Vue3注册全局组件、Vue.use()等&#xff0c;以及如何使用混淆器对代码进行加固&#xff0c;保护应…

C/C++ 前缀和与差分

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,算法-CSDN博客 专题分栏&#xff1a;算法_仍有未知等待探索的博客-CSDN博客 目录 一、前言 1、什么是前缀和 2、什么是差分 3、优势 1.朴素做法&#xff1a; 2.用差分数组 二、代码实现 1、给一个数组去求其差…

Hadoop学习笔记(HDP)-Part.19 安装Kafka

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

LambdaQueryWrapper 和 QueryWrapper区别及案例

LambdaQueryWrapper 和 QueryWrapper 是 MyBatis-Plus&#xff08;简称 MP&#xff09;框架中用于构建查询条件的两种常用 Wrapper。它们的主要区别如下&#xff1a; 1. 写法和表达方式不同&#xff1a; QueryWrapper&#xff1a;使用传统的字符串形式构建查询条件&#xff0c…

分类信息发布小程序效果如何

信息发布系统连接信息供需双方&#xff0c;打造信息聚合平台&#xff0c;用户可获取和发布需求信息、参与互动交流&#xff0c;适用于同城、社区交流、客户互动、业务员/经纪人发布信息场景。 制作分类信息小程序后&#xff0c;商家后台设置信息项&#xff0c;发布者填写内容发…

腾讯云轻量应用服务器挂载对象存储详细说明

腾讯云轻量对象存储LighthouseCOS是腾讯云专为中小企业开发者打造的轻量级数据存储服务&#xff0c;适用于云端网站、小程序、课堂演示、云盘/图床等场景下的数据存储和处理任务。腾讯云百科txybk.com详细介绍腾讯云轻量对象存储使用、开通和收费价格说明&#xff1a; 轻量对象…

NetApp 高性能计算解决方案,处理、存储和分析海量数据

如果您不认为我们生活在一个激动人心的时代&#xff0c;不妨考虑一下高性能计算 (HPC) 是如何突破 AI 极限的。从基因组学到金融服务&#xff0c;NetApp HPC 解决方案一直在引领行业发展。 为什么选择 NetApp 的高性能计算解决方案&#xff1f; 快速、可扩展、可靠 对于如何满…

flutter的Overlay详解

Overlay 用于在屏幕上显示浮层的组件 定义及作用 用于在屏幕上显示浮层的组件。创建弹出窗口、提示框、菜单、对话框等。 源码分析 /// Overlay的设计思路 class Overlay extends StatefulWidget //可以看出Overlay是一个有状态的widget&#xff0c;直接看对应的OverlaySt…

配置CentOS服务器以支持PHP

CentOS是一款优秀的开源服务器操作系统&#xff0c;为各种网络服务提供了强大的支持。为了使CentOS服务器能够支持PHP&#xff0c;我们需要进行一些必要的配置。下面将介绍配置CentOS服务器以支持PHP的关键步骤。 安装PHP 首先&#xff0c;需要安装PHP解释器。在CentOS上&…

【python】使用pipenv创建虚拟环境进行打包

文章目录 一、pipenv 介绍二、快速上手使用pipenv2.1 安装pipenv2.2 创建虚拟环境2.3 激活环境2.4 虚拟环境中安装项目依赖包2.5 检查项目在虚拟环境中是否能正常运行2.6 打包项目2.7 删除虚拟环境 起因: 本地安装的模块太多,使用pyinstaller打包,会把许多无关模块打包进去&…

【头歌系统数据库实验】实验5 SQL的多表查询-1

目录 第1关&#xff1a;等值连接&#xff1a;求S表和J表城市相同的等值连接(列顺序还是按照S、J表) 第2关&#xff1a;查询供应情况&#xff0c;并显示供应商、零件和工程三者的名称 第3关&#xff1a;找出上海厂商供应的所有零件号码 第4关&#xff1a;找出使用上海产的零…

pythonGIL锁

一、GIL&#xff08;Global Interpreter Lock&#xff09;全局解释器锁是Python解释器中的一个机制&#xff0c;用于保证同一个时间只有一个线程能够执行Python字节码。这意味着在同一个时刻&#xff0c;只有一个线程能够访问共享的Python对象。 1、数据都是全局共享的&#x…

关于inline函数声明和定义为什么不可以分离

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言 inline函数在使用时声明和定义不可以分离&#xff0c;接下来我们将会解释为什么是这样的。 我们从程序的编译链接说起。 首先我们先介绍一下程序的翻译环境&#xff1a; 编译分以下几个步骤&#xff0c;预处理&#x…

Hadoop学习笔记(HDP)-Part.08 部署Ambari集群

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …