bash whileループは一重引用符で刺激される

bash whileループは一重引用符で刺激される

数行のコードがあります。$1ループがあるファイルにパラメータがあるかどうかを確認したいので、whileこのコードを書きました。

#!/bin/bash
if [ ! -z $1 ]
then
    update=$1;
    while read line
    do
        if [ $update == $line ]
        then
            echo "yes";
        fi
    done<./available_updates
fi

しかし、デバッグ時に実行すると

[root@pc bagheri]# bash -x ./test.sh my_value

それは言う:

+ '[' my_value == 'my_value' ']'

「is」という単語を印刷するのではなく、2つの一重引用符のために条件をスキップしますが、ファイルがファイルに存在するとmy_value100%確信しています。available_updatesこの問題についてどうすればよいですか?

ベストアンサー1

テキストを処理するためにシェルループを使用しないでください

#! /bin/sh -
update="${1?missing update argument}"
grep -Fxqe "$update" < available_updates && echo yes

コードに関するいくつかの問題:

  • パラメータ拡張は、Bourneなどのシェルから引用する必要があります。
  • 1行を読む構文はreadis IFS= read -r line、notですread line
  • 構文の場合は、スクリプトに1つ以上のパラメータが提供されていることを確認してください[ "$#" -gt 0 ](方法も参照${1?error message})。[ ! -z "$1" ](ここに欠落している引用符を追加してください。)最初の引用符が空でないことを確認してください。

出力に表示される内容はコマンドに渡されたデータの一部ではなく'、表示された内容が有効なシェルコードを構成していることを確認するために出力されます。これは、単にそこにあるのではなく、引用が必要と見なされる他の見えない文字がある可能性があることを示しています。 「バイト順表示」文字であるU+FEFFのようなものかもしれません。xtrace[$linemy_valuebash

ランニングは目にLC_ALL=C sed -n l < available-updates見えない数値を明らかにするのに役立ちます。

おすすめ記事