シェルスクリプト総合 その22
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2013/11/01(金) 07:58:50.52□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
「そういうのはperl使いましょう」と回答するのはやめましょう。
安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その21
http://toro.2ch.net/test/read.cgi/unix/1352973453/
0669名無しさん@お腹いっぱい。
2014/03/29(土) 13:22:49.28あるいはひとつの格言を挙げておきたい
「バカは感染する」
0670名無しさん@お腹いっぱい。
2014/03/29(土) 13:22:58.30スマン、実は >>620-668 は全部俺の自作自演なんだ
0671名無しさん@お腹いっぱい。
2014/03/29(土) 13:23:52.27ああ、キミも感染したんだね
0672名無しさん@お腹いっぱい。
2014/03/29(土) 13:31:36.21の全体を見てみたいものだ
0673名無しさん@お腹いっぱい。
2014/03/29(土) 14:18:33.42調べるってお題があって、
undef="false"
if [ "${var-UNDEF}" = "UNDEF" ];then
if [ "$var" = "" ];then
undef="true"
fi
fi
なんで空文字かどうかを調べてるんだろうって思ったら var="UNDEF" って
なってる場合に対応してたのね
0674名無しさん@お腹いっぱい。
2014/03/29(土) 14:28:34.93変数が未定義という条件判断をするなら、
if [ -z "${var+DEF}" ]; then echo varは未定義; fi
だけで簡単に記述できるね。
0675名無しさん@お腹いっぱい。
2014/03/29(土) 14:30:42.74set -u 回避が正解って前提で話が盛り上がってたけど
全然関係なかったりしてw
0676名無しさん@お腹いっぱい。
2014/03/29(土) 14:34:51.56おお、素晴らしいφ(..)メモメモ
0677名無しさん@お腹いっぱい。
2014/03/29(土) 20:36:49.57> 大元の >>612 で言ってる「こういう書き方をしてるスクリプト」
> の全体を見てみたいものだ
例えば、
$ grep -iE '\$\{[a-z]+:' /usr/sbin/mkinitramfs
if [ -n "${UMASK:-}" ]; then
if [ -z "${compress:-}" ]; then
DESTDIR="$(mktemp -d ${TMPDIR:-/var/tmp}/mkinitramfs_XXXXXX)" || exit 1
__TMPCPIOGZ="$(mktemp ${TMPDIR:-/var/tmp}/mkinitramfs-OL_XXXXXX)" || exit 1
if [ -n "${ROOT:-}" ]; then
全体は長すぎるので省略します、あしからず
0678名無しさん@お腹いっぱい。
2014/03/29(土) 22:01:34.99set -u で引っ掛かってしまうのにそのままなんだな…?
if [ -z "${outfile}" ]; then
usage
fi
0679名無しさん@お腹いっぱい。
2014/03/29(土) 22:07:19.970680名無しさん@お腹いっぱい。
2014/04/02(水) 09:19:47.77この引数は他の引数と一緒にシェル変数に格納される
このシェル変数名は別の変数に変数名で格納されていて
実行時にevalして実行される
試行錯誤した結果二回evalという解決策にたどり着いたけど、何かスマートじゃない。
もっとスマートな方法はある? スペースを含まないなら一回のevalで済むんだが。
argspecをevalって実行するという部分はいじれないのでそれは無しの方向で
抜粋部分はこんな感じ
echo_it() { for a; do echo $a; done; }
argspec="\$opts $DEFAULTS"
opts=
opts="$opts arg1"
opts="$opts \"arg with space\""
eval set $argspec
eval echo_it "$@"
0681名無しさん@お腹いっぱい。
2014/04/02(水) 10:45:04.64あるいは使われない単語に変換して、呼ばれた側で同様に変換して戻す
という方式にする
無理にスペースをエスケープするより、綺麗になることが多い
0682名無しさん@お腹いっぱい。
2014/04/02(水) 15:23:14.11(ただし、引数にTABを含む文字列が使えなくなるけど)
opts="$opts arg1"
opts="$opts arg with space"
argspec="$opts $DEFAULTS"
OLD_IFS=$IFS; IFS=$'\t'
set -- $argspec
echo_it "$@"
IFS=$OLD_IFS
スマートかどうかは…不明
0683名無しさん@お腹いっぱい。
2014/04/24(木) 01:59:44.80作ってます
このファイルの末尾6行は不要なので、今は前処理で head -n -6 として削ってるのですが、
シェルスクリプト中でawkを使ってる部分が結構あるので、その処理をawkにて
置き換えられないだろうか、と考えてます
awk '/hoge/{
do {
〜処理〜
if (NR > 総行数 - 6) exit; ←
} while (getline)
}'
…みたいに「←」の様な記述を加えてやればよいのかなと思ってたのですが、しかし総行数は
ENDセクションにならないと分からないということでうまくいきませんでした
awkでうまく処理する方法、ありますでしょうか
事前にwcで行数を数えておき、それをawkに総行数の変数として渡して…というのは
うまくいったのですが、パイプが途切れるためかwcの仕様か、性能がかなり悪化してしまいました
0684名無しさん@お腹いっぱい。
2014/04/24(木) 07:08:22.640685名無しさん@お腹いっぱい。
2014/04/24(木) 07:38:17.980686名無しさん@お腹いっぱい。
2014/04/24(木) 08:00:48.930687名無しさん@お腹いっぱい。
2014/04/24(木) 15:39:50.84a[NR]=$0
if (NR>6){
$0=a[NR-6]
} else {
next
}
}
ってのをスクリプトの先頭につっこんでおけばいいかな。試してないけど。でも、
>このファイルの末尾6行は不要なので、今は前処理で head -n -6 として削ってるのですが、
これでいいと思う。
0688683
2014/04/24(木) 23:52:15.466行分のバッファを、と見て、ほほーと思って途中まで実装してみましたが、
なんというか、非常によく分からないスクリプトになってきたので、やめました…
現状どおり、headで削る、でいこうと思います
0689名無しさん@お腹いっぱい。
2014/04/25(金) 01:29:19.17入力全部配列に突っ込むなら、普通に全部読み込んでから処理した方がいいんじゃね?
0690名無しさん@お腹いっぱい。
2014/04/25(金) 02:26:46.700691名無しさん@お腹いっぱい。
2014/04/25(金) 03:20:34.411
2
3
4
0692名無しさん@お腹いっぱい。
2014/04/25(金) 06:49:31.640693名無しさん@お腹いっぱい。
2014/04/25(金) 08:33:17.570694名無しさん@お腹いっぱい。
2014/04/25(金) 08:47:19.19printしてしまわずに、そのあとの目的のawk処理につなげるにはどう書くの?
awk 2つをパイプでつないだのでは無駄なので。
0695名無しさん@お腹いっぱい。
2014/04/25(金) 09:01:48.690696名無しさん@お腹いっぱい。
2014/04/25(金) 09:54:31.02$0に代入直して新規行入力のつもりで処理を続行すればいい。
awk '{if(NR>6){$0=_[NR%6]}else{_[NR%6]=$0;next}} {ここにやりたい処理}'
0697名無しさん@お腹いっぱい。
2014/04/25(金) 10:05:51.33馬鹿は書き込むな。それ全然駄目。
0698名無しさん@お腹いっぱい。
2014/04/25(金) 16:55:01.02俺awk使えないから予想だけど、%0以外の自動更新される値が6行先になる?
0699名無しさん@お腹いっぱい。
2014/04/25(金) 17:56:08.98cshは古い、bshは当たり前? じゃあashか? ashより優れた sshにするか?
コンサートだとA席よりS席の方が上ですよね?
0700名無しさん@お腹いっぱい。
2014/04/25(金) 17:59:12.63コピペ
http://toro.2ch.net/test/read.cgi/unix/1266323017/976
0701691
2014/04/25(金) 23:22:31.10$ paste <(seq 1 10) <(seq 11 20) | awk '{l = $0} NR>6 {$0 = _[NR%6]} {_[NR%6] = l} NR>6 { printf "%d + %d = %d\n", $1, $2, $1 + $2 }'
1 + 11 = 12
2 + 12 = 14
3 + 13 = 16
4 + 14 = 18
0702名無しさん@お腹いっぱい。
2014/04/28(月) 02:44:42.990703名無しさん@お腹いっぱい。
2014/04/28(月) 12:54:44.58http://ja.wikipedia.org/wiki/UNIX%E5%93%B2%E5%AD%A6
1. 小さいものは美しい。
2. 各プログラムが一つのことをうまくやるようにせよ。
3. できる限り原型(プロトタイプ)を作れ。
4. 効率よりも移植しやすさを選べ。
5. 単純なテキストファイルにデータを格納せよ。
6. ソフトウェアの効率をきみの優位さとして利用せよ。
7. 効率と移植性を高めるためにシェルスクリプトを利用せよ。
8. 束縛するインターフェースは作るな。
9. 全てのプログラムはフィルタとして振る舞うようにせよ。
0704名無しさん@お腹いっぱい。
2014/04/28(月) 13:02:19.25板ちがい
0705名無しさん@お腹いっぱい。
2014/04/29(火) 05:48:42.07板に至ってはUNIX板より適切な板はないだろってレベル
0706名無しさん@お腹いっぱい。
2014/04/29(火) 06:25:19.06特にjournaldなんか独自バイナリにログ入れて
journalctlでしか見れないようにしててめっちゃ不便
0707名無しさん@お腹いっぱい。
2014/04/29(火) 08:52:18.75ほんとこれ
トラブったときのログも特定の環境でしか読めないとか氏んでほしい
0708名無しさん@お腹いっぱい。
2014/05/05(月) 18:29:35.56マジかよクソすぎんだろsystemd
0709名無しさん@お腹いっぱい。
2014/05/18(日) 05:09:49.37バッチ処理ならいいけど、条件分岐が入った時点でperlなりpythonなり使えと思うんだけど
0710名無しさん@お腹いっぱい。
2014/05/18(日) 05:30:13.26perlやpythonが入ってない(入れられない)環境もあるってことなんじゃ。
組み込み、UNIX、Linuxでもシェルさえある環境ならOK、
ってのはなかなか強力な利点じゃないかね。
0711名無しさん@お腹いっぱい。
2014/05/18(日) 06:26:03.13ashならバージョン互換性とか気にしなくて良いんじゃないの。
置き換えられてたらpython2.7とか一生アンインストールできなくなりそう。
0712名無しさん@お腹いっぱい。
2014/05/18(日) 08:33:26.390713名無しさん@お腹いっぱい。
2014/05/18(日) 09:07:08.76シェルスクリプトなら3〜4行で終わるものが、何十行にもなってる python スクリプト見たこともあるわ。
0714名無しさん@お腹いっぱい。
2014/05/18(日) 09:19:25.75何でbashで条件分岐使っちゃ駄目なのか良く分からんし
バッチ処理って単語の使い方が何か違う気がするし
0715名無しさん@お腹いっぱい。
2014/05/18(日) 09:27:05.580716名無しさん@お腹いっぱい。
2014/05/18(日) 10:30:08.010717名無しさん@お腹いっぱい。
2014/05/18(日) 16:55:44.52そうすれば ` ` を使わなくて済む
0718名無しさん@お腹いっぱい。
2014/05/18(日) 16:58:20.56でもいちいちライブラリ入れるの面倒だし
仕事でサーバとか使ってると「追加ソフト入れるの禁止」
って状況はそれなりにある
0719名無しさん@お腹いっぱい。
2014/05/18(日) 18:19:52.61商用じゃそのPerlスクリプトが動かんかった、という凡ミスが連発した結果、
必要なライブラリを書面で説明できないPerlスクリプトは商用適用NG、となった
0720名無しさん@お腹いっぱい。
2014/05/18(日) 18:24:43.11コマンドの実行とか
0721名無しさん@お腹いっぱい。
2014/05/19(月) 08:37:18.45ただし、perl の適所はなくなったので、早く滅びろ
0722名無しさん@お腹いっぱい。
2014/05/20(火) 12:54:25.010723名無しさん@お腹いっぱい。
2014/05/20(火) 13:11:40.740724名無しさん@お腹いっぱい。
2014/05/20(火) 13:20:31.010725名無しさん@お腹いっぱい。
2014/05/20(火) 17:30:45.520726名無しさん@お腹いっぱい。
2014/05/20(火) 17:51:03.17rubyでいいんじゃない。短くかけるし。括弧言語じゃないから定義とか書くのは辛いけど、処理だけが目的なら代替手段あるだろうし。
0727名無しさん@お腹いっぱい。
2014/05/20(火) 18:07:09.84perlが駄目だと言うのなら、次に考えるのはawkかsedだろ。常識的に考えて。
0728名無しさん@お腹いっぱい。
2014/05/20(火) 18:08:45.410729名無しさん@お腹いっぱい。
2014/05/20(火) 18:14:46.31ruby()
>>727
sedでは足りないのをperl使うのだ
awkは半端だからフィールド抽出以外には使わない
結論: 一行野郎に対する代替が無いのでperlは存命
0730名無しさん@お腹いっぱい。
2014/05/20(火) 18:17:56.34rubyが駄目だと言うのなら、次に考えるのはawkかsedだろ。常識的に考えて。
0731名無しさん@お腹いっぱい。
2014/05/20(火) 18:33:31.84rubyは入れる物を多少選べば排除できるが、perlへの依存を全て排除するのは無理ではないが結構面倒だろう。
0732名無しさん@お腹いっぱい。
2014/05/20(火) 18:54:13.540733名無しさん@お腹いっぱい。
2014/05/20(火) 19:05:06.070734名無しさん@お腹いっぱい。
2014/05/20(火) 19:29:20.61ビルトインとsedとawkで大抵こと足りるからな。perl使うのに多いのはライブラリ使いたい時とか。
でもそうするとpythonやrubyの方が最近のものがある気がする。pmとかまだ作られてるの?
0735名無しさん@お腹いっぱい。
2014/05/21(水) 00:06:27.58一行野郎と言えば「awkは書かねぇ、たった一行」だろ?
0736名無しさん@お腹いっぱい。
2014/05/21(水) 03:32:28.760737名無しさん@お腹いっぱい。
2014/05/21(水) 05:00:52.020738名無しさん@お腹いっぱい。
2014/05/21(水) 08:41:33.680739名無しさん@お腹いっぱい。
2014/05/21(水) 08:47:53.28rubyを入れなくても何にも困ってない rails?()
perlを入れてないとコンパイルできないものが結構ある(PostgreSQLとか)
ruby信者の視野狭窄は異常
0740名無しさん@お腹いっぱい。
2014/05/21(水) 09:18:31.410741名無しさん@お腹いっぱい。
2014/05/21(水) 09:41:02.86コンパイルの依存関係にperl入れるのは辞めてほしい
0742名無しさん@お腹いっぱい。
2014/05/21(水) 10:01:39.33autotoolsに依存するより全然まし
0743名無しさん@お腹いっぱい。
2014/05/21(水) 10:02:56.580744名無しさん@お腹いっぱい。
2014/05/21(水) 17:28:29.71コンパイルの依存関係にrubyやpythonが入るより少しはマシ
って言おうかと思ったけど自分の遭遇トラブルはperl依存モノの方が多かったorz
>>742
コンパイル省力化に高機能なツールや言語を使い出して、
今度はそっちの互換性問題が火を噴くとか本末転倒にもホドがある…
最小限のシェルスクリプトかMakefileで済む奴が一番気楽だわ
0745名無しさん@お腹いっぱい。
2014/05/21(水) 17:39:42.30その分野ではrubyやpythonは使われてないからだろ。特にrubyは日本限定末端土方専用だから。
使われてなきゃトラブルには遭遇しない。当たり前だ。
0746名無しさん@お腹いっぱい。
2014/05/21(水) 17:42:51.81perlのアップデートとかなったら阿鼻叫喚の渦
あと何かのプロジェクトで頑張ってperl依存をなくしたってニュースになったな
perlは撲滅すべき悪ではあるがまだ依存関係から取り除けてない害虫みたいなもんなんだろう
0747名無しさん@お腹いっぱい。
2014/05/21(水) 18:01:29.51お、懐かしいね。Canna じゃまだ使われているのかな?
0748名無しさん@お腹いっぱい。
2014/05/21(水) 18:15:59.05昔はこんなのを↓よくやってたけどね
$ perl -pi.bak -e 's:#!/usr/bin/perl:#!/usr/local/bin/perl:' *.pl
最近使ったのは…Run Length Encoding かな
$ echo '......' | perl -pe 's/(.)(\1+)/$1.(length($2)+1)/ge'
RLEって sed や awk, UNIX tools を組み合わせて one liner でできるのかな…
0749名無しさん@お腹いっぱい。
2014/05/21(水) 18:35:56.58お察しの通りFreeBSDだが、FreeBSDは脱GPL脱GCCの実績が有るし今後に期待?
0750名無しさん@お腹いっぱい。
2014/05/21(水) 20:41:31.00http://rosettacode.org/wiki/Run-length_encoding
ぐぐったらsed版とawk版があるな
つーかrun length encodingって必要になった状況ないな
0751名無しさん@お腹いっぱい。
2014/05/22(木) 00:16:14.560752名無しさん@お腹いっぱい。
2014/05/22(木) 09:09:18.24運用しているサーバを私は見たことがありません。
でも perl が入ってないサーバって、実は世の中には結構あるんですかね?
0753名無しさん@お腹いっぱい。
2014/05/22(木) 09:30:02.07じょ、冗談で書いてるんだよね?
0754名無しさん@お腹いっぱい。
2014/05/22(木) 10:12:42.49というと?
0755名無しさん@お腹いっぱい。
2014/05/22(木) 12:16:17.560756名無しさん@お腹いっぱい。
2014/05/22(木) 12:20:57.50必要なら入れれば?な感じ。
0757名無しさん@お腹いっぱい。
2014/05/22(木) 15:33:22.17その言語自身のセクションと、libsは除いてみた。
$ for l in perl python ruby ;do echo -n "$l ";aptitude search ~D$l\!~s$l\!~slibs|wc -l;done
perl 962
python 1603
ruby 204
0758名無しさん@お腹いっぱい。
2014/05/22(木) 15:41:24.610759名無しさん@お腹いっぱい。
2014/05/22(木) 21:37:53.41それでタイプ量の多さに失望するんですね。
0760名無しさん@お腹いっぱい。
2014/05/24(土) 11:07:22.49sh系なら-e''の中に改行含めれるし。
最近はもう、awkをさけるようになったなぁ
なんで正規表現の互換性をなくしてしまったのか。
0761名無しさん@お腹いっぱい。
2014/05/24(土) 11:56:11.33autotoolsって、シェルスクリプトとm4とmakeで
できてるから、このスレ的には新参スクリプト言語よりは
歓迎なんじゃないかって気がするw
0762名無しさん@お腹いっぱい。
2014/05/24(土) 21:11:49.14「auto」toolsはマニュアルで修正しないとコンパイル通らない場合が…
0763名無しさん@お腹いっぱい。
2014/05/24(土) 21:55:46.180764名無しさん@お腹いっぱい。
2014/05/25(日) 14:19:48.290765名無しさん@お腹いっぱい。
2014/05/29(木) 00:34:01.910766名無しさん@お腹いっぱい。
2014/05/29(木) 17:22:41.57もう、何年も前からcshは入ってないが何も不都合は生じてない
0767名無しさん@お腹いっぱい。
2014/06/07(土) 16:19:13.77プログレスバーを作って待ち時間のストレスを抑えようと思う
今何%進んでるかは実行行/全体行で簡単に分かるんだが、これを画面上に出力する時に、
単純に計算結果を出力するだけだと
[05%]・・・・・
[06%]・・・・・・
[07%]・・・・・・・
という風に毎回改行されて表示されて画面が汚くなるのが嫌だ
つまり何が聞きたいかというと、既に出力された結果を書き換えるような仕組みはshで実現可能なのだろうか
分かりにくくてすまない
0768名無しさん@お腹いっぱい。
2014/06/07(土) 16:20:12.71^M
■ このスレッドは過去ログ倉庫に格納されています