首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用新行替换零值-我想

用新行替换零值-我想
EN

Stack Overflow用户
提问于 2017-09-22 18:25:18
回答 1查看 475关注 0票数 0

这些完全相同,但第一个不起作用,第二个起作用。有人知道怎么让第一个开始工作吗?我认为这是零问题。我试图在第一个值中替换空值,但仍然无法使其工作。也许我是在错误地替换空值?

1)这不起作用

代码语言:javascript
复制
#!/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

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

代码语言:javascript
复制
/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)它的工作原理是完整的

代码语言:javascript
复制
#!/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

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

代码语言:javascript
复制
/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

一个星期以来,我一直在发问,都得到了答案,我不知道该说什么,但谢谢你,我希望有一天能把这个还给社区。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-22 19:14:07

原来的代码实际上有一些微妙的bug。您的字符串中没有要替换的空值,因为C字符串(由bash使用)不能包含文字NUL:它们由第一个NUL终止。

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

为了安全地迭代成对的文件(这似乎是您要做的),将每个glob展开成一个数组,并同时迭代两个数组。

代码语言:javascript
复制
#!/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 -字词-没有被引用。这将导致在定义数组变量时展开它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46371044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档