トップページunix
988コメント297KB

シェルスクリプト総合 その24©5ch.net

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net2014/11/11(火) 00:54:03.43
シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その23
http://peace.2ch.net/test/read.cgi/unix/1404204950/
0011名無しさん@お腹いっぱい。2014/11/12(水) 04:59:38.71
シャナスクリプトはまだですか?
0012名無しさん@お腹いっぱい。2014/11/12(水) 07:18:57.54
シャロスクリプトもまだです
0013名無しさん@お腹いっぱい。2014/11/12(水) 13:25:09.66
そういえば
コート脱いだらハワイのミポリソ萌えスクリプトが
サーバのどっかに転がってたかもなぁw
0014名無しさん@お腹いっぱい。2014/11/12(水) 23:08:52.17
前スレで長テンプレを提案してた人スレ立ったらテンプレそのままでざまぁwww
とか思ってたらしっかり記載していたでござる

なんか文面の雰囲気変わったな、もっと堅い感じだった気がするが
0015名無しさん@お腹いっぱい。2014/11/13(木) 07:09:24.77
>>14
変えてないけどなあ
意見聞く際になるべく中立、丁寧語で書いたから、そういう印象なのかな?

意見を聞いて了承を得てからという作業は面倒臭かったが
たとえ、その23 以前の短い1レスだけのテンプレのままを、立てる人がコピペするにしても
少なくとも Perl の矛盾した記述だけはなんとかしたい

シェルスクリプト総合 その1 からずっと最近までは
「(Rubyや)awkまたはperlの方が適した処理にはそちらを使いましょう。」だけだった
0016名無しさん@お腹いっぱい。2014/11/16(日) 22:28:48.41
お勧めの shell を教えて下さい。

ずっと(22年ぐらい) 自宅や学校の FreeBSD上で tcsh を login shell として使ってきましたが、
このスレを読んで、 csh 系スクリプトはお勧めでないことを知りました。

root で作業するときには、 sh も必要なので使いますし、スクリプトも書くのですが
tcsh から sh系に移行できないでいます。

最近は仕事で数値計算をするときのプラットフォームが cygwin になってしまったため、
これを機に 自宅の FreeBSD でも、sh 系を login shell にするように切り替えようかとも思っています。
お勧めを教えて頂けませんでしょうか。

どうぞ宜しくお願い致します。
0017名無しさん@お腹いっぱい。2014/11/16(日) 22:34:23.69
>>16 自己フォローです。

すみません。他に適切と思われるスレを見つけたので、移動します。

おまえら! shell は何を使っているんですか?
http://peace.2ch.net/test/read.cgi/unix/1012330865/

お邪魔して申し訳ありませんでした。
0018名無しさん@お腹いっぱい。2014/11/17(月) 00:19:12.19
お、おう
0019名無しさん@お腹いっぱい。2014/11/17(月) 06:46:29.31
ログインシェルとスクリプトのシェルを一致させる必要は別にないのになぁ…
0020名無しさん@お腹いっぱい。2014/11/17(月) 08:15:15.50
ログインシェルはzshでスクリプト書くときはbashかな
0021名無しさん@お腹いっぱい。2014/11/17(月) 08:20:16.99
ログインシェルもスクリプトもashだ
0022名無しさん@お腹いっぱい。2014/11/17(月) 08:52:41.49
Bシェル系同士なら一致させなくても良い
0023名無しさん@お腹いっぱい。2014/11/17(月) 14:56:35.93
スクリプトは ash か dash
0024名無しさん@お腹いっぱい。2014/11/17(月) 22:07:53.32
z750sh3
0025名無しさん@お腹いっぱい。2014/11/18(火) 13:45:16.57
shで無駄にがんばる
いやなんとなく続けてるだけか
0026名無しさん@お腹いっぱい。2014/11/18(火) 17:45:34.74
/bin/sh でがんばっているよ
実体が ash だったり
dash へのリンクだったりするだけでw
0027名無しさん@お腹いっぱい。2014/11/18(火) 17:50:06.98
がんばるってほどのことかな
スクリプト書く労力は他のシェルでもあんま変わらんでしょ?
0028名無しさん@お腹いっぱい。2014/11/18(火) 18:04:52.35
ん? ログインシェルを/bin/shで頑張るって話でしょ?
補完なし、ヒストリーなし、aliasなしで。
0029名無しさん@お腹いっぱい。2014/11/18(火) 18:09:15.90
スクリプトスレだからスクリプト動かす話だよ
0030名無しさん@お腹いっぱい。2014/11/18(火) 18:24:14.49
>>19 の、ログインシェルとスクリプトのシェルを一致させる必要があるかどうか
という話から来てるから、
ログインシェルの話だろ
0031名無しさん@お腹いっぱい。2014/11/19(水) 20:36:46.43
emacsキーバインドのtcshでログインして、viでashスクリプト書いてるわ。
0032名無しさん@お腹いっぱい。2014/11/20(木) 21:39:29.05
>>28
ashはファイル補完もヒストリー呼び出しもある。
aliasなんてうんこ。functionの方が強力。
0033名無しさん@お腹いっぱい。2014/11/21(金) 05:09:42.89
>>32
それはFreeBSD拡張のashだね。
0034名無しさん@お腹いっぱい。2014/11/21(金) 16:11:47.88
スレ違いっぽいので何だがw
ログインシェルは zsh
0035名無しさん@お腹いっぱい。2014/11/21(金) 16:14:13.45
>>33
大抵emacsのshell-modeで使うので、ヒストリやコンプリーションは
なくてもそれほど困らない。
0036名無しさん@お腹いっぱい。2014/11/21(金) 19:51:04.45
もういっそログインシェルをemacsにしろよw
0037名無しさん@お腹いっぱい。2014/11/21(金) 19:58:39.53
ログインシェルを遊びでviにしてみたことならある。
その状態でログインしたviからシェルエスケープしようとすると
vi変数でshell=vi状態になってるのでシェルのつもりでさらにviが起動されてハマる。
0038名無しさん@お腹いっぱい。2014/11/21(金) 20:28:57.59
emacsをdisplay managerにしたようなOSがあったな。
0039名無しさん@お腹いっぱい。2014/11/21(金) 20:41:52.18
Oberon?
0040名無しさん@お腹いっぱい。2014/11/21(金) 20:53:09.31
apollo domain
0041名無しさん@お腹いっぱい。2014/11/25(火) 12:45:00.26
for文で空白区切りのリストを後ろからループさせることはできないでしょうか?
下記の例だと「1 2 3」の順で表示されますが、これを「3 2 1」の順で表示させたいです。

VLIST="1 2 3"
for val in $VLIST
do
echo $val
done
0042名無しさん@お腹いっぱい。2014/11/25(火) 13:00:52.50
>>41

VLIST='1 2 3'
for val in `echo "$VLIST" | tac -s ' '`
do
echo "$val"
done
0043412014/11/25(火) 13:39:35.78
>>42
すごい!できました。
ありがとうございました!
0044名無しさん@お腹いっぱい。2014/11/25(火) 13:46:29.21
もう答えが出ちゃってますけど rev コマンドでも行けます

$ for val in $(rev <<< "$VLIST"); do echo $val; done
0045名無しさん@お腹いっぱい。2014/11/25(火) 13:56:09.14
tac便利、自分も使ってる
0046名無しさん@お腹いっぱい。2014/11/25(火) 13:57:16.68
>>45
revだと、2桁以上の数字の時 数値の桁が入れ替わるので不可。

12 13 14 -> 41 31 21 みたいに
0047名無しさん@お腹いっぱい。2014/11/25(火) 20:47:40.16
tac 知らなかったが便利そうだ。
0048名無しさん@お腹いっぱい。2014/11/25(火) 21:00:07.87
良かった。知らないのは俺だけじゃなかったんだなw
GNU 方面は、他にも便利なコマンドがいろいろありそう・・・
(さすがに date コマンドで日付演算できるのは知ってた)
0049名無しさん@お腹いっぱい。2014/11/25(火) 21:25:54.46
とりあえずcoreutilsに入ってるものは全部覚えておこうぜ
100個ぐらいしかないんだからさ
0050名無しさん@お腹いっぱい。2014/11/25(火) 21:53:35.67
GNU Coreutils Cheat Sheet
http://www.catonmat.net/blog/gnu-coreutils-cheat-sheet/
0051名無しさん@お腹いっぱい。2014/11/26(水) 00:18:13.73
tac知ってたけど有効な使い道が見いだせないでいた
しかし名前のセンスいいよな
0052名無しさん@お腹いっぱい。2014/11/26(水) 00:36:12.96
slがtacの仲間だと思って入れた時の脱力感
0053名無しさん@お腹いっぱい。2014/11/26(水) 06:02:33.63
>>46
要素ごとにもっかいrevで
0054名無しさん@お腹いっぱい。2014/11/26(水) 06:28:19.23
どうせまたBash shockのようにCoreutils shockが起こるんだぜ?
やめておけよw
0055名無しさん@お腹いっぱい。2014/11/26(水) 06:42:34.79
tac使わずに標準コマンドまたは内部コマンドだけでやれ、というのがいい詰めスクリプト問題になるなぁ。
0056名無しさん@お腹いっぱい。2014/11/26(水) 06:48:48.66
再帰すればラクショー
0057名無しさん@お腹いっぱい。2014/11/26(水) 06:50:18.91
VLIST='1 2 3'
t=; for val in $VLIST; do t="$val $t"; done

for val in $t
do
echo "$val"
done
0058名無しさん@お腹いっぱい。2014/11/26(水) 06:51:47.26
>>56 のあとに再帰すら使ってないラクショーな >>57 が書き込まれた件について
0059名無しさん@お腹いっぱい。2014/11/26(水) 07:03:58.55
再帰するならこうか。これ活用しにくい。これなら >>57 の方がいい

VLIST='1 2 3'

func()
{
if [ $# -gt 1 ]; then
(shift; func "$@")
fi
echo "$1"
}

func $VLIST
0060名無しさん@お腹いっぱい。2014/11/26(水) 12:51:29.43
未熟者のオレに>>57の動きを教えてくだせえ。。。
0061名無しさん@お腹いっぱい。2014/11/26(水) 12:59:26.09
set -x してから >>57 を実行してみると分かると思う
0062名無しさん@お腹いっぱい。2014/11/26(水) 17:31:45.44
>>57
即レスかっけー!これは濡れるw
0063名無しさん@お腹いっぱい。2014/11/26(水) 19:08:42.67
>>57が正統派に思えてくる
素直で余計なことをしていない
逆転と出力で2回forってるのが気にはなるが
0064名無しさん@お腹いっぱい。2014/11/26(水) 20:30:20.12
#!/bin/bash

VLIST='1 2 3 4 5'

val=($VLIST)

while [ ${#val[@]} -gt 0 ]; do
echo ${val[${#val[@]}-1]}
unset val[${#val[@]}-1]
done
0065名無しさん@お腹いっぱい。2014/11/26(水) 21:05:02.38
>>64
どうせbash使うなら素直にこうやれよ

#!/bin/bash

VLIST='1 2 3 4 5'
val=($VLIST)

for ((i=${#val[@]}-1; i >= 0; i--)) {
echo ${val[i]}
}
0066名無しさん@お腹いっぱい。2014/11/27(木) 02:55:58.45
どうせ10個もアイテムないだろうから

VLIST="1 2 3"
set $VLIST
for val in $9 $8 $7 $6 $5 $4 $3 $2 $1
do
echo $val
done
0067名無しさん@お腹いっぱい。2014/11/27(木) 03:03:45.58
それだったら

echo $9 $8 $7 $6 $5 $4 $3 $2 $1

でええやん…
0068名無しさん@お腹いっぱい。2014/11/27(木) 03:42:20.68
>>59
bash/zsh なら local 変数使ってこんな感じに

function reverse {
local arg="$1"
[ $# -gt 0 ] &&
{ shift; reverse "$@"; echo -n "$arg "; }
}

最後の改行はどうすべぇ…
0069名無しさん@お腹いっぱい。2014/11/27(木) 04:05:50.71
2段重ねにしてみる

function reverse {
function _reverse {
local arg="$1"
[ $# -gt 0 ] &&
{ shift; _reverse "$@"; echo -n "$arg "; }
}
_reverse "$@" | sed 's/ $/\n/'
}
0070名無しさん@お腹いっぱい。2014/11/27(木) 12:26:34.92
キモい
もっと綺麗にならんかね
0071名無しさん@お腹いっぱい。2014/11/27(木) 13:33:00.01
>>70
毎日凝視して眺める訳じゃないから
動けばいい、安定してどんな場面でも問題が起こらなければいい。
シェルスクリプトなんてそういうレベルのもの
しょせん手作業の積み上げだからね。
0072名無しさん@お腹いっぱい。2014/11/27(木) 14:14:44.52
「コードが汚くても安定して動けばいい」なんてのは
他人のコードをメンテしたり機能追加したことのない奴が言うセリフ
0073名無しさん@お腹いっぱい。2014/11/27(木) 14:31:21.58
継続してメンテしなきゃいけないスクリプトもあるし
一回動けばそれでいい使い捨てのスクリプトもある
それだけの話っしょ
0074名無しさん@お腹いっぱい。2014/11/27(木) 14:32:04.95
>>68,69 は再帰を知っていれば分かりやすいと思うけどなぁ
0075名無しさん@お腹いっぱい。2014/11/27(木) 14:43:04.36
再起知らないプログラマなんて存在しないだろ
0076名無しさん@お腹いっぱい。2014/11/27(木) 15:06:22.08
>>72
自分しか使わないマシンでも他人にメンテをお願いする
前提で書かないとならないのかい?
むしろメンテ側の人間には全く関係ない話しなんだが。
0077名無しさん@お腹いっぱい。2014/11/27(木) 15:08:35.87
>>76
一ヶ月前の自分は他人と思えって諺があってだな
個人的には自分のコードを汚く書いてしまったせいで泣くはめになったことも良くある
0078名無しさん@お腹いっぱい。2014/11/27(木) 15:12:04.96
いくらか使いこなせるようになったPerlerによくあった
0079名無しさん@お腹いっぱい。2014/11/27(木) 15:23:18.84
>>77
良い師匠に巡り会ったじゃない。
もし1ヶ月前の自分が完全無欠なら精進の可能性を断たれるな。
0080名無しさん@お腹いっぱい。2014/11/27(木) 17:23:22.21
数年前にキレイに書いたつもりのスクリプトでもメンテ(改造)めんどいお
0081名無しさん@お腹いっぱい。2014/11/27(木) 17:40:12.56
保身のため、コードはなるべく汚く、自分しか読めないように書くこと。リストラ対策。
0082名無しさん@お腹いっぱい。2014/11/27(木) 18:27:07.18
それは辞めたくなったときに困る
0083名無しさん@お腹いっぱい。2014/11/27(木) 19:50:57.59
>>81から>>82でなんか笑った
0084名無しさん@お腹いっぱい。2014/11/28(金) 00:13:06.85
>>80
書いた「つもり」だからだろ
0085名無しさん@お腹いっぱい。2014/11/28(金) 00:35:46.31
数年たちゃ腕もあがるだろうから当時の綺麗でも今の汚いなんだろうな
0086名無しさん@お腹いっぱい。2014/11/28(金) 05:41:19.53
こういっちゃなんだが何年経とうが、何日経とうが
シェルスクリプトに問題が出て治す必要があるなら
最初から書いた方が良いよ、、その時の実力で
最良のものが書ける。
1度書いた流れなら数年経っても頭に残ってるから
高速で仕上がるし、できた物を比べても大した違いは無い事も多い。

駆け出しの頃の書き物はまったく変わるのかもしれないが
それはそれで、全く変わらないと困るだろ。
過去の駄作に手をいれてジタバタしたって無駄
0087名無しさん@お腹いっぱい。2014/11/28(金) 08:44:15.84
使い捨てのつもりだったのに、長期にわたって使われた上に
「これこういう風に変えられない?」とか言われて白目になったことはある。
もちろん一般化できる話じゃないとは思うけど。
0088名無しさん@お腹いっぱい。2014/11/28(金) 12:08:04.77
改行って^Mですよね?
echo "1^M2"で2しか表示されません何故ですか?
echo "1\r2"もそうでした
echo "1\n2"はちゃんと改行されて1と2が表示されました

^M \r \nってどう使い分けるものですか?

^MはCTRL+V CTRL+Mで入力しました
0089名無しさん@お腹いっぱい。2014/11/28(金) 12:22:58.74
\rと^Mは同じでCR。
\nと^Jは同じでLF。
CRとLFの違いは自分で調べろ。
0090名無しさん@お腹いっぱい。2014/11/28(金) 12:35:54.36
CRはコンデンサと抵抗による時定数回路、
LFは低周波であることはわかりましたが、
そこから先がわかりません、よろしく女教授ください。
0091名無しさん@お腹いっぱい。2014/11/28(金) 12:50:56.72
>>90
CRとLFやタブストップなどは
機械式タイプライター由来なので、一度現物を見れば忘れない
ヤフオクで1000円くらいで手に入るから買ってみるといいよ
私女だけど
0092名無しさん@お腹いっぱい。2014/11/28(金) 13:03:16.65
Macのテキストファイルの改行コードは CR ひとつなんだっけ
0093名無しさん@お腹いっぱい。2014/11/28(金) 13:54:56.36
OSによって開業コード違いますよね。
Linuxは0xJで改行、BSDは0xMで改行しますよね。
どうしてこういう違いができたんでしょう?
簡単に返還する方法はありますか?
0094名無しさん@お腹いっぱい。2014/11/28(金) 14:34:44.34
dos2ux
これってHP依存コマンドだっけ?
0095名無しさん@お腹いっぱい。2014/11/28(金) 14:46:02.61
>>93
ある
ちょっとは調べろよ
0096名無しさん@お腹いっぱい。2014/11/28(金) 15:13:15.53
>>95
改変コピペにかまうな
0097882014/11/28(金) 20:10:29.27
CRだと最後の文字しか表示しないってことですか?
例えば
a<CR>
b<CR>
だったらbしか表示されないってことですか?
0098名無しさん@お腹いっぱい。2014/11/28(金) 20:11:01.93
aを表示した後に行頭に戻ってbを表示している
0099名無しさん@お腹いっぱい。2014/11/28(金) 20:12:58.92
http://ja.wikipedia.org/wiki/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89
http://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%AA%E3%83%83%E3%82%B8%E3%83%BB%E3%83%AA%E3%82%BF%E3%83%BC%E3%83%B3
この辺の話ね。
0100名無しさん@お腹いっぱい。2014/11/28(金) 20:20:08.06
CRだとQを上げられないから、ボルフォロで正帰還かけるか、LCRにするべきだな。
0101名無しさん@お腹いっぱい。2014/11/28(金) 20:30:52.68
>>92
組み込みでもCR改行の場合がある。
LFで良いだろうぜぇ…といつも思うわ
0102名無しさん@お腹いっぱい。2014/11/28(金) 21:00:51.14
なんでこんな反応してんの?
0103名無しさん@お腹いっぱい。2014/11/28(金) 21:47:52.95
反応したら行けない理由は?
>>102に許可が射るのか?
0104名無しさん@お腹いっぱい。2014/11/28(金) 22:03:40.21
改行コードは初心者のころに誰でも一度は通る道だからねえ
その次に通る道はBOM…だったけど最近はWindows触ってないから今どうなってるのか分からん
0105名無しさん@お腹いっぱい。2014/11/28(金) 22:38:41.11
>>102
こんな反応じゃダメ?
0106名無しさん@お腹いっぱい。2014/11/28(金) 23:06:22.07
少し前に某サイトの解析スクリプト作ったときちょっと改行が面倒だった
HTMLはWindowsで作ってるらしくgrepとsedで抽出したあとCRのごみがついてることに気がついた
なのでCR削除したんだけどsambaで共有してるディレクトリに置いていたファイルを
メモ帳で開くことがあってまたぐちゃぐちゃに、まあTeraPadとかで開けばいいんだけど
環境に依存してしまうので再度CRくっ付けて解決したな
0107名無しさん@お腹いっぱい。2014/11/28(金) 23:11:48.20
改行法師ンフフ
0108名無しさん@お腹いっぱい。2014/11/28(金) 23:48:34.23
Macの標準がCRなんだよね
01091022014/11/29(土) 00:39:08.93
質問内容稚拙だったり、回答後に更に質問したり、
そのあたりから定期的に張られる改変コピペだろうと思っただけなんだが
今回やたらみんな親切だから気になっただけだ
0110名無しさん@お腹いっぱい。2014/11/29(土) 00:48:29.81
いまのとこ改変コピペっぽいのは>>93だけだな
0111名無しさん@お腹いっぱい。2014/11/29(土) 01:05:04.71
改変コピペって・・・いつもこのスレに張り付いてんのかよ
■ このスレッドは過去ログ倉庫に格納されています