这些完全相同,但第一个不起作用,第二个起作用。有人知道怎么让第一个开始工作吗?我认为这是零问题。我试图在第一个值中替换空值,但仍然无法使其工作。也许我是在错误地替换空值?
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一个星期以来,我一直在发问,都得到了答案,我不知道该说什么,但谢谢你,我希望有一天能把这个还给社区。
发布于 2017-09-22 19:14:07
原来的代码实际上有一些微妙的bug。您的字符串中没有要替换的空值,因为C字符串(由bash使用)不能包含文字NUL:它们由第一个NUL终止。
因此,将文件名列表存储在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 -字词-没有被引用。这将导致在定义数组变量时展开它们。
https://stackoverflow.com/questions/46371044
复制相似问题