少し荒れてしまいましたので、内容を整理し解決済みとさせていただきます。
今回、複数のパスワードを一括でハッシュ化するシェルスクリプトを作成した際、変数に代入したパスワードの一文字目がハイフン(-)から始まるとハッシュ化コマンドがオプションと誤認識しエラーとなる事象が発生しました。
大まかな構文は以下。
#!/bin/bash
for line in `cat password.txt`
do
eval "(command -arg1 -arg2 '${line}' )"
done
※コマンドの詳細は守秘義務により控えさせていただいております。
これをechoコマンドで代替しbash -x
でデバックすろと、以下のように特殊記号が含まれる場合はシングルクォーテーションが表示され、特殊記号が含まれない場合はシングルクォーテーションが表示されない挙動となることを確認。
$ bash -x test.sh
++ cat password.txt
+ for line in `cat password.txt`
+ eval '(echo '\''h5yu|*,aid'\'' )'
++ echo 'h5yu|*,aid' ★特殊記号が含まれるためシングルクォーテーションを表示される
h5yu|*,aid
+ for line in `cat password.txt`
+ eval '(echo '\''ZrLjvRpM.4'\'' )'
++ echo ZrLjvRpM.4 ★特殊記号が含まれないためシングルクォーテーションを表示されない
そして、今回の回答者様とのやり取りでここの解釈の相違により拗れた。
回答者様は単に表示の問題と指摘されたが、私はecho 'h5yu|*,aid'
がそのままコマンドとして実行していると認識している。
ここで一点抑えておきたいのは手動で以下のようにシングルクォーテーションでパスワードをくくった場合、コマンドはシングルクォーテーションを解釈し、シングルクォーテーションで囲まれた値を文字列として認識する。
# command -arg1 -arg2 '-password'
→ハッシュ化すべき値をシングルクォーテーションを除外した「-password」と認識する。
問題となるのはこれをシェフスクリプトで展開するとシングルクォーテーションが消され、オプションとして認識される。
command -arg1 -arg2 -password
→シングルクォーテーションが外されてるため「-password」とオプションと認識する。
シングルクォーテーションで囲まれた値を文字列と解釈するコマンドは、至極当然だが先のbash -x
で示したecho
コマンドも同じく多数存在する(grepなど)。その為、コマンド自体の仕様はどうでもよく、bashがそのような挙動(シングルクォーテーションを残すか消す)をするという事実が重要と考えており、コマンド自体は秘密とさせていただきました。
取り合えずは、bashとしてはシングルクォーテーションの扱いは基本コマンド側に任せる仕様なのだと推察しています。
※繰り返しになるが表示の問題ではない。
※回答者様とはここのファクトで認識を合わせ、次の議論を進めていれば建設的な会話ができていたとは思うのですが。。。
最初の一文字目がハイフンの場合、どうすればシングルクォーテーションを消されずに認識させれるかの回答までは届きませんでしたが、実際のスクリプトでは最初の一文字目がハイフンの場合はエラー処理に流れるように修正しておりますので、ここでの質問としては一旦解決済みとさせていただきます。
bashのソースコードを読めばわかるかもしれませんが、そこまで労力を掛ける必要性もございませんので。。。