次の単純なファイルを使用するbash関数を作成しようとしています。
sample.txt
start=22 Mar 2016 10:00
end=22 Mar 2016 12:09
...そして、開始と終了を指定した時間範囲内で/ usr / localにインストールしたファイルを見つけます。
私が元々作成した関数は次のとおりです。
function findInstalled () {
if [[ $# -ne 1 ]]; then
echo "[ERROR] Usage: findInstalled /path/to/file" ;
return 1;
fi
start=$( grep start $1 | cut -d'=' -f2 ) ;
end=$( grep end $1 | cut -d'=' -f2 ) ;
if [[ ! -z $start ]]; then
start="-newerct \"${start}\"" ;
fi
if [[ ! -z $end ]]; then
end="! -newerct \"${end}\"" ;
fi
echo find /usr/local $start $end -type f ;
find /usr/local $start $end -type f ;
}
.. この関数を実行すると、次のような出力が得られます。
$ findInstalled /path/to/sample.txt
find /usr/local -newerct "22 Mar 2016 10:00" ! -newerct "22 Mar 2016 12:09" -type f
find: I cannot figure out how to interpret `"22' as a date or time
このコマンドを実際に実行するとエラーが発生します...cannot figure out how to interpret...
。ただし、エコーされたバージョンのコマンドをコピーして貼り付けると正常に実行されます。 何が問題なのか知っていますか? 私は二重引用符と一重引用符を使用または使用せずにさまざまな組み合わせを試しましたが、そのうち何も機能しません。
私が望む方法ではありませんが、次のことを実行して機能する機能を得ました。
function findInstalled () {
if [[ $# -ne 1 ]]; then
echo "[ERROR] Usage: findInstalled /path/to/file"
return 1;
fi
start=$( grep start $1 | cut -d'=' -f2 ) ;
end=$( grep end $1 | cut -d'=' -f2 ) ;
find /usr/local -newerct "$start" ! -newerct "$end" -type f ;
}
だから、これを使って元の目標を達成しましたが、元の機能が機能しないのはなぜですか、それとも可能かを知りたいのです。
答え1
問題は、シェルが行をトークンに分割する方法です。$start
まで拡張されます-newerct "22 Mar 2016 10:00"
。それからスペースで単語を分割します。したがって、find
次のパラメータが渡されます。-newerct
、など。したがって、エラーメッセージが表示されます"22
。状態:Mar
man bash
拡張順序は、中かっこ拡張、チルダ拡張、パラメータ、変数と算術拡張、コマンド置換(左から右へ)、トークン化、パス名拡張です。
ご希望どおりに可能かどうかわかりませんね。 2番目のスクリプトは読みやすくなりますが、変数が空でないことを確認する必要があります。おそらく次のようにすることができます:
find /usr/local ${start:+-newerct} "$start" ${end:+! -newerct} "$end" -type f ;