回答編集履歴

3

日時修正

2018/04/04 04:49

投稿

dodox86
dodox86

スコア9183

test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
  ----
58
58
 
59
- **更に追記:**2018/04/04 11:30
59
+ **更に追記:**2018/04/04 13:41
60
60
 
61
61
 
62
62
 

2

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

2018/04/04 04:49

投稿

dodox86
dodox86

スコア9183

test CHANGED
@@ -51,3 +51,99 @@
51
51
 
52
52
 
53
53
  と認識して動作しても正しい仕様ですので文句は言えません。なので、CR+LF ではダメだと言えることにつながります。
54
+
55
+
56
+
57
+ ----
58
+
59
+ **更に追記:**2018/04/04 11:30
60
+
61
+
62
+
63
+ > 「なんだこのキャラクターは?! こんなものは処理の対象外だ!エラーだ!エラー!!」
64
+
65
+
66
+
67
+ コメントでご指摘を受けたように、確かに語弊がありました。`"\r"`(CR)自体がエラーになるのではなくて、
68
+
69
+ bash で語句分割を行った後、`"\r"`を結局どう扱うかに依存しているようでした。
70
+
71
+
72
+
73
+ Cygwinでのbashスクリプトの実行結果です。do01_LF.sh は`"\n"`(LF)のみ終わるbashシェルスクリプトです。対して、do01_CRLF.sh は`"\r\n"`(CRLF)で終わる同じ内容のスクリプトです。
74
+
75
+
76
+
77
+ otnさんの別回答にありますが、WindowsのCygwin版のせいか、bashのバージョンによるのか、コードの各行が`"\r\n"`で終わっていてもそれ自体には問題なく動作しています。
78
+
79
+ ```
80
+
81
+ $uname -a
82
+
83
+ CYGWIN_NT-6.1-WOW turtle0 2.10.0(0.325/5/3) 2018-02-02 15:21 i686 Cygwin
84
+
85
+
86
+
87
+ $ cat do01_LF.sh
88
+
89
+
90
+
91
+ #!/bin/bash
92
+
93
+
94
+
95
+ V1=1
96
+
97
+ if [ $V1 -eq 1 ]; then
98
+
99
+ echo "TRUE"
100
+
101
+ else
102
+
103
+ echo "FALSE"
104
+
105
+ fi
106
+
107
+
108
+
109
+ $
110
+
111
+
112
+
113
+ $bash --version
114
+
115
+ GNU bash, バージョン 4.4.12(3)-release (i686-pc-cygwin)
116
+
117
+ Copyright (C) 2016 Free Software Foundation, Inc.
118
+
119
+ ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>
120
+
121
+
122
+
123
+ This is free software; you are free to change and redistribute it.
124
+
125
+ There is NO WARRANTY, to the extent permitted by law.
126
+
127
+
128
+
129
+ $./do01_LF.sh
130
+
131
+ TRUE
132
+
133
+ ```
134
+
135
+ 問題無く動きます。これを改行コード`"\r\n"`(CRLF)のdo01_CRLF.shで実行すると
136
+
137
+ ```
138
+
139
+ $./do01_CRLF.sh
140
+
141
+ ./do01_CRLF.sh: 行 2: $'\r': コマンドが見つかりません
142
+
143
+ ./do01_CRLF.sh: 行 10: 構文エラー: 予期しないファイル終了 (EOF) です
144
+
145
+ $
146
+
147
+ ```
148
+
149
+ となります。shebang行の下の2行目は空行ですが、「`./do01_CRLF.sh: 行 2: $'\r': コマンドが見つかりません`」と報告されます。bash自身のエラーと言うわけではありません。`"\r"`をコマンドと認識しているように見えます。

1

補足を追記

2018/04/04 04:41

投稿

dodox86
dodox86

スコア9183

test CHANGED
@@ -31,3 +31,23 @@
31
31
 
32
32
 
33
33
  尚、**CR+LF形式でコーディングすると、シェルによってはシェルスクリプトが動作しません。**
34
+
35
+
36
+
37
+ ----
38
+
39
+ **追記しました:**2018/04/04 11:30
40
+
41
+ 自分の回答を読み直してみて、少し直接的でない部分もあったと思いましたので補足します。
42
+
43
+
44
+
45
+ LF(0x0A/newline)のみを行の終端として扱うのがPOSIX準拠のUNIXのプログラムであるならば、bashのようなシェルにとってはCR(0x0D)が行の終端のLFの前にあると、
46
+
47
+
48
+
49
+ 「なんだこのキャラクターは?! こんなものは処理の対象外だ!エラーだ!エラー!!」
50
+
51
+
52
+
53
+ と認識して動作しても正しい仕様ですので文句は言えません。なので、CR+LF ではダメだと言えることにつながります。