「BashユーザのためのFish」の版間の差分

ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == Fishは、POSIX互換ではないため、Bash等の他のシェルとは異なる動作をするものがある。<br> <br> いずれのシェルも、基本的にコマンドラインの拡張、パイプ、リダイレクト、変数、グロブを備えており、様々な方法でコマンド出力を使用する。<br> <br><br> == コマンドの置換 == Fishはコマンド置換を、<code>$(command)</code>、または、<code>(command)</code>…」)
 
95行目: 95行目:
<br>
<br>
<code>set <変数名> = <値></code>コマンドは間違ったシンタックスであり、変数に2つの値(=と<値>)を代入してしまう。<br>
<code>set <変数名> = <値></code>コマンドは間違ったシンタックスであり、変数に2つの値(=と<値>)を代入してしまう。<br>
<br><br>
== ワイルドカード ==
Fishは、構文として*グロブおよび**グロブ(および非推奨の?グロブ)のみをサポートしている。<br>
ただし、<code>for</code>文、<code>set</code>、<code>count</code>、グロブが変数オーバーライド(<code>set VAR *</code>文等)が使用されている場合は、(Bashの<code>nullglob</code>オプションのように)何もない状態に展開される。<br>
<br>
グロブは展開された変数では適用されないため、以下に示すような記述は、どのファイルにもマッチしない。<br>
<syntaxhighlight lang="fish">
set foo "*"
echo $foo
</syntaxhighlight>
<br>
引用符で囲まれていない<code>*</code>、または、<code>?</code>が含まれている場合、それをワイルドカードとして使用することができる。<br>
* *
*: ファイル名に含まれる任意の文字数(0を含む)にマッチする。(<code>/</code>は含まれない)
*: <br>
* **
*: 任意の数の文字(0を含む)に再帰的にマッチする。(サブディレクトリは降順)
*: 自身のセグメントである場合は、他のシェルとの互換性のために、そのセグメントもマッチする可能性がある。
*: <br>
* ?
*: /以外の任意の1文字にマッチする。
*: ただし、<code>?</code>の使用は非推奨であり、qmark-noglob機能フラグで無効にできるため、<code>?</code>は通常の文字として扱うことができる。
<br>
ワイルドカードのマッチは、大文字小文字を区別せずにソートされる。<br>
数字を含むマッチをソートする場合、それらは自然にソートされて、'1'、'5'、'12'という文字列は1,5,12のようにソートされる。<br>
<br>
隠しファイル(名前がドットで始まるもの)は、ワイルドカードの文字列がその場所にドットを持たない限り、ワイルドカードを使用する際に考慮されない。<br>
<br>
* a*
*: 現在のディレクトリにある'a'で始まる全てのファイルにマッチする。
*: <br>
* **
*: カレントディレクトリとそのサブディレクトリにある全てのファイルとディレクトリにマッチする。
*: <br>
* ~/.*
*: ホームディレクトリにある全ての隠しファイルとディレクトリにマッチする。
<br>
多くのコマンドでは、ワイルドカードの展開に失敗する時、コマンドは実行されずに環境変数<code>status</code>が<code>0</code>以外に設定されて、警告が表示される。<br>
この動作は、Bashが<code>shopt -s failglob</code>で行うのと同様である。<br>
<br>
例外として、<code>set</code>、<code>path</code>、<code>overrides</code>文での変数のオーバーライド、<code>count</code>文、<code>for</code>文がある。<br>
これらのグロブは、Bashの<code>shopt -s nullglob</code>のように、引数ゼロに展開される。<br>
<syntaxhighlight lang="fish">
# .txtファイルをリストアップして、存在しない場合は警告を表示する
ls *.txt
</syntaxhighlight>
<br>
<syntaxhighlight lang="fish">
# .txtファイルが存在する場合は、その一覧を表示する
set foos *.txt
if count $foos >/dev/null
    ls $foos
end
</syntaxhighlight>
<br>
Bashとは異なり、Fishは(デフォルトでは)マッチしない場合、リテラルなグロブ文字を渡さないため、<br>
<code>find</code>コマンドや<code>sudo zypper install</code>のようにマッチング自体を行うコマンドでは、引用符を追加する必要がある。<br>
<syntaxhighlight lang="fish">
sudo zypper install "ncurses-*"
find . -iname "*.txt"
</syntaxhighlight>
<br><br>
== 引用符 ==
Fishには、2つの引用符<code>""</code>と<code><nowiki>''</nowiki></code>がある。<br>
変数はダブルクォートで展開されて、引用符が無い場合はシングルクォートで展開される。<br>
<br>
また、<code>$''</code>は存在しないが、変換されるようなシーケンスはクォートされていない時に変換される。<br>
<syntaxhighlight lang="fish">
echo a\nb
# 出力
a
b
</syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:シェルスクリプト]]
[[カテゴリ:シェルスクリプト]]

案内メニュー