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

回答編集履歴

5

間違いを修正

2019/09/15 15:26

投稿

quickquip
quickquip

スコア11314

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

4

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

2019/09/15 15:26

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -68,11 +68,27 @@
68
68
  `\`を渡したければ`\`と書きます。
69
69
 
70
70
  ```plain
71
+ echo $C
72
+ ```
73
+ の結果が
74
+ $C
75
+ で($の変数展開する機能が\で抑止されている)
76
+
77
+
78
+ ```plain
71
79
  echo \$C
72
80
  ```
73
81
  の結果が
74
82
  \love
83
+ で(\の「$の変数展開を抑止する機能」がもう1つの\で抑止されている。$は変数展開の機能を持つ)
84
+
85
+ ```plain
86
+ echo \$C
87
+ ```
88
+ の結果が
89
+ $C
75
90
  なことを確認してください。
91
+ (\の「$の変数展開を抑止する機能」がもう1つの\で抑止されている。$の変数展開する機能が\で抑止されている)
76
92
 
77
93
  ---
78
94
 

3

修正

2019/09/15 14:29

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -67,6 +67,15 @@
67
67
  `\`は渡りません。
68
68
  `\`を渡したければ`\`と書きます。
69
69
 
70
+ ```plain
71
+ echo \$C
72
+ ```
73
+ の結果が
74
+ \love
75
+ なことを確認してください。
76
+
77
+ ---
78
+
70
79
  以上から質問でやりたいことをキッチリ書くなら
71
80
  ```plain
72
81
  echo I love $ | grep \$

2

些細

2019/09/15 14:25

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -1,9 +1,9 @@
1
1
  0. `$`はbashでは環境変数の展開に使われる
2
2
  0. `$環境変数名`で展開できなかった場合は`$環境変数名`そのままになる(正しいか自信はないけどそうなっているっぽい)
3
3
  0. bashで`$`の変数展開をやめさせければ`\`でクォートする
4
- 0. bashで`\`によるクォートやめさせたければ`\`とする
4
+ 0. bashで`\`によるクォートやめさせたければ`\`とする
5
5
  0. 正規表現で`$`は**行末に長さ0で**マッチする
6
- 0. '$'という文字にマッチさせる正規表現`$`
6
+ 0. '$'という文字にマッチさせる正規表現`$`
7
7
 
8
8
  ----
9
9
 

1

途中でしたすみません。

2019/09/15 14:24

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -1,5 +1,79 @@
1
1
  0. `$`はbashでは環境変数の展開に使われる
2
2
  0. `$環境変数名`で展開できなかった場合は`$環境変数名`そのままになる(正しいか自信はないけどそうなっているっぽい)
3
+ 0. bashで`$`の変数展開をやめさせければ`\`でクォートする
4
+ 0. bashで`\`によるクォートやめさせたければ`\`とする
3
5
  0. 正規表現で`$`は**行末に長さ0で**マッチする
6
+ 0. '$'という文字にマッチさせる正規表現で`$`
7
+
8
+ ----
9
+
10
+ ```plain
4
- ```bash-3.2$ export GREP_OPTIONS='--color=always'
11
+ export GREP_OPTIONS='--color=always'
12
+ C=love
13
+ ```
14
+ 環境変数Cをセットしておきましょう。
15
+
16
+ ```plain
17
+ echo I love C$C | grep $C
18
+ ```
19
+ の結果は
5
- bash-3.2$ C=love
20
+ I **love** C**love**
21
+ です。(強調表示部分がカラー表示です。以下同様)
22
+
23
+ $Cが文字列ioveに展開されているのが分かりますね。`echo I love Clove | grep love`を実行したのと同じことなのです。
24
+
25
+ 質問で
26
+ ```plain
27
+ echo I love $
28
+ ```
29
+ すると`I love $`が出るのは"$の後続がアルファベットじゃないから環境変数として正しくない"ため$自身がでています。
30
+
31
+ ----
32
+ 環境変数の展開を明示的に止めたい時はどうするかというと、`\`でエスケープします。
33
+
34
+ ```plain
35
+ echo I love C$S | grep $
36
+ ```
37
+ とすると結果は
38
+ I love C$S
39
+ です。強調表示がありません。
40
+ **にも関わらずI love C$Sが表示されている**ことに気をつけてください。(`echo hoge | grep huga`では結果が出ないことを確認してください)
41
+ ということはこの行はマッチしているのです。
42
+ `$` が行末にマッチする正規表現なので、**行末に長さ0で**マッチしているのです。
43
+ だからマッチしていてかつ強調表示がないという結果になるのです。
44
+
45
+ ----
46
+
47
+ ```plain
48
+ echo I love C$C | grep e$
49
+ ```
50
+ すると結果は
51
+ I love Clov**e**
52
+ です。
53
+ `e$` が "eの直後に行末" という意味になるので行末のeにしかマッチしていないことを確認してください。
54
+
55
+ ```plain
56
+ echo I love C$C | grep e
57
+ ```
58
+ の結果が
59
+ I lov**e** Clov**e**
60
+ なのと見比べてください。
61
+
62
+ ----
63
+
64
+ 正規表現で`$`という文字自身を検索したい時は`$`という正規表現を渡さなければなりません。
65
+
66
+ bashで`$`と書くと`\`記号の作用で変数展開をやめて`$`という文字自身になります。
67
+ `\`は渡りません。
68
+ `\`を渡したければ`\`と書きます。
69
+
70
+ 以上から質問でやりたいことをキッチリ書くなら
71
+ ```plain
72
+ echo I love $ | grep \$
73
+ ```
74
+ とします。
75
+ こうするとechoは`I love $`という文字列を出力して、grepは第1引数に`$`を取ります。
76
+
77
+ これで文字列中の`$`にマッチして
78
+ I love **$**
79
+ という結果を得ます。