PHPで言うところのisset($array[$index])
をfishでどうやるか。
stack overflowなどにはいろいろな方法が載っているが、複雑すぎて理解できないし、書きたくなかった。
ループでのやりかた
思いつくけどやりたくないやり方
set list one two three
for value in $list
if test $value = $argv[1]
echo "Hit!"
break
end
end
containsでのやりかた
contains:【条件式】単語がリストに入っているかをテスト
このサイトのリストらへんを見てたんですが、containsへの言及がなく、サイト内をargvで検索したときにたまたま見つけた。
Googleでの検索は厳しいよお。
set list one two three can
if contains $argv[1] $list
echo "Hit!"
end
できればこれがしたい
${配列名[(r)条件]}
、${配列名[(i)条件]}
という形式も使える。
1つ目の方は「条件にマッチした最初の要素を返す」、2つ目の方は「条件にマッチした最初の要素番号を返す」という意味になる。
arr3=(aaa bbb1 ccc aaa1 bbb2 aaa33)
# bbb で始まる最初の要素を取得する
echo ${arr3[(r)bbb*]} #=> bbb1
# bbb で始まる最初の要素の要素番号を取得する
echo ${arr3[(i)bbb*]} #=> 2
# 見つからなかった場合は最後の要素番号+1になる
echo ${arr3[(i)xxx*]} #=> 7
オプションなどの指定は、
Crystalのコマンドが完全一致で入力しなくても実行されるので中を見た - Qiita
を見てから前方一致が気に入っているので、できればよかった。
よくわかんないの
bash - Easiest way to check for an index or a key in an array? - Stack Overflow
[ $array[$key]+abc ]
はfishだとInvalid index value
でダメだった。
シェルスクリプトで、配列内の文字列と一致しない場合の処理を記述する | 俺的備忘録 〜なんかいろいろ〜
なんか違う