質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.65%

if -f で"二項演算子が予期されます"のメッセージが表示される件について

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 3,716

前提・実現したいこと

カレントディレクトリに対して、処理対象のファイルの存在確認をしたいです。
※処理対象はファイル名の先頭は必ずaaa_bbb_がついてます。

処理対象ファイルのファイル名のフォーマットはaaa_bbb_ccc.txtで、
aaa_bbb_までは固定長で、cccは変動します。(cccの箇所は文字数も3文字とは限らないです)
ファイルの存在確認について、固定長(aaa_bbb_)と正規表現を組み合わせて、
処理対処ファイルの存在確認をしたいです。

発生している問題・エラーメッセージ

下記のとおり、test.shを作成して実行したがファイルの存在確認ができておらず、
また二項演算子が予期されますが表示されてしまった。

user01@Libra:~/work$ ll
合計 0
drwxrwxrwx 1 user01 user01 4096  225 23:12 ./
drwxr-xr-x 1 user01 user01 4096  225 23:12 ../
-rw-rw-r-- 1 user01 user01    0  225 22:06 aaa_bbb_ccc.txt
-rw-rw-r-- 1 user01 user01    0  225 22:06 aaa_bbb_dd.txt
-rwxrwxrwx 1 user01 user01  182  225 23:12 test.sh*
user01@Libra:~/work$ cat test.sh
#!/bin/bash
if [ -f aaa_bbb_* ] ;then
  echo "file exists"
else echo "file does not exist"
fi
user01@Libra:~/work$
user01@Libra:~/work$ ./test.sh
./test.sh: 8 行: [: aaa_bbb_ccc.txt: 二項演算子が予期されます
file does not exist

試したこと

aaa_bbb_*をダブルクォートで囲む

user01@Libra:~/work$ ll
合計 0
drwxrwxrwx 1 user01 user01 4096  225 23:12 ./
drwxr-xr-x 1 user01 user01 4096  225 23:12 ../
-rw-rw-r-- 1 user01 user01    0  225 22:06 aaa_bbb_ccc.txt
-rw-rw-r-- 1 user01 user01    0  225 22:06 aaa_bbb_dd.txt
-rwxrwxrwx 1 user01 user01  182  225 23:12 test.sh*
user01@Libra:~/work$
user01@Libra:~/work$ cat test.sh
#!/bin/bash
if [ -f "aaa_bbb_*" ] ;then
  echo "file exists"
else echo "file does not exist"
fi
user01@Libra:~/work$
user01@Libra:~/work$ ./test.sh
file does not exist


⇒「二項演算子が予期されます」は解消されたがファイルの存在確認ができていない。

教えてほしいこと

1.二項演算子が予期されますというのはどういう意味なのでしょうか?
2.ダブルクォートで囲むと、なぜメッセージが出なくなるのでしょうか?
3.固定長(aaa_bbb_)と正規表現を組み合わせて、if [ -f ]の処理を正常に動くようにするにはどのようにすればいいのでしょうか?

以上となります。
不足情報・不明点がありましたらお手数ですがコメントをお願いいたします。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • pepperleaf

    2019/02/26 00:15

    > 1.二項演算子が予期されますというのはどういう意味なのでしょうか?
    --> -f aaa_bbb_* は展開されて、-f aaa_bbb_ccc.txt aaa_bbb_dd.txt となるので、引数の数が合わない。
    > 2.ダブルクォートで囲むと、なぜメッセージが出なくなるのでしょうか?
    --> * が展開されず、そのままなので、エラーは無いが、そんなファイルは無いので、一致無し。
    > 3.固定長(aaa_bbb_)と正規表現を組み合わせて
    さて、正規表現に詳しくない、自分にはすぐに分からない。
    検索したら、
    "if ls *.txt > /dev/null 2>&1" と言う方法も。
    <http://sweng.web.fc2.com/ja/program/bash/bash-check-file.html>
    ちょっと自信が無いので、コメントにしておきます。

    キャンセル

回答 1

checkベストアンサー

+1

1.二項演算子が予期されますというのはどういう意味なのでしょうか?

if [ -f aaa_bbb_* ]と書くと、*が展開されて、if [ -f aaa_bbb_ccc.txt aaa_bbb_dd.txt ]と書いたのと同じ事になります。こんな構文はないので、エラーになります。

-f aaa_bbb_ccc.txtが1つの項で、その後に何かが続く場合は、「かつ」の-aか、「または」の-oである必要があります。なので、その二項演算子-a -oが無いというエラーです。

2.ダブルクォートで囲むと、なぜメッセージが出なくなるのでしょうか?

この場合は*が展開されず、if [ -f "aaa_bbb_*" ]、つまり、"aaa_bbb_*"というファイルがあるかどうかと言う項になり、[ ]の中はそれだけなので、正常です。
ただし、そういう名前に*を含んだファイルは無いので、偽になります。

3.固定長(aaa_bbb_)と正規表現を組み合わせて、if [ -f ]の処理を正常に動くようにするにはどのようにすればいいのでしょうか? 

#!/bin/bash
X=(aaa_bbb_*)
if [ -f "$X" ] ;then
  echo "file exists"
else echo "file does not exist"
fi


ですかね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/26 22:26

    ありがとうございます!
    やりたいことができました。
    自分はそもそもダブルクォートとか❇︎とかの意味を正確に理解できてないことに気付きました。

    キャンセル

  • 2019/02/28 00:50

    補足:
    「~~が予期されます」「~~ is expected」は、「あるはずの~~が無いよ」という意味です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる