用新行替换Null值 - 我想

时间:2017-09-22 18:25:18

标签: bash

这些完全相同,但第一个不起作用,第二个起作用。有谁知道如何让第一个工作?我认为这是无效问题。我尝试在第一个中替换空值,但仍然无法使其工作。也许我正在错误地替换空值?

1)这不起作用

#!/bin/bash

export CSM_DATA_DIR="/opt/halogen/dbservice/changes/Ayman/test2"
export CUSTOMER_LIST_FILES="${CSM_DATA_DIR}/*_customer_list.csv"
export ELMS_STORAGE_FILES="${CSM_DATA_DIR}/*_elms_storage.csv"


paste <(tr ' ' '\n' <<<"$CUSTOMER_LIST_FILES") <(tr ' ' '\n' <<<"$ELMS_STORAGE_FILES") | while read first_name last_name
do
echo $first_name : $last_name
done

输出错误,应该是两行并且应该正确分割

/opt/halogen/dbservice/changes/Ayman/test2/sl1_customer_list.csv /opt/halogen/dbservice/changes/Ayman/test2/sl2_customer_list.csv : /opt/halogen/dbservice/changes/Ayman/test2/sl1_elms_storage.csv /opt/halogen/dbservice/changes/Ayman/test2/sl2_elms_storage.csv

2)这可以作为无内容

#!/bin/bash
export fname="/opt/halogen/dbservice/changes/Ayman/test2/sl1_customer_list.csv /opt/halogen/dbservice/changes/Ayman/test2/sl2_customer_list.csv"
export lname="/opt/halogen/dbservice/changes/Ayman/test2/sl1_elms_storage.csv /opt/halogen/dbservice/changes/Ayman/test2/sl2_elms_storage.csv"

paste <(tr ' ' '\n' <<<"$fname") <(tr ' ' '\n' <<<"$lname") | while read first_name last_name
do
echo $first_name : $last_name
done

输出正确,两行和变量并行读取

/opt/halogen/dbservice/changes/Ayman/test2/sl1_customer_list.csv : /opt/halogen/dbservice/changes/Ayman/test2/sl1_elms_storage.csv
/opt/halogen/dbservice/changes/Ayman/test2/sl2_customer_list.csv : /opt/halogen/dbservice/changes/Ayman/test2/sl2_elms_storage.csv

我已经发布了一个星期的问题现在都得到答案,我不知道该说些什么,但谢谢你,我希望有一天能回到社区

1 个答案:

答案 0 :(得分:2)

原始代码实际上有许多微妙的错误。您的字符串中没有要替换的NUL,因为C字符串(由bash使用)不能包含文字NUL:它们会被第一个存在的NUL终止。< / p>

因此,在bash(或C)中将文件名列表存储在单个字符串中是不安全的,因为文件名可以包含空格,换行符 - 除NUL之外的任何字符。因此,没有一种方法可以知道一个名字何时结束而下一个名称何时开始。

要安全地迭代文件对(这似乎是你正在尝试做的事情),将每个glob扩展为一个数组,并同时迭代这两个数组。

#!/usr/bin/env bash
#              ^^^^- not /bin/sh, which doesn't support arrays

csm_data_dir="/opt/halogen/dbservice/changes/Ayman/test2"
customer_list_files=( "${csm_data_dir}"/*_customer_list.csv )
elms_storage_files=( "${csm_data_dir}"/*_elms_storage.csv )

for idx in "${!customer_list_files[@]}"; do
  customer_list_file=${customer_list_files[$idx]}
  elms_storage_file=${elms_storage_files[$idx]}
  printf '%q : %q\n' "$customer_list_file" "$elms_storage_file"
done

请注意,* s - glob字符 - 未引用。这会导致在定义数组变量时扩展它们。