2016-08-11 11 views
0

で文字列を比較します。 parameters.txtファイルの各行の区切り文字として:を使用し、:の残っているものはvar1に、:の右側はvar2に格納します。 sheet_nameが格納されていない場合、var1sheet_namenot matchedを格納するときにmatchedを印刷したいとします。私が間違っているのは何は、私は内容が次のように<code>parameters.txt</code>という名前のファイルを持っているシェルスクリプト

filename=parameters.txt 
IFS=$'\n'  # make newlines the only separator 

for j in `cat $filename` 
    do 
     var1=${j%:*} # stores text before : 
     var2=${j#*:} # stores text after : 

     if [ “$var1” == “sheet_name” ]; then 
     echo ‘matched’ 
     else 
     echo “not matched“ 
     fi 

done 

次かかわらず、常に何var1店舗のmatchedを印刷し、私のコードはありますか?親切に助けてください。

+0

ここで 'for'ループを使用しないでください。 http://mywiki.wooledge.org/BashFAQ/001 – chepner

+1

を読んでください。http://www.shellcheck.netでコードを実行して、いくつかの問題を解決してください。また、適切な方法を知るためには、[For Line With Read](http://mywiki.wooledge.org/DontReadLinesWithFor)と[Bash FAQ 001](http://mywiki.wooledge.org/BashFAQ/001)も読んでください行単位/フィールド単位のデータを読み込みます。 –

+1

引用符は "スマート" /ユニコードの引用符で、シェルスクリプトで必要なものはまったくありません。標準ASCII二重引用符と一重引用符を使用していることを確認してください。 –

答えて

1

あなたはcatを無駄に使用しています。しかし、どういうわけか[ shell parameter expansion ]

while read line 
do 
if [[ "${line%:*}" = "sheet_name" ]] #double quote variables deals word splitting 
then 
    echo "matched" 
fi 
done<parameters.txt 

あなたが探しているものとまったく同じです。


あなたのためメッセージ

[ ShellCheck ]は、

を言う "行ではなく、言葉を読み取るには、パイプ/ 'しばらく読み取り' ループにリダイレクトします。" shellcheckから


チェック[ this ]ノート。

0

これはいかがですか?

filename=parameters.txt 

while IFS=: read -r first second; do 
    if [ “$first” == “sheet_name” ]; then 
    echo ‘matched’ 
    else 
    echo “not matched“ 
    fi 
done < $filename 
+0

すべての場合に 'not matched 'を表示します。 –

+0

'=='は[man page](http://linux.die.net/man/1/test)ごとに '='にする必要があります。 – cxw

関連する問題