teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

日時修正

2018/04/04 04:49

投稿

dodox86
dodox86

スコア9385

answer CHANGED
@@ -27,7 +27,7 @@
27
27
  と認識して動作しても正しい仕様ですので文句は言えません。なので、CR+LF ではダメだと言えることにつながります。
28
28
 
29
29
  ----
30
- **更に追記:**2018/04/04 11:30
30
+ **更に追記:**2018/04/04 13:41
31
31
 
32
32
  > 「なんだこのキャラクターは?! こんなものは処理の対象外だ!エラーだ!エラー!!」
33
33
 

2

コメントを再度確認、追記

2018/04/04 04:49

投稿

dodox86
dodox86

スコア9385

answer CHANGED
@@ -24,4 +24,52 @@
24
24
 
25
25
  「なんだこのキャラクターは?! こんなものは処理の対象外だ!エラーだ!エラー!!」
26
26
 
27
- と認識して動作しても正しい仕様ですので文句は言えません。なので、CR+LF ではダメだと言えることにつながります。
27
+ と認識して動作しても正しい仕様ですので文句は言えません。なので、CR+LF ではダメだと言えることにつながります。
28
+
29
+ ----
30
+ **更に追記:**2018/04/04 11:30
31
+
32
+ > 「なんだこのキャラクターは?! こんなものは処理の対象外だ!エラーだ!エラー!!」
33
+
34
+ コメントでご指摘を受けたように、確かに語弊がありました。`"\r"`(CR)自体がエラーになるのではなくて、
35
+ bash で語句分割を行った後、`"\r"`を結局どう扱うかに依存しているようでした。
36
+
37
+ Cygwinでのbashスクリプトの実行結果です。do01_LF.sh は`"\n"`(LF)のみ終わるbashシェルスクリプトです。対して、do01_CRLF.sh は`"\r\n"`(CRLF)で終わる同じ内容のスクリプトです。
38
+
39
+ otnさんの別回答にありますが、WindowsのCygwin版のせいか、bashのバージョンによるのか、コードの各行が`"\r\n"`で終わっていてもそれ自体には問題なく動作しています。
40
+ ```
41
+ $uname -a
42
+ CYGWIN_NT-6.1-WOW turtle0 2.10.0(0.325/5/3) 2018-02-02 15:21 i686 Cygwin
43
+
44
+ $ cat do01_LF.sh
45
+
46
+ #!/bin/bash
47
+
48
+ V1=1
49
+ if [ $V1 -eq 1 ]; then
50
+ echo "TRUE"
51
+ else
52
+ echo "FALSE"
53
+ fi
54
+
55
+ $
56
+
57
+ $bash --version
58
+ GNU bash, バージョン 4.4.12(3)-release (i686-pc-cygwin)
59
+ Copyright (C) 2016 Free Software Foundation, Inc.
60
+ ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>
61
+
62
+ This is free software; you are free to change and redistribute it.
63
+ There is NO WARRANTY, to the extent permitted by law.
64
+
65
+ $./do01_LF.sh
66
+ TRUE
67
+ ```
68
+ 問題無く動きます。これを改行コード`"\r\n"`(CRLF)のdo01_CRLF.shで実行すると
69
+ ```
70
+ $./do01_CRLF.sh
71
+ ./do01_CRLF.sh: 行 2: $'\r': コマンドが見つかりません
72
+ ./do01_CRLF.sh: 行 10: 構文エラー: 予期しないファイル終了 (EOF) です
73
+ $
74
+ ```
75
+ となります。shebang行の下の2行目は空行ですが、「`./do01_CRLF.sh: 行 2: $'\r': コマンドが見つかりません`」と報告されます。bash自身のエラーと言うわけではありません。`"\r"`をコマンドと認識しているように見えます。

1

補足を追記

2018/04/04 04:41

投稿

dodox86
dodox86

スコア9385

answer CHANGED
@@ -14,4 +14,14 @@
14
14
  直訳すると、「0、または1文字以上の<newline>以外の文字と、終端の文字<newline>をもって、「行(line)」とする。」
15
15
  とあります。
16
16
 
17
- 尚、**CR+LF形式でコーディングすると、シェルによってはシェルスクリプトが動作しません。**
17
+ 尚、**CR+LF形式でコーディングすると、シェルによってはシェルスクリプトが動作しません。**
18
+
19
+ ----
20
+ **追記しました:**2018/04/04 11:30
21
+ 自分の回答を読み直してみて、少し直接的でない部分もあったと思いましたので補足します。
22
+
23
+ LF(0x0A/newline)のみを行の終端として扱うのがPOSIX準拠のUNIXのプログラムであるならば、bashのようなシェルにとってはCR(0x0D)が行の終端のLFの前にあると、
24
+
25
+ 「なんだこのキャラクターは?! こんなものは処理の対象外だ!エラーだ!エラー!!」
26
+
27
+ と認識して動作しても正しい仕様ですので文句は言えません。なので、CR+LF ではダメだと言えることにつながります。