bashにおける角括弧”[]“の扱いで困ったこと

公開日: : プログラミング

あるShellScriptでパスワードを乱数生成するときに

 

$ cat /dev/urandom | tr -c -d [a-zA-Z0-9] | head -c 8

 

みたいに書いていたのですが、ある条件下で

正規表現のように書かれている[a-zA-Z0-9]の部分で詰まったのでメモ書きです。

(というか、trコマンドの引数で受け付ける文字セットは正規表現に似てるだけの別物らしいって記事も見かけたものの、ちゃんとした情報見つけられなかったのでその話は割愛)

(=そもそもコマンドへの引数として[a-z]のような渡し方が正しいのか、という問題。)

 

※この記事の検証環境は

CentOS release 6.3

GNU bash, version 4.1.2(1)-release

です。

(後からMacで試しても同じこと起こりました)

 

 

ある条件下とは

「1文字で、拡張子なしの英数字ファイルが複数存在する場合」に上記コマンドを実行すると

エラーとなりました。

 

例)ls -l

-rw-rw-r–. 1 millay millay 0 12月 21 17:11 2014 1
-rw-rw-r–. 1 millay millay 0 12月 21 17:11 2014 a
-rw-rw-r–. 1 millay millay 0 12月 21 17:11 2014 b

 

たとえばこんな状況で実行すると、

 

$ cat /dev/urandom | tr -c -d [a-zA-Z0-9] | head -c 8
tr: extra operand `a’
詳しくは `tr –help’ を実行して下さい.

 

こんな感じでエラーが出る。

 

検証

いろいろ検証してみたら、あることがわかりました。

set -xでデバッグログ出すようにしてから再度実行すると

 

$ cat /dev/urandom | tr -c -d [A-Za-z0-9] | head -c 10
+ head -c 10
+ cat /dev/urandom
+ tr -c -d 1 a b
tr: extra operand `a’
詳しくは `tr –help’ を実行して下さい.

 

と、trコマンドに対する引数が変わっていることがわかります。

あれ?と思って試しにechoとかで試してみたら

 

$ echo [a-z]

a b

$ echo [A-Z]

[A-Z]

 

と表示されてなお混乱。

 

結論

結論としてわかったことは、

echo [a-z]みたいに、コマンドの引数に角括弧使う正規表現?を書いた時、

bashが先に[a-z]を解釈してカレントディレクトリ内に当てはまるファイルあれば

その名前に展開しちゃうみたいです。

なおかつ、[]内の式に該当するファイルがない場合は

そのまま”[a-z]“全体を文字列としてそのまま引数に渡す模様。

touchコマンドとかでゴミファイルを英数字1文字で作るときは気をつけて下さい。

 

あんまり調べても出てこなかった仕様なので、

どういう仕組みなのかはいまいちですが・・・。

 

 

ちなみにこれ酷いのが、grepとかの正規表現許容してるコマンドでも

 

touch 1

touch 2

ls | grep -e [0-9]

 

みたいなことすると、

 

ls | grep -e “1 2″

 

って解釈されちゃうんですよね…

とりあえず変なゴミファイルは作らないように気をつけて下さい。

後詳しい仕組み知ってる人がいたら是非コメントいただけると勉強になります。

関連記事

no image

シェルスクリプトでtsvファイルとcsvファイルを処理する方法

シェルスクリプトでtsvファイルを要素ごとに配列に格納し、処理する方法です。 普通はcsvファ

記事を読む

no image

chromeで「このウェブページにアクセスできません」が出たときの対処法

自宅以外の環境でchrome使おうとして、検索した瞬間に「このウェブページにアクセスできません」と出

記事を読む

no image

学生時代に1ミリも知らなかったJavaの開発風景

※この記事は、苫小牧高専 Advent Calendar 2016 - Adventar 9日目の記

記事を読む

no image

Java8のtimeパッケージのLocalTimeとLocalDateを触ってみた

ほんのりと仕事に出てきそうな匂いがあったので、 予習もかねてjava8のtimeパッケージを触

記事を読む

スクリーンショット 2014-08-05 0.53.46

初心者のiOSアプリ(収支表)作成記。その1

iOSアプリ作成経験0の私が、収支表アプリを作ってみます。 ブログ書きながら勉強してるのでほと

記事を読む

no image

CSSで表の罫線出そうとしたら点線と実線が混ざってどん詰まりした話

デザイナーさんからもらったCSSをHTMLの表に適用したら、 IEで見た時だけなぜか枠線の一番

記事を読む

no image

javaでzip作る時の圧縮レベルの話

いわゆる無圧縮zipファイルをjavaで作ることがあったので、覚え書きです。 ついでに圧縮レベ

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

no image
学生時代に1ミリも知らなかったJavaの開発風景

※この記事は、苫小牧高専 Advent Calendar 2016 -

no image
gitbucketで再起動に失敗してDBエラーが起きた話

とあるAdvent calendarを書くことになったのですが、そもそ

no image
機械学習について簡単におさらいした

機械学習について、実際あんまりよくわかってなくね?ってなったので

no image
svnを使っている作業場でgitを普及させるためにやったこと

今回は、ある作業場でgitを普及させたい!という思いから、私が個人的に

no image
jenkinsのジョブでIllegalArgumentExceptionが起きた

Jenkinsのジョブで、 java.lang.IllegalArgu

→もっと見る

PAGE TOP ↑