
# 开发一个Shell脚本
本章节介绍如何在数据开发模块上开发一个Shell脚本示例。
#### 环境准备
- 已开通弹性云服务器，并创建ECS，ECS主机名为"ecs-dgc"。
  ![](https://support.huaweicloud.com/usermanual-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
  本示例主机选择"CentOS 8.0 64bit with ARM(40GB)"的公共镜像，并且使用ECS自带的Shell环境，您可登录主机后使用shell命令确认服务器的Shell环境。
  ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002625412398.png "点击放大")
  
- 已开通数据集成增量包，CDM集群名为"cdm-dlfpython"，提供数据开发模块与ECS主机通信的代理。
- 请确保ECS主机与CDM集群网络互通，互通需满足如下条件：
  - CDM集群与ECS主机同区域情况下，同虚拟私有云、同子网、同安全组的不同实例默认网络互通；如果同虚拟私有云但是子网或安全组不同，还需配置路由规则及安全组规则，配置路由规则请参见[如何配置路由规则](https://support.huaweicloud.com/bestpractice-vpc/bestpractice_0009.html#bestpractice_0009__zh-cn_topic_0252060877_li16617547103419)章节，配置安全组规则请参见[如何配置安全组规则](https://support.huaweicloud.com/usermanual-ecs/zh-cn_topic_0140323152.html)章节。
  
  - CDM集群与ECS主机处于不同区域的情况下，需要通过公网或者专线打通网络。通过公网互通时，需确保CDM集群已绑定EIP，数据源所在的主机可以访问公网且防火墙规则已开放连接端口。
  
  - 此外，您还必须确保该ECS主机与CDM集群所属的企业项目必须相同，如果不同，需要修改工作空间的企业项目。
   
 
#### 约束限制
- Shell节点支持脚本参数和作业参数。
- Shell注释不能以"#{"开头，与数据开发内置的EL表达式用法冲突。
 
#### 建立主机数据连接
开发Shell脚本前，我们需要建立一个到弹性云服务器ECS的连接。
1. [登录DataArts Studio管理控制台](https://console.huaweicloud.com/dayu/)。
   
   详情请参考[访问DataArts Studio实例控制台](https://support.huaweicloud.com/usermanual-dataartsstudio/dataartsstudio_01_0001.html)。
   
   
2. 在DataArts Studio控制台首页，选择对应工作空间的"管理中心"模块，进入管理中心页面。
3. 在管理中心页面，单击"数据连接"，进入数据连接页面并单击"创建数据连接"。
4. 参见[表1]配置相关参数，创建主机连接名称为"ecs"的数据连接，如[图1]所示。
   
    表1主机连接 
   | 参数      | 是否必选 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   |:---|:---|:---|
   | 数据连接类型  | 是    | 主机连接固定选择为主机连接。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   | 数据连接名称  | 是    | 数据连接的名称，只能包含字母、数字、下划线和中划线，且长度不超过100个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   | 描述      | 否    | 为更好地识别数据连接，此处加以描述信息，长度不能超过100个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   | 标签      | 否    | 标识数据连接的属性。设置标签后，便于统一管理。 说明： 标签的名称，只能包含中文、英文字母、数字和下划线，不能以下划线开头，且长度不能超过100个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | 适用组件    | 是    | 选择此连接适用的组件。勾选组件后，才能在相应组件内使用本连接。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | **基础与网络连通配置**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |||
   | 主机地址    | 是    | Linux操作系统主机的IP地址。 请参考[查看云服务器详细信息](https://support.huaweicloud.com/usermanual-ecs/ecs_03_0123.html)获取。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   | 绑定Agent | 是    | 选择CDM集群，CDM集群提供Agent。如果没有可用的CDM集群，请参考[创建CDM集群](https://support.huaweicloud.com/usermanual-dataartsstudio/dataartsstudio_01_0576.html)进行创建。 说明： - CDM集群作为管理中心数据连接Agent时，单集群的并发活动线程最大为200。即当多个数据连接共用同一Agent时，通过这些数据连接提交SQL脚本、Shell脚本、Python脚本等任务的同时运行上限为200，超出的任务将排队等待。建议您按照业务量情况规划多个Agent分担压力。   - 在调度Shell、Python脚本时，Agent会访问ECS主机，如果Shell、Python脚本的调度频率很高，ECS主机会将Agent的内网IP加入黑名单。为了保障作业的正常调度，强烈建议您使用ECS主机的**root** 用户将绑定Agent（即CDM集群）的内网IP加到**/etc/hosts.allow** 文件里面。 CDM集群的内网IP获取方式请参见[查看集群信息并修改配置](https://support.huaweicloud.com/usermanual-dataartsstudio/dataartsstudio_01_0587.html)。    |
   | 端口      | 是    | 主机的SSH端口号。 Linux操作系统主机的默认登录端口为22，如有修改可通过主机路径"/etc/ssh/sshd_config"文件中的port字段确认端口号。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   | KMS加密密钥 | 是    | 通过KMS加解密数据源认证信息，选择KMS中的任一默认密钥或自定义密钥即可。 说明： - 第一次通过DataArts Studio或KPS使用KMS加密时，会自动生成默认密钥dlf/default或kps/default。关于默认密钥的更多信息，请参见[什么是默认密钥](https://support.huaweicloud.com/dew_faq/dew_01_0045.html)章节。  - 仅支持通过对称密钥加密，暂不支持非对称密钥。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | **数据源认证及其他功能配置**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |||
   | 用户名     | 是    | 主机的登录用户名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   | 登录方式    | 是    | 选择主机的登录方式： - 密钥对  - 密码                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | 密钥对     | 是    | "登录方式"为"密钥对"时，显示该配置项。 主机的登录方式为密钥对时，您需要获取并上传其私钥文件至OBS，在此处选择对应的OBS路径（OBS路径中不能存在中文字符）。 说明： 此处上传的私钥文件应和主机上配置的公钥是一个密钥对，详情请参见[密钥对使用场景介绍](https://support.huaweicloud.com/usermanual-ecs/ecs_13_0201.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | 密钥对密码   | 否    | 如果密钥对未设置密码，则不需要填写该配置项。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | 密码      | 是    | "登录方式"为"密码"时，显示该配置项。 主机的登录方式为密码时，填写主机的登录密码。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
      
   图1新建主机连接   
   ![](https://support.huaweicloud.com/usermanual-dataartsstudio/zh-cn_image_0000002706359160.png "点击放大")
   
   
   ![](https://support.huaweicloud.com/usermanual-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
   关键参数说明：
   - 主机地址：[已开通ECS主机](https://support.huaweicloud.com/usermanual-dataartsstudio/dataartsstudio_01_0529.html#dataartsstudio_01_0529__li6183612122320)中开通的ECS主机的IP地址。
   
   - 绑定Agent：[已开通批量数据迁移增量包](https://support.huaweicloud.com/usermanual-dataartsstudio/dataartsstudio_01_0529.html#dataartsstudio_01_0529__li948222884818)中开通的CDM集群。
    
   
   
5. 单击"测试"，测试数据连接的连通性。如果无法连通，数据连接将无法创建。
6. 测试通过后，单击"确定"，创建数据连接。
 
#### 开发Shell脚本
1. 在"数据开发 \> 脚本开发"模块中创建一个Shell脚本，脚本名称为"shell_test"。
2. 选择已创建好的主机连接ecs。
3. 编写Shell脚本并保存脚本。编写以下内容。下面是个示例。 
   ```
   #!/bin/bash
   # 获取传递的参数
   OUTPUT_PATH=$1
   LOCAL_OUTPUT_FILE=$2
   # 检查参数是否传递
   if [ -z "$OUTPUT_PATH" ] || [ -z "$LOCAL_OUTPUT_FILE" ]; then
       echo "Usage: $0 <output_path> <local_output_file>"
       exit 1
   fi
   # 从HDFS中读取文件（假设Hadoop环境已配置）
   hadoop fs -getmerge $OUTPUT_PATH $LOCAL_OUTPUT_FILE
   # 检查文件是否成功下载
   if [ $? -eq 0 ]; then
       echo "文件已成功下载到 $LOCAL_OUTPUT_FILE"
   else
       echo "文件下载失败"
   fi
   # 交互式输入
   read -p "请输入一个确认信息: " confirmation
   echo "您输入的确认信息是: $confirmation"
   ```
   
   
4. 使脚本可执行。 
   更改脚本权限。
   1. 打开终端，导航到脚本所在的目录。
   
   2. 使用**chmod** 命令使脚本可执行。
      ```
      chmod +x shell_test.sh
      ```
      
    
   
   
5. 运行脚本。 
   运行脚本并传递参数。
   在终端中运行脚本，并传递两个参数。例如：
   ```
   ./shell_test.sh /user/your_username/hive_output /path/to/local/output/file
   ```
   
   
6. 脚本运行结果。 
   假设HDFS路径/user/your_username/hive_output中有文件，并且本地路径/path/to/local/output/file可写，脚本的运行结果可能如下：
   ```
   文件已成功下载到/path/to/local/output/file
   请输入一个确认信息: 确认
   您输入的确认信息是: 确认
   ```
   
   
**详细步骤总结如下：**
1. **创建脚本文件** ：
   - 使用文本编辑器创建shell_test.sh文件。
   
   - 编写脚本内容，包括参数传递和交互式输入。
    
2. **使脚本可执行** ：
   - 使用chmod命令使脚本可执行。
    
3. **运行脚本** ：
   - 在终端中运行脚本，并传递两个参数。
   
   - 观察脚本的运行结果，确保文件成功下载并记录用户输入的确认信息。
    
**脚本详细解释** **如下：**
- **参数传递** ：
  - OUTPUT_PATH=$1：获取第一个参数，表示HDFS输出路径。
  
  - LOCAL_OUTPUT_FILE=$2：获取第二个参数，表示本地输出文件路径。
   
- **参数检查** ：
  - if \[ -z "$OUTPUT_PATH" \] \|\| \[ -z "$LOCAL_OUTPUT_FILE" \]; then：检查参数是否为空，如果为空则输出使用说明并退出脚本。
   
- **从HDFS中读取文件** ：
  - hadoop fs -getmerge $OUTPUT_PATH $LOCAL_OUTPUT_FILE：使用Hadoop命令从HDFS中读取文件并合并到本地文件。
   
- **检查文件是否成功下载** ：
  - if \[ $? -eq 0 \]; then：检查上一条命令的退出状态，如果为0表示成功，否则表示失败。
   
- **交互式输入** ：
  - read -p "请输入一个确认信息: " confirmation：提示用户输入确认信息。
  
  - echo "您输入的确认信息是: $confirmation"：输出用户输入的确认信息。
   
通过以上步骤，你可以在本地环境中编写并运行一个包含参数和交互式输入的Shell脚本，并查看其运行结果。
