
お世話になります。
まず、下記のスクリプトをご確認ください。
if [ ! -f ${E_FILE} -o -f ${E_FILE} -a `grep -c 'ERROR' ${E_FILE}` -ne 0 ] ; then
上記条件文は次のような論理解釈で作成しました。
(${E_FILE}というファイルが存在しない) or
(${E_FILE}というファイルが存在する and ファイル内に'ERROR'という文字列が存在する)
これを実行すると: too many argumentsというエラーが返ってきます。
原因をご存知の方がいればご教示いただきたく存じます。
よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
原因は${E_FILE}が存在しないからです。
まず、下記の部分についてどのように実行されるとお考えでしょうか?
if [ ! -f ${E_FILE} -o -f ${E_FILE} -a `grep -c 'ERROR' ${E_FILE}` -ne 0 ] ; then
おそらく、以下のように考えておられるのではないでしょうか?
1.test ! -f ${E_FILE}
2.これがFALSEなら test -f ${E_FILE}
3.これがTRUEならgrep -c 'ERROR' ${E_FILE}
4.test (3の結果) -ne 0
しかし、残念ながら実際には、
1.grep -c 'ERROR' ${E_FILE} →ファイルが存在しないのでエラー(標準出力はなし)
2.test ! -f ${E_FILE} -o -f ${E_FILE} -a -ne 0
2の部分で-a -ne 0の部分が文法エラーです。
理由は2が1つのコマンドとして解釈され、その前に``の部分が解釈されるからです。
されたいことを実現するには下記のように書くべきです。
if [ ! -f ${E_FILE} ] || [ -f ${E_FILE} -a `grep -c 'ERROR' ${E_FILE}` -ne 0 ]; then
さらに言えば、[ ! -f ${E_FILE} ]がFALSEならtest -f ${E_FILE}は必ずTRUEなので、
下記のように簡略化できます。
if [ ! -f ${E_FILE} ] || [ `grep -c 'ERROR' ${E_FILE}` -ne 0 ]; then
余談ですが書かれているコードをきっちりと書くならこんな感じ。
if test ! -f "${E_FILE}" || grep 'ERROR' "${E_FILE}"` > /dev/null; then
・例えば上記のようなことがあるから、-a、-oはあまり使わないほうが良い
(さらに、-a、-oは評価順序に関する規定が曖昧だから、右側から評価されても文句は言えない)
・変数はスペースが入ってきた場合を考慮してダブルクォーテーションで括る
・`grep -c ~` -ne 0はgrep ~ > /dev/nullで置き換えが可能
・[]よりもtestを使う。(Autoconfのドキュメントにある移植性の高いプログラムを書くためのガイドライン)
No.1
- 回答日時:
${E_FILE} というファイルが存在しないとき、
grep -c ERROR ${E_FILE}
は、エラーメッセージを出して、標準出力への書き出しはありません。従って、
if [ ! -f ${E_FILE} -o -f ${E_FILE} -a -ne 0 ]
となり、"[" コマンド の構文エラーになります。
そういうときは普通は、ファイルがあるときだけgrepを実行するようにします。
if [ ! -f ${E_FILE} ] || [ `grep -c ERROR ${E_FILE}` -ne 0 ]
さらに普通には、
if [ ! -f ${E_FILE} ] || grep ERROR ${E_FILE} >/dev/null
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- その他(ゲーム) SkyrimSEのMod organizer で困っています。誰か助けてください。 1 2022/12/05 01:49
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- その他(プログラミング・Web制作) Pythonを勉強しています。 5 2023/08/25 09:51
- その他(プログラミング・Web制作) セレクトボックスで選択された値をコントローラーで使用したい 2 2022/07/26 16:41
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- PHP $filePath = './user_img/' . $file['name'];? 1 2022/12/10 07:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
grepでの日本語検索
-
Linux環境 grepで改行コード(CR...
-
フィールドでgrepみたいなこと
-
awkのファイル出力について
-
sedの置換での「|」表記
-
表示桁数をそろえた文字列を変...
-
sed で \\ を含む文字列に置換
-
特定文字列間の文字列の抽出の...
-
grepで検索文字列が完全一致し...
-
特定の文字列を含む行だけ削除...
-
シェルスクリプトの記述について
-
Dirコマンドでフォルダ内ファイ...
-
ファイル名についている「-」と...
-
SONYの音楽ソフト「x-アプリ」...
-
ラズパイで『’test.service’をs...
-
エクセルの表にヘンな枠が・・・
-
pingは正常なのにtracerouteで...
-
OSローダの動きが変になって...
-
rm,cpコマンドの置き換えについて
-
スクリプトのエラー「unexpecte...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Linux環境 grepで改行コード(CR...
-
grepで全角文字の行を抽出
-
sed で \\ を含む文字列に置換
-
grepで日付指定してlogを取り出...
-
grepで検索文字列が完全一致し...
-
awkを用いて、特定の文字を含む...
-
LINUXで半角の英数字以外の文字...
-
【シェルスクリプト】awkの結果...
-
sedによる置換 置換ができない。
-
特定の文字列を含む行だけ削除...
-
grepでの抽出箇所のみ置換して...
-
zshの文字列置換機能
-
フィールドでgrepみたいなこと
-
コマンドの出力結果をn行おきに...
-
grep,cutで取得した文字の前後...
-
awkのフィールド数制限について...
-
grepで変数が使えない
-
sedコマンドで範囲指定しての部...
-
awkでファイル名の取り扱い
-
sedで特定行を抽出したいです
おすすめ情報