2017-09-22 11 views
0

これらは同じですが、最初のものは二番目の作品、動作しない正確だと思います。誰もが最初に働く方法を知っていますか?私はそれがヌル問題だと思う。私は最初のものでnull値を置き換えようとしましたが、まだそれを動作させることができませんでした。おそらく私はnull値を間違って置き換えていますか?は、新しい行にNULL値を置き換えます - 私は

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 

出力間違ったこのdoesntの仕事は、二行である必要があり、正しく分割すべき

/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)これはintneded

#!/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 

出力正解として働きます、2つの行と変数を並列に読み込みます。

/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

意図的に最初の例で引用アスタリスクですか? – user000001

+0

@ user000001であっても、リストではなく文字列に結果が格納されるため、複数のファイル名を格納するために使用するデータ構造が間違っています。 –

+0

BTW - 'export'は、変数をローカルシェルのメモリに保存するのではなく、環境に置くことでサブプロセスが利用できるようにする場合にのみ必要です。小文字の名前が予約されているのに対し、(すべて大文字の名前は、シェルやOSの意味を持つ変数のために使用されているPOSIX定義の命名規則:とhttp://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html再を参照してくださいアプリケーション用)。 –

答えて

2

元のコード実際にはいくつか微妙なバグがあります。彼らは最初のNULの存在によって終了している:(bashので使用されるような)C文字列リテラルはNULを含めることができないので、何のNULsは、交換するあなたの文字列ではありません。ファイル名にスペース、改行を含めることができるため

この結果は、bash(またはC)における単一の文字列にファイル名のリストを格納し、安全ではない - NUL以外の任意の文字が。その結果、ある名前が終わり、次の名前が始まるときを知る方法はありません。

は安全に、(あなたが何をしようとしてのように見える)ファイルのペアを反復配列に各グロブを展開し、同時に両方の配列を反復処理するには。グロブ文字 - - 引用されていない* Sがあること

#!/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 

注意。これにより、配列変数が定義されたときに展開されます。

+0

ありがとう、これはうまくいったが、なぜ私のコードは2番目の例で動作しないのですか? 「微妙な」バグを無視する – aymanzone

+0

「第2の」意味は?最初のもの( "これは動作しません"と表示されています)では、グロブは引用符で囲まれた文字列に展開されないので、置き換えは 'echo'の行まで行われません。 $ {first_name}:$ {last_name} "'を引用符で囲んだ場合、これはもう少し明白です(これは 'echo'呼び出しの間にglobが展開されるのを防ぐためです)。 –

+0

つまり、 'CUSTOMER_LIST_FILES =" $ {CSM_DATA_DIR}/* _ customer_list.csv "'は実際に '*'をファイルのリストで置き換えず、 '<<<" $ CUSTOMER_LIST_FILES "'も置き換えません。拡張が元のコードで行われる 'echo $ CUSTOMER_LIST_FILES'(引用符なし)を実行するときだけです。 –

関連する問題