アカウント名:
パスワード:
http://d.hatena.ne.jp/dharry/20090211/1234290856 [hatena.ne.jp]
#! /bin/bash AFO='hoge:hage:hure' a=${AFO%%:*}bsub=${AFO#*:}b=${bsub%:*}c=${AFO##*:} echo $aecho $bsubecho $becho $c
ただ、移植性が悪くなることと、あまり柔軟性がない点は覚悟が必要。それなら
#! /bin/bash AFO='hoge:hage:hure' d=$(echo ${AFO} | sed -r 's/([^:]*):([^:]*):([^:]*)/\1/')e=$(echo ${AFO} | sed -r 's/([^:]*):([^:]*):([^:]*)/\2/')f=$(echo ${AFO} | sed -r 's/([^:]*):([^:]*):([^:]*)/\3/') echo $decho $eecho $f
と、全てを sed の拡張正規表現様にお任せする方が柔軟度が高いというものです (-人-)# 南無正規表現如来
アドバイスありがとうございます。
最初の例については、shibuyaさんのバージョンと同様に、str3にコロンが入ってくる形だとうまくいかなくなってしまいますね。後者のsedを使うバージョンについては、s/([^:]*):([^:]*):(.*)/……/とすれば対応可能そうです。本文に書いた、cutを使う方法と同様に、同じようなコマンドが連続するのが気になりますが、evalと組み合わせれば1回で済みそうですね。
eval $(echo "$v" | sed -r 's/([^:]*):([^:]*):(.*)/a='\''\1'\''; b='\''\2'\''; c='\''\3'\'';/')
……て、わかりづらいな。3日後にこれを解読できる自信がありません(汗
あ。vにシングルクォートを含めたら破綻した(- -;;
あぁっ、最後の条件を忘れてた。
同じようなコマンドが連続するのが気になりますが、
そこを気にするぐらいなら、全体の制御の方を bash ではなく perl で書くことを選びます。# 拡張正規表現の関係で perl を選ぶ。
というか、ちょうどその辺りが shell で済ませるか、もっと制御機能の付いたスクリプト言語に移行するかの境目ですね。
split(){IFS=':' read a b cecho "$a"echo "$b"echo "$c"}
declare -a argvargv=($(echo '123:456:789:ABC' | split))echo "${argv[0]}"echo "${argv[1]}"echo "${argv[2]}"
なるほど。readはほとんど使ったことがないので参考になります。
おや、直接 echo ... | read ... だとダメなのか。man確認しとこう。
パイプがあると別の世界(サブシェル)なので、変数はサブシェルのなかでのみ有効です。どんなことがやりたいかわからないので、親シェルに値を返すためにあんなことをしていますが、一番単純なパタンだと、これで十分です。echo 1:2:3 | (IFS=':' read a b c; ここに処理を書く)
ヒアドキュメントを使えば、read で読ませることもできますよ。
IFS=: read a b c <<EOF123:456:789EOF
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
開いた括弧は必ず閉じる -- あるプログラマー
bash独自のパラメータ展開という手はある (スコア:1)
http://d.hatena.ne.jp/dharry/20090211/1234290856 [hatena.ne.jp]
ただ、移植性が悪くなることと、あまり柔軟性がない点は覚悟が必要。それなら
と、全てを sed の拡張正規表現様にお任せする方が柔軟度が高いというものです (-人-)
# 南無正規表現如来
fjの教祖様
Re:bash独自のパラメータ展開という手はある (スコア:1)
アドバイスありがとうございます。
最初の例については、shibuyaさんのバージョンと同様に、str3にコロンが入ってくる形だとうまくいかなくなってしまいますね。
後者のsedを使うバージョンについては、s/([^:]*):([^:]*):(.*)/……/とすれば対応可能そうです。
本文に書いた、cutを使う方法と同様に、同じようなコマンドが連続するのが気になりますが、evalと組み合わせれば1回で済みそうですね。
……て、わかりづらいな。3日後にこれを解読できる自信がありません(汗
巧妙に潜伏したバグは心霊現象と区別が付かない。
Re:bash独自のパラメータ展開という手はある (スコア:1)
あ。vにシングルクォートを含めたら破綻した(- -;;
巧妙に潜伏したバグは心霊現象と区別が付かない。
Re:bash独自のパラメータ展開という手はある (スコア:1)
あぁっ、最後の条件を忘れてた。
そこを気にするぐらいなら、全体の制御の方を bash ではなく perl で書くことを選びます。
# 拡張正規表現の関係で perl を選ぶ。
というか、ちょうどその辺りが shell で済ませるか、もっと制御機能の付いたスクリプト言語に移行するかの境目ですね。
fjの教祖様
Re: (スコア:0)
split()
{
IFS=':' read a b c
echo "$a"
echo "$b"
echo "$c"
}
declare -a argv
argv=($(echo '123:456:789:ABC' | split))
echo "${argv[0]}"
echo "${argv[1]}"
echo "${argv[2]}"
Re:bash独自のパラメータ展開という手はある (スコア:1)
なるほど。readはほとんど使ったことがないので参考になります。
おや、直接 echo ... | read ... だとダメなのか。man確認しとこう。
巧妙に潜伏したバグは心霊現象と区別が付かない。
Re: (スコア:0)
パイプがあると別の世界(サブシェル)なので、変数はサブシェルのなかでのみ有効です。
どんなことがやりたいかわからないので、親シェルに値を返すためにあんなことをしていますが、
一番単純なパタンだと、これで十分です。
echo 1:2:3 | (IFS=':' read a b c; ここに処理を書く)
Re: (スコア:0)
ヒアドキュメントを使えば、read で読ませることもできますよ。