【fish】一行野郎

次世代シェルである fish shell (friendly shell , finally shell ) を使ったサンプル集です。

リダイレクトの使用例

 

エラー出力する

ls -l /tm  1>&2

 

エラー出力を破棄する

ls -l /tm /tmp 2>/dev/null

 

標準出力を破棄する

ls -l /tmp 1>/dev/null

 

標準出力とエラー出力の両方を破棄する

『2>/dev/null』としているところを『2 > /dev/null』といったようにスペースを開けない方が間違いが起きなくて良い。

ls -l /tmp /tm 1>/dev/null 2>/dev/null

条件判定の使用例

 

ファイルもしくはディレクトリが存在するか

if test -e "$P"
  xxx
else
  yyy
end

1行で書くと以下となる。

test -e "$P" ;and xxx ;or yyy

 

ファイルが存在するか

if test -f "$F"
  xxx
else
  yyy
end

1行で書くと以下となる。

test -f "$F" ;and xxx ;or yyy
end

 

変数が空っぽか判定する

if test -z "$VAR"
  xxx
else
  yyy
end

1行で書くと以下となる。

test -z "$VAR" ;and xxx ;or yyy

 

文字列が一致しているか判定する(string match 使用)

 

$INPUT が t, true, o, on, 1 (大小文字区別せず) のいずれかならば真とする。
if test ( string match -r -i "[t|true|o|on|1]\z" $INPUT )
  xxx
else
  yyy
end

1行で書くと以下となる。

test ( string match -r -i "[t|true|o|on|1]\z" $INPUT ) ;and xxx ;or yyy

 

$INPUT が「.」か判定する(string match 使用)
if test ( string match -r -i "\A\.\z" $INPUT )
  xxx
else
  yyy
end

1行で書くと以下となる。

test ( string match -r -i "\A\.\z" $INPUT ) ;and xxx ;or yyy

 

$INPUT が「..」か判定する(string match 使用)
if test ( string match -r -i "\A\.\.\z" $INPUT )
  xxx
else
  yyy
end

1行で書くと以下となる。

test ( string match -r -i "\A\.\.\z" $INPUT ) ;and xxx ;or yyy

 

文字列が一致しているか判定する

if test $MODE = "[d]"
  xxx
else
  yyy
end

1行で書くと以下となる。

test $MODE = "[d]" ;and xxx ;or yyy

 

スクリプトで頻繁に使用する用法

 

実行中のプログラム名を取得する

sh, bash での $0 に相当する変数の取得方法。

status -f

従って, basename $0 に相当する処理は次のようにする

set PROGNAME ( basename (status -f))

変数として使いたい場合は次のようにする

set PROGNAME ( basename (status -f))

 

プロセス番号の取得方法

sh, bash での $$ に相当する変数の取得方法
%self で取得できるので、次のようにして $PID などとして変数に格納して使用すれば OK.

set -g PID %self 

 

関数名を取得する

status function で取得可能である。私が知らないだけかも知れないが、sh では無いと思う。

status function