Bashのエコセミコロン

Bashのエコセミコロン

次の文字列をファイルに書き込もうとします1;2;3;4。セミコロンは問題を引き起こす可能性があります。

私はこれを行うために次の方法を見つけることができました。

variable='1;2;3;4'
echo "${variable//;/\;}" >output.file

しかし、何らかの理由でcrontabを実行すると、出力ファイルは生成されず、手動で実行した場合にのみ機能します。

私のコードに代わるものはありますか?

ベストアンサー1

これには2つの問題があります。最初;に変更するには、\;エスケープする必要があります\。これは\特殊文字であり、エスケープに使用されることを覚えておいてください(これがおそらく以前に追加した理由です;)。文字通り使用するには、置き換えでもエスケープする必要があります。

$ variable='1;2;3;4'
$ echo "${variable//;/\;}"  ## fails
1;2;3;4
$ echo "${variable//;/\\;}" ## works
1\;2\;3\;4

次の問題は、Cuonglmが指摘したように、cronがすべてを実行していることです/bin/sh。システムによっては、sh互換モードで実行されているbash、または他の最小シェル(dashDebianベースのシステムの場合)、さらには古代のBourneシェル自体でもあります。したがって、この${var//foo/bar}構成は機能しない可能性が高いです。たとえば、次のようになりますdash

$ variable='1;2;3;4'
$ echo "${variable//;/\\;}"
dash: 2: Bad substitution

ただし、変数に含まれる文字列をファイルとして印刷したい場合は常に機能します。

variable='1;2;3;4'
printf '%s\n' "$variable" > file

おすすめ記事