回答編集履歴

5

間違いを修正

2019/09/15 15:26

投稿

quickquip
quickquip

スコア11040

test CHANGED
@@ -1,6 +1,6 @@
1
1
  0. `$`はbashでは環境変数の展開に使われる
2
2
 
3
- 0. `$環境変数名`で展開できかった場合は`$環境変数名`のままになる(正しいか自信はないけどそうなっているっぽい)
3
+ 0. `$`の後の文字が空白文字だったり行末だったりで展開することがければ`$`のままになる
4
4
 
5
5
  0. bashで`$`の変数展開をやめさせければ`\`でクォートする
6
6
 

4

\のエスケープ部分の例を追加

2019/09/15 15:26

投稿

quickquip
quickquip

スコア11040

test CHANGED
@@ -138,6 +138,22 @@
138
138
 
139
139
  ```plain
140
140
 
141
+ echo $C
142
+
143
+ ```
144
+
145
+ の結果が
146
+
147
+ $C
148
+
149
+ で($の変数展開する機能が\で抑止されている)
150
+
151
+
152
+
153
+
154
+
155
+ ```plain
156
+
141
157
  echo \$C
142
158
 
143
159
  ```
@@ -146,8 +162,24 @@
146
162
 
147
163
  \love
148
164
 
165
+ で(\の「$の変数展開を抑止する機能」がもう1つの\で抑止されている。$は変数展開の機能を持つ)
166
+
167
+
168
+
169
+ ```plain
170
+
171
+ echo \$C
172
+
173
+ ```
174
+
175
+ の結果が
176
+
177
+ $C
178
+
149
179
  なことを確認してください。
150
180
 
181
+ (\の「$の変数展開を抑止する機能」がもう1つの\で抑止されている。$の変数展開する機能が\で抑止されている)
182
+
151
183
 
152
184
 
153
185
  ---

3

修正

2019/09/15 14:29

投稿

quickquip
quickquip

スコア11040

test CHANGED
@@ -136,6 +136,24 @@
136
136
 
137
137
 
138
138
 
139
+ ```plain
140
+
141
+ echo \$C
142
+
143
+ ```
144
+
145
+ の結果が
146
+
147
+ \love
148
+
149
+ なことを確認してください。
150
+
151
+
152
+
153
+ ---
154
+
155
+
156
+
139
157
  以上から質問でやりたいことをキッチリ書くなら
140
158
 
141
159
  ```plain

2

些細

2019/09/15 14:25

投稿

quickquip
quickquip

スコア11040

test CHANGED
@@ -4,11 +4,11 @@
4
4
 
5
5
  0. bashで`$`の変数展開をやめさせければ`\`でクォートする
6
6
 
7
- 0. bashで`\`によるクォートやめさせたければ`\`とする
7
+ 0. bashで`\`によるクォートやめさせたければ`\`とする
8
8
 
9
9
  0. 正規表現で`$`は**行末に長さ0で**マッチする
10
10
 
11
- 0. '$'という文字にマッチさせる正規表現`$`
11
+ 0. '$'という文字にマッチさせる正規表現`$`
12
12
 
13
13
 
14
14
 

1

途中でしたすみません。

2019/09/15 14:24

投稿

quickquip
quickquip

スコア11040

test CHANGED
@@ -2,8 +2,156 @@
2
2
 
3
3
  0. `$環境変数名`で展開できなかった場合は`$環境変数名`そのままになる(正しいか自信はないけどそうなっているっぽい)
4
4
 
5
+ 0. bashで`$`の変数展開をやめさせければ`\`でクォートする
6
+
7
+ 0. bashで`\`によるクォートやめさせたければ`\`とする
8
+
5
9
  0. 正規表現で`$`は**行末に長さ0で**マッチする
6
10
 
7
- ```bash-3.2$ export GREP_OPTIONS='--color=always'
11
+ 0. '$'という文字にマッチさせる正規表現で`$`
8
12
 
13
+
14
+
15
+ ----
16
+
17
+
18
+
19
+ ```plain
20
+
21
+ export GREP_OPTIONS='--color=always'
22
+
23
+ C=love
24
+
25
+ ```
26
+
27
+ 環境変数Cをセットしておきましょう。
28
+
29
+
30
+
31
+ ```plain
32
+
33
+ echo I love C$C | grep $C
34
+
35
+ ```
36
+
37
+ の結果は
38
+
9
- bash-3.2$ C=love
39
+ I **love** C**love**
40
+
41
+ です。(強調表示部分がカラー表示です。以下同様)
42
+
43
+
44
+
45
+ $Cが文字列ioveに展開されているのが分かりますね。`echo I love Clove | grep love`を実行したのと同じことなのです。
46
+
47
+
48
+
49
+ 質問で
50
+
51
+ ```plain
52
+
53
+ echo I love $
54
+
55
+ ```
56
+
57
+ すると`I love $`が出るのは"$の後続がアルファベットじゃないから環境変数として正しくない"ため$自身がでています。
58
+
59
+
60
+
61
+ ----
62
+
63
+ 環境変数の展開を明示的に止めたい時はどうするかというと、`\`でエスケープします。
64
+
65
+
66
+
67
+ ```plain
68
+
69
+ echo I love C$S | grep $
70
+
71
+ ```
72
+
73
+ とすると結果は
74
+
75
+ I love C$S
76
+
77
+ です。強調表示がありません。
78
+
79
+ **にも関わらずI love C$Sが表示されている**ことに気をつけてください。(`echo hoge | grep huga`では結果が出ないことを確認してください)
80
+
81
+ ということはこの行はマッチしているのです。
82
+
83
+ `$` が行末にマッチする正規表現なので、**行末に長さ0で**マッチしているのです。
84
+
85
+ だからマッチしていてかつ強調表示がないという結果になるのです。
86
+
87
+
88
+
89
+ ----
90
+
91
+
92
+
93
+ ```plain
94
+
95
+ echo I love C$C | grep e$
96
+
97
+ ```
98
+
99
+ すると結果は
100
+
101
+ I love Clov**e**
102
+
103
+ です。
104
+
105
+ `e$` が "eの直後に行末" という意味になるので行末のeにしかマッチしていないことを確認してください。
106
+
107
+
108
+
109
+ ```plain
110
+
111
+ echo I love C$C | grep e
112
+
113
+ ```
114
+
115
+ の結果が
116
+
117
+ I lov**e** Clov**e**
118
+
119
+ なのと見比べてください。
120
+
121
+
122
+
123
+ ----
124
+
125
+
126
+
127
+ 正規表現で`$`という文字自身を検索したい時は`$`という正規表現を渡さなければなりません。
128
+
129
+
130
+
131
+ bashで`$`と書くと`\`記号の作用で変数展開をやめて`$`という文字自身になります。
132
+
133
+ `\`は渡りません。
134
+
135
+ `\`を渡したければ`\`と書きます。
136
+
137
+
138
+
139
+ 以上から質問でやりたいことをキッチリ書くなら
140
+
141
+ ```plain
142
+
143
+ echo I love $ | grep \$
144
+
145
+ ```
146
+
147
+ とします。
148
+
149
+ こうするとechoは`I love $`という文字列を出力して、grepは第1引数に`$`を取ります。
150
+
151
+
152
+
153
+ これで文字列中の`$`にマッチして
154
+
155
+ I love **$**
156
+
157
+ という結果を得ます。