シェルスクリプトでは改行コードをLFにしないといけないと聞いたのですが
それはなぜですか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答6件
0
根幹の答えとしては「UNIXの標準規格と言えるPOSIXで、そう決められているから」です。
stack overflowで同様の質問がされていたのでご案内します。
[Why should text files end with a newline?]((https://stackoverflow.com/questions/729692/why-should-text-files-end-with-a-newlinej)
この中の回答を引用させていただきますが、
Because that’s how the POSIX standard defines a line:
3.206 Line
A sequence of zero or more non- <newline> characters plus a terminating <newline> character.
とあります。ソースはIEEE Std 1003.1-2017のこちらです。 3.206 Line
直訳すると、「0、または1文字以上の<newline>以外の文字と、終端の文字<newline>をもって、「行(line)」とする。」
とあります。
尚、CR+LF形式でコーディングすると、シェルによってはシェルスクリプトが動作しません。
**追記しました:**2018/04/04 11:30
自分の回答を読み直してみて、少し直接的でない部分もあったと思いましたので補足します。
LF(0x0A/newline)のみを行の終端として扱うのがPOSIX準拠のUNIXのプログラムであるならば、bashのようなシェルにとってはCR(0x0D)が行の終端のLFの前にあると、
「なんだこのキャラクターは?! こんなものは処理の対象外だ!エラーだ!エラー!!」
と認識して動作しても正しい仕様ですので文句は言えません。なので、CR+LF ではダメだと言えることにつながります。
**更に追記:**2018/04/04 13:41
「なんだこのキャラクターは?! こんなものは処理の対象外だ!エラーだ!エラー!!」
コメントでご指摘を受けたように、確かに語弊がありました。"\r"
(CR)自体がエラーになるのではなくて、
bash で語句分割を行った後、"\r"
を結局どう扱うかに依存しているようでした。
Cygwinでのbashスクリプトの実行結果です。do01_LF.sh は"\n"
(LF)のみ終わるbashシェルスクリプトです。対して、do01_CRLF.sh は"\r\n"
(CRLF)で終わる同じ内容のスクリプトです。
otnさんの別回答にありますが、WindowsのCygwin版のせいか、bashのバージョンによるのか、コードの各行が"\r\n"
で終わっていてもそれ自体には問題なく動作しています。
$uname -a CYGWIN_NT-6.1-WOW turtle0 2.10.0(0.325/5/3) 2018-02-02 15:21 i686 Cygwin $ cat do01_LF.sh #!/bin/bash V1=1 if [ $V1 -eq 1 ]; then echo "TRUE" else echo "FALSE" fi $ $bash --version GNU bash, バージョン 4.4.12(3)-release (i686-pc-cygwin) Copyright (C) 2016 Free Software Foundation, Inc. ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. $./do01_LF.sh TRUE
問題無く動きます。これを改行コード"\r\n"
(CRLF)のdo01_CRLF.shで実行すると
$./do01_CRLF.sh ./do01_CRLF.sh: 行 2: $'\r': コマンドが見つかりません ./do01_CRLF.sh: 行 10: 構文エラー: 予期しないファイル終了 (EOF) です $
となります。shebang行の下の2行目は空行ですが、「./do01_CRLF.sh: 行 2: $'\r': コマンドが見つかりません
」と報告されます。bash自身のエラーと言うわけではありません。"\r"
をコマンドと認識しているように見えます。
投稿2018/04/04 02:10
編集2018/04/04 04:49総合スコア9369
0
Windows用にコンパイルされたbashだとCRを無視するようです(MinGWで確認)。
例えば、date
という文字列の途中にCRがあっても、ちゃんとdate
コマンドが実行されます。
それ以外の環境では、CRは単なる文字なので、改行がCRLFだと、例えば全部の行末にA
と書いてあるような物です。
つまり、
Bash
1#!/bin/bashA 2dateA 3echo 1 2 3A
と同じことなので、普通はそういう名前のファイルが見つからずエラーになります。
別の言い方をすると、(CRを<CR>で表すと)
Bash
1#!/bin/bash<CR> 2date<CR> 3echo 1 2 3<CR>
をエラー無く実行したい場合、あらかじめこうしてCRつきのファイルを作っておけばいいです。
「CRは単なる文字」というのはそういう意味です。
Bash
1sudo cp /bin/bash $'/bin/bash\r' 2sudo cp /bin/date $'/bin/date\r'
(あるいは、shbang行以外は、行末に#
を書いておけばCRがコメントになるのでそれでもOK)
投稿2018/04/04 04:15
編集2018/04/04 05:03総合スコア86307
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/04 05:28

0
改行コードは、OS依存です。
Unix系(UNIX、各種Linux)では、LF(\n)
Windows系では、CRLF(\r\n)
Mac OS(9以前)では、CR(\r)
投稿2018/04/04 02:48
総合スコア6919
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/04 03:39
2018/04/04 04:42