質問: ### 前提・実現したいこと カレントディレクトリに対して、処理対象のファイルの存在確認をしたいです。 ※処理対象はファイル名の先頭は必ず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 2月 25 23:12 ./ drwxr-xr-x 1 user01 user01 4096 2月 25 23:12 ../ -rw-rw-r-- 1 user01 user01 0 2月 25 22:06 aaa_bbb_ccc.txt -rw-rw-r-- 1 user01 user01 0 2月 25 22:06 aaa_bbb_dd.txt -rwxrwxrwx 1 user01 user01 182 2月 25 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 2月 25 23:12 ./ drwxr-xr-x 1 user01 user01 4096 2月 25 23:12 ../ -rw-rw-r-- 1 user01 user01 0 2月 25 22:06 aaa_bbb_ccc.txt -rw-rw-r-- 1 user01 user01 0 2月 25 22:06 aaa_bbb_dd.txt -rwxrwxrwx 1 user01 user01 182 2月 25 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 ]の処理を正常に動くようにするにはどのようにすればいいのでしょうか? 以上となります。 不足情報・不明点がありましたらお手数ですがコメントをお願いいたします。 よろしくお願いいたします。
回答: > > 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 ``` ですかね。