はじめに
初めまして!
Life is Tech ! メンターで、某大学院の2年生で情報工学の研究に勤しんでいるきゃみです!
今日はShellScriptについてまとめてみました!
ShellScriptはfishとbash(zsh)でコードが違う
仕事でfish環境にしなきゃいけないことがあり、その中で作業効率化のために初めてShellScriptを触ったら仕様がちょくちょく違う部分があったので、備忘録的にfishとbash(zsh)の仕様の違いをまとめてみました。
自分の認識なので間違ってる部分があれば是非コメントいただきたいです!
変数宣言が違う
bashの場合
bash.sh
hoge="fuga"
fishの場合
fish.sh
set hoge "fuga"
=くらい使わせてくれよなあ、、、
変数の使い方が違う
bashの場合
bash.sh
$hoge
${hoge}
# どっちでもいい
fishの場合
fish.sh
$hoge
# こっちだけ許されてる
シンプルになんで?連結する時にとても不便
引数の使い方が違う
bashの場合
bash.sh
$1 #一つ目の引数
$2 #二つ目の引数
fishの場合
fish.sh
$argv[1] #一つ目の引数
$argv[2] #二つ目の引数
これはfishの方がわかりやすいかもしれないけど気づけない
四則演算の仕方が違う
bashの場合
bash.sh
$(( $hoge + 1 ))
fishの場合
fish.sh
expr $hoge + 1
四則演算までコマンド操作にするんじゃねええええ
if文、ループ文の文法が違う
bashの場合
bash.sh
if [$hoge -ge 123] then;
# なんか処理
fi
for f in hoge fuga
do
# なんか処理
done
fishの場合
bash.sh
if [$hoge -ge 123]
# なんか処理
end
for f in hoge fuga
# なんか処理
end
これもなんとなくfish文法のが馴染みあるけど、エディターがシンタックスハイライトしてくれないのがうざすぎる
コマンドの使い方が違う
bashの場合
fish.sh
for f in 'ls direcectory'
do
# なんか処理
done
# 上下のどちらか
for f in $(ls direcectory)
do
# なんか処理
done
fishの場合
fish.sh
for f in (ls direcectory)
# なんか処理
end
これもシンタックスハイライトしてくれないのでうざい
なんかわからないけどif文の条件分に使えないコマンドがある
これは自分の環境だからかもしれないけど、testコマンドが使えなかった
fishの場合
fish.sh
if (test $hoge -ge 123)
# 実行すると上の行でエラーを吐く
end
実際に吐くエラー
iTerm
create_matlab_code.sh (line 16): Command substitutions not allowed
if (test $i -ge 2) && [ $i -le 11 ]
^
from sourcing file create_matlab_code.sh
source: Error while reading file 'create_matlab_code.sh'
最後に
こんなに仕様変えなくてもいいじゃないか...
↧