正しいコード

正しいコード

Ubuntu 16.04 - 微調整してみてください

これは私のコードです

#!/bin/bash

# if the .md5sum file doesn't exists
# or if the .md5sum file exists && doesn't match, recreate it
# but if the .md5sum file exists && matches then break and log

csvfile=inventory.csv

if [ ! -f .md5sum ] || [ -f .md5sum ] && [ ! md5sum -c .md5sum >/dev/null ]; then
   md5sum "$csvfile" > .md5sum
else
   echo "$csvfile file matched md5sum ..."
   break
fi

新しい .md5sum を生成する条件文の作成に問題があります。私は条件文のどの部分が間違っているかを調べようとしています。

root@me ~ # shellcheck run.sh

In run.sh line 8:
if [ ! -f .md5sum ] || [ -f .md5sum ] && [ ! md5sum -c .md5sum >/dev/null ]; then
^-- SC1009: The mentioned parser error was in this if expression.
                                         ^-- SC1073: Couldn't parse this test expression.
                                                               ^-- SC1072: Expected "]". Fix any mentioned problems and try again.

いくつかの比較ですべてのことを行うことができますが、比較を追加すると、より速くてきれいなスクリプトを得ることができるようです。

Jesse_Pのコードも確認しました。

#!/bin/bash

csvfile=inventory.csv

echo "hello" > inventory.csv
md5sum "$csvfile" > .md5sum
echo "well hello" > inventory.cvs

if [[ ! -f .md5sum ]] || [[ -f .md5sum && ! md5sum -c .md5sum >/dev/null ]]; then
        echo "All conditiions have been met to generate a new md5sum for inventory.csv ..."
        md5sum inventory.csv > .mds5sum
fi
exit 0

その後、シェルチェックを使用しました。

root@0003 ~ # shellcheck run.sh
    In run.sh line 8:
    if [[ ! -f .md5sum ]] || [[ -f .md5sum && ! md5sum -c .md5sum >/dev/null ]]; then
    ^-- SC1009: The mentioned parser error was in this if expression.
                             ^-- SC1073: Couldn't parse this test expression.
                                                                  ^-- SC1072: Expected "]". Fix any mentioned problems and try again.

答え1

正しいコード

#!/bin/sh

if [ ! -f .md5sum ] || [ -f .md5sum ] && ! md5sum -c .md5sum > /dev/null
then
    echo "All conditions have been met to generate a new md5sum for inventory.csv ..."
    md5sum inventory.csv > .mds5sum
fi

分析する

[ ! -f .md5sum ]
[ -f .md5sum ]

これは一般的なコマンドなので、testPOSIXでは[...]二重括弧は必要ありません。

! md5sum -c .md5sum > /dev/null

これはコマンドではないtestため、周囲に括弧はありません。

ノート

  1. いいえbashshこのスクリプトでは実行できます。移植性のためにsh可能であれば、POSIXシェル()のみを使用することをお勧めします。

  2. md5sumたとえば、に置き換えられましたsha512sum。ハッシングアルゴリズムは完璧ではないが、md5sum特に衝突に強くないことが知られている。sha512sumさらに短いハッシュが必要ない場合にのみお勧めします。

  3. 詳しくはこちらテストコマンド

  4. または詳細POSIX

関連情報