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

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == 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__
[[カテゴリ:シェルスクリプト]]
[[カテゴリ:シェルスクリプト]]

2022年10月10日 (月) 20:42時点における版

概要

Fishは、POSIX互換ではないため、Bash等の他のシェルとは異なる動作をするものがある。

いずれのシェルも、基本的にコマンドラインの拡張、パイプ、リダイレクト、変数、グロブを備えており、様々な方法でコマンド出力を使用する。


コマンドの置換

Fishはコマンド置換を、$(command)、または、(command)と記述する。


変数

Fishは、setコマンドにより変数の設定や消去を行う。
また、declareコマンド、unsetコマンド、exportコマンド等の様々な個別の組み込みを行う。

例えば、setコマンドは、オプションで変数のスコープやエクスポートの可否を決定する。

 # 変数PAGERをグローバルに定義およびエクスポートすることにより、export PAGER=lessと同様になる
 set -gx PAGER less
 
 # alocalvariable=fooのように、$alocalvariableをローカルにのみ定義する
 set -l alocalvariable foo


変数を消去する。

 set -e PAGER


<変数名>=<値>文は、環境のオーバーライドとして利用できる。

 PAGER=cat git log


Fishは、単語の分割を行わないため、変数に値が設定されると、その値はそのまま維持される。
そのため、Bashのように変数の展開をダブルクオートで記述する必要はない。

 # Bashの場合
 # ダブルクォートを使用していないため、ワードスプリッティング(2行で表示)となる
 
 foo="bar baz"
 printf '%s\n' $foo
 
 # 出力
 bar
 baz


 # Fishの場合
 # 変数fooは1つの要素として設定されているため、1つの要素として渡される (1行で表示される)
 set foo "bar baz"
 printf '%s\n' $foo
 
 # 出力
 foo baz


変数は全て配列(リスト)であるため、変数を展開するとその全ての要素が展開される。
配列の各要素は、それ自身の引数となる。(Bashでいう${var[@]}と同様)

 set var "foo bar" banana
 printf '%s\n' $var
 
 # 出力
 foo bar
 banana


リストの特定の要素を選択することができます。

 echo $list[5..7]


setコマンドを使用して、コマンドの出力に変数を設定することも可能である。

 # 変数lineにfile.txtファイル内の全ての内容を設定して、1行に1つの要素を設定する
 set lines (cat file.txt)


リテラル値とコマンドを混在させて、変数に代入することも可能である。

 set numbers 1 2 3 (seq 5 8) 9
 printf '%s\n' $numbers
 
 # 出力
 1
 2
 3
 5
 6
 7
 8
 9


set <変数名> = <値>コマンドは間違ったシンタックスであり、変数に2つの値(=と<値>)を代入してしまう。


ワイルドカード

Fishは、構文として*グロブおよび**グロブ(および非推奨の?グロブ)のみをサポートしている。
ただし、for文、setcount、グロブが変数オーバーライド(set VAR *文等)が使用されている場合は、(Bashのnullglobオプションのように)何もない状態に展開される。

グロブは展開された変数では適用されないため、以下に示すような記述は、どのファイルにもマッチしない。

 set foo "*"
 echo $foo


引用符で囲まれていない*、または、?が含まれている場合、それをワイルドカードとして使用することができる。

  • *
    ファイル名に含まれる任意の文字数(0を含む)にマッチする。(/は含まれない)

  • **
    任意の数の文字(0を含む)に再帰的にマッチする。(サブディレクトリは降順)
    自身のセグメントである場合は、他のシェルとの互換性のために、そのセグメントもマッチする可能性がある。

  • ?
    /以外の任意の1文字にマッチする。
    ただし、?の使用は非推奨であり、qmark-noglob機能フラグで無効にできるため、?は通常の文字として扱うことができる。


ワイルドカードのマッチは、大文字小文字を区別せずにソートされる。
数字を含むマッチをソートする場合、それらは自然にソートされて、'1'、'5'、'12'という文字列は1,5,12のようにソートされる。

隠しファイル(名前がドットで始まるもの)は、ワイルドカードの文字列がその場所にドットを持たない限り、ワイルドカードを使用する際に考慮されない。

  • a*
    現在のディレクトリにある'a'で始まる全てのファイルにマッチする。

  • **
    カレントディレクトリとそのサブディレクトリにある全てのファイルとディレクトリにマッチする。

  • ~/.*
    ホームディレクトリにある全ての隠しファイルとディレクトリにマッチする。


多くのコマンドでは、ワイルドカードの展開に失敗する時、コマンドは実行されずに環境変数status0以外に設定されて、警告が表示される。
この動作は、Bashがshopt -s failglobで行うのと同様である。

例外として、setpathoverrides文での変数のオーバーライド、count文、for文がある。
これらのグロブは、Bashのshopt -s nullglobのように、引数ゼロに展開される。

 # .txtファイルをリストアップして、存在しない場合は警告を表示する
 ls *.txt


 # .txtファイルが存在する場合は、その一覧を表示する
 set foos *.txt
 if count $foos >/dev/null
    ls $foos
 end


Bashとは異なり、Fishは(デフォルトでは)マッチしない場合、リテラルなグロブ文字を渡さないため、
findコマンドやsudo zypper installのようにマッチング自体を行うコマンドでは、引用符を追加する必要がある。

 sudo zypper install "ncurses-*"
 find . -iname "*.txt"



引用符

Fishには、2つの引用符""''がある。
変数はダブルクォートで展開されて、引用符が無い場合はシングルクォートで展開される。

また、$は存在しないが、変換されるようなシーケンスはクォートされていない時に変換される。

 echo a\nb
 
 # 出力
 a
 b