BASH if-then-elseの動作の説明をしたいです。

BASH if-then-elseの動作の説明をしたいです。

次のような短いif-then-elseスクリプトがあります。

for INV in "$(ls np4178/*pdf)" ;\
do INVNUMB="$(pdfgrep -ho 'IN[0-9]{6,6}' $INV)" ; \
if [[ -z ${INVNUMB+x} ]]; \
then \
  echo "\n$INVNUMB" ; \
else \
  echo "wrong  \n$INVNUMB" ; \
fi ; \
done

次を生成します。

wrong  \nIN353886
IN353897
IN353905
IN353910
IN353902
IN353864
IN353875
IN353840
IN353862
IN353922
IN353739
IN353876
IN353920

ただし、宣言を変更すると、else次の結果が表示されます。

for INV in "$(ls np4178/*pdf)" ;\
   do INVNUMB="$(pdfgrep -ho 'IN[0-9]{6,6}' $INV)" ; \
   if [[ -z ${INVNUMB+x} ]]; \
   then \
     echo "\n$INVNUMB" ; \
   else \
     echo "\nIN000000" ; \
   fi ; \
done

それから私はこれだけを得ます:

\nIN000000

なぜ?句のテキスト文字列を変更すると、elseスクリプトの全体的な動作と結果がどのように変更される可能性がありますか?

\nセクションで改行文字がリテラルとして印刷されるのはなぜですかelse

ベストアンサー1

このコードにはいくつかの欠陥があります。

  1. 解析されないls。コマンド置換を引用したので、各結果はINV単一の文字列として渡されます。代わりにグローバル結果を繰り返すことができます。
for inv in np4178/*pdf; do
  1. このコードには、またはは必要ありません;\実際、それらが書かれる方法は実際にお互いを相殺します。 ;改行区切り文字\であり、行末で使用されるときに改行をエスケープするエスケープ文字です。

  2. echo(通常)はバックスラッシュエスケープ文字()を解釈しません。\n使用できますecho -eが、printfはechoよりも優れています。

  3. すでに見つけたように、テスト構成は変数ですはいnullであることを確認したい場合いいえ無効

  4. これを行う理由はまったくありません${INVNUMB+x}

必要なコードは次のとおりです。

for inv in np4178/*pdf; do
    invnumb="$(pdfgrep -ho 'IN[0-9]{6,6}' "$inv")"
    if [[ -n "$invnumb" ]]; then
        printf '\n%s\n' "$invnumb"
    else
        printf '\n%s\n' "IN000000"
    fi
done

おすすめ記事