トップページunix
1001コメント312KB

シェルスクリプト総合 その19

■ このスレッドは過去ログ倉庫に格納されています
0001シェルスクリプトライター2011/12/10(土) 20:06:40.38
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。

□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
 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でそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

前スレ
シェルスクリプト総合 その18
http://hibari.2ch.net/test/read.cgi/unix/1308195527/

次スレは >>970 で。
0538名無しさん@お腹いっぱい。2012/03/16(金) 07:43:40.34
>>537
freebsd の /bin/sh で動いたが
0539名無しさん@お腹いっぱい。2012/03/16(金) 07:54:03.72
>>538
>>1
>FreeBSDユーザは/bin/shの正体がashなので注意。

それより、GCMの計算が間違ってるので結局ダメ
0540名無しさん@お腹いっぱい。2012/03/16(金) 07:54:54.99
>>536
posix 互換の /bin/sh なら実装してるんじゃね $((expression))
http://pubs.opengroup.org/onlinepubs/009695399/toc.htm
0541名無しさん@お腹いっぱい。2012/03/16(金) 10:00:20.84
>>537
Solarisも/bin/shはkshになっちゃいましたよ、おじいちゃん
0542名無しさん@お腹いっぱい。2012/03/16(金) 10:02:48.59
gcdだけ作って秋田。
gcd()
{
local a b r

if [ $1 -gt $2 ]; then
a=$1; b=$2
else
a=$2; b=$1
fi

r=$(( $a % $b ))
[ $r -eq 0 ] && { echo $b; return; }

gcd $b $r
}
0543名無しさん@お腹いっぱい。2012/03/16(金) 10:09:40.85
>>541
なってねーよ。嘘書くな。
0544名無しさん@お腹いっぱい。2012/03/16(金) 10:37:43.03
>>543
なってるよ。おじいちゃん用のshは/usr/sunos/bin/shに隠居しました。
0545名無しさん@お腹いっぱい。2012/03/16(金) 10:41:42.83
>>544
なってないよ。
opensolaris ≠ solaris

あと、pdkshになってるopensolarisだとしても、
「正体はkshだから注意」ということで/bin/shのお題の回答としては不正解。
0546名無しさん@お腹いっぱい。2012/03/16(金) 10:54:47.13
ぷぷぷ
0547名無しさん@お腹いっぱい。2012/03/16(金) 10:59:30.51
Solarisなんていつまであるんだろうなぁ。
0548名無しさん@お腹いっぱい。2012/03/16(金) 11:18:01.21
$((expression))がサポートされてなければexprに書き換えれば
すむ事だから大した問題じゃないよね。
多分、/bin/shってお題はcsh使うなカスって意味だろうね。

おじいちゃんはこんなところで重箱の隅つついてないで、外へで
てゲートボールのエースでも目指した方がいいよ。
0549名無しさん@お腹いっぱい。2012/03/16(金) 11:18:28.78
gcd(){
i=$1
while [ $(($1%i+$2%i)) -ne 0 ];do i=$((i-1)); done
echo $i
}

g=$1
l=$1
while [ $# -gt 1 ]; do
shift
g=`gcd $g $1`
l=$((l*$1/`gcd $l $1`))
done
echo gcd=$g lcm=$l
05505262012/03/16(金) 11:44:30.22
>>548
>多分、/bin/shってお題はcsh使うなカスって意味だろうね。

違います。従来からの/bin/shを使えという課題です。

>大した問題じゃないよね
それでは課題として点がもらえません。
大した問題かどうかは関係なく、課題通りの答が必要です。

引続き回答をお願いします。
表示形式も含めて課題です。
0551名無しさん@お腹いっぱい。2012/03/16(金) 12:16:37.52
User Environment Feature Changes - Transitioning From Oracle Solaris 10 to Oracle Solaris 11
http://docs.oracle.com/cd/E23824_01/html/E24456/userenv-1.html
0552名無しさん@お腹いっぱい。2012/03/16(金) 12:19:43.22
あらkshからbashになったのね。> Oracle Solaris 11の/bin/sh
05535262012/03/16(金) 12:23:58.00
私の為に争わないでください
課題の回答だけお願いします
0554名無しさん@お腹いっぱい。2012/03/16(金) 12:24:33.25
>>552
えっと……どこをどう読めばそうなるのかとても不思議
0555名無しさん@お腹いっぱい。2012/03/16(金) 14:29:31.51
>>553
ちったぁ自分で考えろ
0556名無しさん@お腹いっぱい。2012/03/16(金) 14:45:01.99
>>552
> The default shell, /bin/sh, is now linked to ksh93. The default user shell is the Bourne-again (bash) shell.

the default user shell ってのは useradd したときのデフォルトとかの意味だろうね。
/bin/sh は ksh93 だ。
05575262012/03/16(金) 14:45:06.16
時間が無い。早くしてください。
来週の月曜の朝10時までにお願いします。
過程とか不要です。答えだけ書いてください。

もし回答以外のことも書きたい場合はスクリプトを*で囲って
目立つようにしてください

書き方の例を示します

****************************
a = 3
x + y = 5
****************************
0558名無しさん@お腹いっぱい。2012/03/16(金) 14:46:05.73
今それどころじゃないからちょっと黙ってて。
0559名無しさん@お腹いっぱい。2012/03/16(金) 14:51:59.23
ここまで、
「宿題は自分でやれ」
「来年はちゃんと講義聞こうな」
なし
0560名無しさん@お腹いっぱい。2012/03/16(金) 15:38:56.29
分からない人は黙っててください
0561名無しさん@お腹いっぱい。2012/03/16(金) 18:41:04.43
>>560
それって、お前も黙らなきゃいけないんじゃないか?
0562名無しさん@お腹いっぱい。2012/03/16(金) 18:44:07.77
すべて分かった上で言ってるんだよ。
0563名無しさん@お腹いっぱい。2012/03/16(金) 18:45:05.35
****************************
#! /bin/bash

set -e

function gcd() {
local -i i j
for ((i="$1";; i--)); do
for j in "$@"; do
((j % i != 0)) && continue 2
done
echo "$i"
return
done
}

function lcm() {
local -i i=1 j
for j in "$@"; do
((i *= j / "$(gcd "$i" "$j")"))
done
echo "$i"
return
}

printf "GCM = %d\nLCM = %d\n" "$(gcd "$@")" "$(lcm "$@")"
****************************
空気を読んで? bashで。
大学生はもう春休みなはずだが、実習?
それともこれだけできれば単位が貰える系か?
# 今年は進級できるかなあ、自分。
0564名無しさん@お腹いっぱい。2012/03/16(金) 18:47:50.70
>>563
だからぁ、bashじゃ駄目だっておっしゃってますが・・
0565名無しさん@お腹いっぱい。2012/03/16(金) 21:19:30.14
>>548
> $((expression))がサポートされてなければexprに書き換えれば
> すむ事だから大した問題じゃないよね。
letは使えないの?
0566名無しさん@お腹いっぱい。2012/03/16(金) 21:21:16.68
もうできてる人が何人もいるんです

3/19の10:00まで待つと書きましたが、前倒して3/17の16:30までとします

>>557 にあるフォーマットでお願いします
0567名無しさん@お腹いっぱい。2012/03/16(金) 21:22:56.00
>>565
もちろんletも使えない。
0568名無しさん@お腹いっぱい。2012/03/16(金) 21:41:50.80
>>563
最大公約数求めるのに引数デクリメントしながらすべて割って試すとか
総当たりの非効率アルゴリズム使ってボケるんなら、
最小公倍数でもインクリメントしながら順番に割って総当たりするアルゴリズムで
ボケるべき。
0569名無しさん@お腹いっぱい。2012/03/16(金) 21:49:10.39
つか, /bin/sh って言ってる奴いるけど, どの時点でどの機能が入った
/bin/sh まで許せるんだ?

FreeBSD の ports で拡張機能すべて許可した v7sh では func(){}
すら Syntax error なんだが...

# 少なくとも ``#!/usr/bin/env bash'' くらいにしないと販促だ >>563
0570名無しさん@お腹いっぱい。2012/03/16(金) 21:54:56.85
>>566
バカ共の相手が面倒になったので締め切りました。



やっぱりバカしか居ないんだな。
0571名無しさん@お腹いっぱい。2012/03/16(金) 22:25:57.27
なりすまし多いね
0572名無しさん@お腹いっぱい。2012/03/16(金) 22:27:13.29
>>557
できたよ。GCMとLCMの計算方法が対称的になるようにしたよ。
/bin/sh純正だ。アルゴリズムはウケ狙いだけどな。


#!/bin/sh

GCM=$1
while :; do
for i in "$@"; do
if [ `expr "$i" % "$GCM"` != 0 ]; then
GCM=`expr "$GCM" - 1`
continue 2
fi
done
echo GCM = "$GCM"
break
done

LCM=$1
while :; do
for i in "$@"; do
if [ `expr "$LCM" % "$i"` != 0 ]; then
LCM=`expr "$LCM" + 1`
continue 2
fi
done
echo LCM = "$LCM"
break
done
0573名無しさん@お腹いっぱい。2012/03/16(金) 22:28:07.31
自演も多いよ
0574名無しさん@お腹いっぱい。2012/03/16(金) 23:17:57.60
本人です

3/17 17:00までに提出しないと単位が足りなくなるのが分かったので質問してます

レポートに貼り付けるのは私がしますので、3/17の16:30までにお願いします
また他の皆さんについても、ソースにバグがないかどうか、早急なチェックとデバッグを
期待しています

>>557 にあるフォーマットでお願いします
0575名無しさん@お腹いっぱい。2012/03/16(金) 23:25:20.31
そろそろ飽きたわ。もう十分釣れただろ
0576名無しさん@お腹いっぱい。2012/03/16(金) 23:37:15.49
ていうかもうできてんじゃないの?確かめてないけど
0577名無しさん@お腹いっぱい。2012/03/16(金) 23:39:45.15
編集前ディレクトリと編集後ディレクトリを比較して、
変更がないファイルを編集後ディレクトリから削除する
シェルスクリプトを書こうとしています。

diffをディレクトリ同士で実行し同名ファイルを探し
その同名ファイルをdiffし返値が空なら削除という操作を
再帰的に階層を掘って実行すれば良いと思うのですが、
どうも何から書けばいいのか詰まってしまいました。

奇特な方居ましたらアドバイスお願いします。
0578名無しさん@お腹いっぱい。2012/03/16(金) 23:45:20.44
>>577
まず、man diffをちゃんと嫁
0579名無しさん@お腹いっぱい。2012/03/17(土) 00:14:42.67
>>578
オプションよく読んでいませんでした。
読んで出直してきます。ありがとうございました。
0580名無しさん@お腹いっぱい。2012/03/17(土) 05:25:42.88
>>577
目的に対する作業の方法が間違ってる気がする。

何のために「編集前ディレクトリと編集後ディレクトリを比較して、
変更がないファイルを編集後ディレクトリから削除する」のか
を書いた方が、適切な答えが帰ってくると思う。
0581名無しさん@お腹いっぱい。2012/03/17(土) 07:12:42.07
>>577
ひな形っぽいもの。階層が一つだけだからヒントにしかならんだろうけど。変数は出鱈目。
やりたいことのイメージは、こんなもんでしょ?

# mkdir /tmp/mae
# mkdir /tmp/ato
# MAE=/tmp/mae
# ATO=/tmp/ato
#
# touch $MAE/aaa
# touch $MAE/bbb
# cp -p $MAE/aaa $ATO/
# echo hoge > $ATO/bbb
#
# cd $ATO
# for ii in `ls`
> do
> [ -f $MAE/$ii ] && diff $ii $MAE > /dev/null 2>&1
> [ $? = 0 ] && rm $ii
> done
#
# ll $ATO
bbb

ちなみに HP-UX で検証。
ls > tmp.txt して while read LINE; do〜done < tmp.txt とか LINE=`head $NUMBER tmp.txt | tail -1` でも目的だけは達成できる感じ。
05825262012/03/17(土) 07:30:38.91
>>572 さんありがとうございます。/bin/sh命令のみですね。
これで提出します。
0583名無しさん@お腹いっぱい。2012/03/17(土) 15:36:57.64
>>572
こんなバカみたいな総当たりはダメだって言われちゃいました
もっと数学的な解法をアルゴリズム化したものでないとダメです
結果が正しければいいってレベルじゃないんです
100万とか1000万とか、それ位大きな値になると、ちっとも終わらないじゃないですか

期限は今日の16:40までとします

くれぐれもよろしくお願いします
0584名無しさん@お腹いっぱい。2012/03/17(土) 16:12:07.29
>>583
できたよ。100万でも1000万でも、正しく実行すればすぐ終るよ。

#!/bin/sh

while :; do
echo -n 'Enter GCM = '; read GCM
for i in "$@"; do
[ `expr "$i" % "$GCM"` != 0 ] && { echo 'Try again'; continue 2; }
done; break; done
echo GCM = "$GCM"

while :; do
echo -n 'Enter LCM = '; read LCM
for i in "$@"; do
[ `expr "$LCM" % "$i"` != 0 ] && { echo 'Try again'; continue 2; }
done; break; done
echo LCM = "$LCM"
0585名無しさん@お腹いっぱい。2012/03/17(土) 22:26:32.20
>>577
LANG=C diff -qrs a b の出力結果でなんとかする
というかバージョン管理システムを使うのが良い気がする
0586名無しさん@お腹いっぱい。2012/03/19(月) 12:31:35.64
A=*.txt
B=$A
touch $B

とすると、"*.txt"というファイルが出来てしまうんですが
これ$Bを展開させたいときはどうすればいいんですかね
0587名無しさん@お腹いっぱい。2012/03/19(月) 12:40:39.27
>>586
本当に >>586 のとおりに実行したのなら *.txt は展開される。
展開されないのはカレントディレクトリに *.txt にマッチするファイルがないから。
すでにファイルがなければ展開しようがない。
05885862012/03/19(月) 12:56:05.81
>>587
ヒントありがとうございます

oppai.txt がある場合⇒ oppai.txtにタッチ
oppai.txt がない場合⇒ *.txt を作成

という動きになりました
まーこれはこれで使い物になりませんわ
0589名無しさん@お腹いっぱい。2012/03/19(月) 13:11:29.40
存在をチェックしてからtouchすればいいじゃない。
0590名無しさん@お腹いっぱい。2012/03/19(月) 13:13:49.05
>>588
もし「存在しなければ作成したくない」という意図なら、

touch -c $B で桶。
0591名無しさん@お腹いっぱい。2012/03/19(月) 13:45:15.79
>>586
エスパーすると、

A=*.txt
B=$A
mv $A /どこか
touch $B

みたいなことをやりたいのでは?

それなら、
A=`echo *.txt`
mv $A /どこか
touch $A

で桶。変数はAだけでよい。
05925862012/03/19(月) 14:20:52.93
>>590
天才や・・・ UNIX板には天才がたくさんいる
みんなありがとう
0593名無しさん@お腹いっぱい。2012/03/19(月) 14:28:02.20
いや、みんなは普通だよ。
0594名無しさん@お腹いっぱい。2012/03/19(月) 15:43:16.30
>>591のアホさが光るな。
0595名無しさん@お腹いっぱい。2012/03/19(月) 15:45:13.28
>>586
これなんでBをはさんでるの?
0596名無しさん@お腹いっぱい。2012/03/19(月) 17:56:07.30
おそらく A=*.txt で *が展開されなかったから
Bに代入し直せば再解釈されて展開されると勘違いしたのだろう
0597名無しさん@お腹いっぱい。2012/03/19(月) 19:53:24.01
結局、どこで展開されたんだろうね
0598名無しさん@お腹いっぱい。2012/03/19(月) 19:56:34.87
ん? A=*.txt でも B=$A でも 変数直接代入時は展開されないよ。
touch $B みたいにクォートなしで参照した時に初めて展開される。
05995862012/03/19(月) 19:58:57.99
>>598
ありがとう。それだけが心残りだったんだ
0600名無しさん@お腹いっぱい。2012/03/19(月) 20:04:56.95
shを作ったBourneは天才だね。
0601名無しさん@お腹いっぱい。2012/03/19(月) 20:08:20.98
あのソースコードは勘弁して欲しい。
0602名無しさん@お腹いっぱい。2012/03/19(月) 21:12:40.16
ソース読んだのか あんたスゲーや
0603名無しさん@お腹いっぱい。2012/03/19(月) 22:06:26.63
ソースコードつーか、これな。
ttp://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.h
0604名無しさん@お腹いっぱい。2012/03/20(火) 08:01:57.14
http://x68000.q-e-d.net/~68user/unix/pickup?keyword=test&target=command
のサイトに、
#!/bin/sh
read input
if [ $input = 'q' ]; then
echo QUIT
fi
と言うシェルスクリプトを参考に
if [ "$input" = 'q' ]; then
と $input をダブルクォートで囲めばよい。しかしまだ落とし穴はある。たとえば "!" を入力すると、
[: =: unexpected operator
とまたしてもエラーになってしまう。これは "$input" が "!" であるため、
if [ ! = 'q' ]; then
として扱われたからだ。
ってありますけれど、何度!を入力しても、
[: =: unexpected operator
って表示されません。
それに、
$ test !c = 'q' ; echo $?
test cd /etc = 'q' ; echo $?
test: too many arguments
とエラーが表示されます。
どのような解釈をすると、!cがtest cd /etcに置換されるのでしょうか?
0605名無しさん@お腹いっぱい。2012/03/20(火) 09:04:17.23
> [ ! = 'q' ]
これはそのように解釈するtestもあるから注意しろ。くらいでいいと思う。

> どのような解釈をすると、!cがtest cd /etcに置換されるのでしょうか?
ヒストリ置換だろ。
0606名無しさん@お腹いっぱい。2012/03/20(火) 17:36:56.09
>>605
今の時代、そのエラーが出るshを使っている人、いるのかね?
0607名無しさん@お腹いっぱい。2012/03/20(火) 17:41:15.64
今の時代、
[ ! = ! ]
[ [ = [ ]
[ ] = ] ]
[ = = = ]
[ -f = -f ]

など、すべて文字列の比較として期待通りに動作する
0608名無しさん@お腹いっぱい。2012/03/20(火) 17:51:22.47
しかし未だに [ x"$hoge" = x"yes" ] などと書いてる人を見掛けるな
#!/bin/bashとか書いてるのに
0609名無しさん@お腹いっぱい。2012/03/20(火) 19:57:58.15
スクリプトインジェクション対応だよ
0610名無しさん@お腹いっぱい。2012/03/20(火) 21:45:56.60
[ "$hoge" = yes ] だとして具体的にどうインジェクトするんだよ
0611名無しさん@お腹いっぱい。2012/03/20(火) 23:34:08.60
>>610
0612名無しさん@お腹いっぱい。2012/03/21(水) 09:04:25.40
>>611
どうインジェクションするか解説お願いします
0613名無しさん@お腹いっぱい。2012/03/21(水) 10:08:32.37
hoge=']; /bin/sh;'
0614名無しさん@お腹いっぱい。2012/03/21(水) 10:47:17.62
ってゆーか、こういう場合は

case "$hoge" in
yes) ...;;
esac

って書くよね、ふつー。[Yy][Ee][Ss] なんかに変えるのも簡単だし。
0615名無しさん@お腹いっぱい。2012/03/21(水) 11:14:27.91
>>613
>>610はダブルクオートで囲ってるから、[コマンドの第一引数として$hogeの中身が渡るんで、そのhogeの値はそのまま[コマンドが解釈する。
どうあがいてもインジェクションなんて無理だと思うんだが。
0616名無しさん@お腹いっぱい。2012/03/21(水) 11:26:14.79
てきとーに言ったんだろ。
もうカンベンしてやれ。
0617名無しさん@お腹いっぱい。2012/03/21(水) 12:19:06.39
本人乙
0618名無しさん@お腹いっぱい。2012/03/21(水) 13:26:55.78
違うよ。
0619名無しさん@お腹いっぱい。2012/03/21(水) 13:38:09.35
最近のJavaScriptのようにeval使いまくりで威張る奴か。
0620名無しさん@お腹いっぱい。2012/03/21(水) 14:28:05.05
>>619
座布団
0621名無しさん@お腹いっぱい。2012/03/21(水) 15:37:01.15
全部持ってって〜
0622名無しさん@お腹いっぱい。2012/03/21(水) 19:24:26.73
>>606
$ busybox ash
$ hoge=!
$ if [ "$hoge" = 'q' ]; then echo QUIT; fi
ash: q: unknown operand
0623名無しさん@お腹いっぱい。2012/03/21(水) 22:56:44.16
https://uec.usp-lab.com/SHELL_TIPS/CGI/SHELL_TIPS.CGI?POMPA=TIPS_not_while

>シェルスクリプトに制御構文が増えることを極力避けるように様々な工夫をしている。
>制御構文を避ける理由はコードが読みにくくなるためだ。
>これまで制御構文whileやforのはずし方について書いてきた。
>処理速度を高速化するためにwhileやforをコマンドに置き換えるというのは、
>それなりの効果が期待できる方法だ。
>シェルスクリプトに制御構文であるforやwhileが出てきたら、
>何か避ける方法がないか探してみるとより高速なスクリプトが書けるようになるかもしれない。
ってかいてあって、いろんな例が書いてあったり、
変なパッケージ(python製)を入れて、そのコマンドを使ったりしてるんですね。
僕は制御構文外すと逆に可読性がおちたり、
pythonで書かれたコマンドを呼び出すより、シェルスクリプトで制御構文書いた方が
早いと思うんですけど、おかしいですかね?
0624名無しさん@お腹いっぱい。2012/03/21(水) 23:01:45.31
質問です。

以下のようなファイルがあるとします。
-----------------
1. aaa hello
2. bbb
3. ccc
4. ddd hello
5. ddd hello
6. eee hello
-----------------
このファイルの2行目から5行目に限定して、helloをgood byに変更したいです。
どのようなやりかたがありますでしょうか?
sedを使えばいいのかなと思うのですが。。

0625名無しさん@お腹いっぱい。2012/03/21(水) 23:09:05.42
お前はマニュアル読むという事を考えたことが無いのか?
0626名無しさん@お腹いっぱい。2012/03/21(水) 23:34:20.22
>>624
うん、sedの超基本的な使い方で出来る
0627名無しさん@お腹いっぱい。2012/03/21(水) 23:34:53.13
sedを使えばいいと思うよ

0628名無しさん@お腹いっぱい。2012/03/21(水) 23:41:30.82
>>623
そのページを見て思ったことは、xargsは便利だね、くらい
0629名無しさん@お腹いっぱい。2012/03/22(木) 00:58:20.98
>>623
シェルスクリプトに限らず、プログラム書く時に(一部の)制御構文を使わないってのは個人的に良くやる。効率とか性能とか抜きで。
ゲームの縛りプレイみたいなもんだけど、意外なテクニックを発見したりできて楽しめるよ。おすすめ。
上司や同僚に見つかったら>>623のサイトみたいな適当なウンチクで誤魔化せばOK。

0630名無しさん@お腹いっぱい。2012/03/22(木) 01:14:19.58
>>624
sed で 2行目から5行目は 2,5。
hello を good byに置換するには s/hello/good by/
接続すると 2,5s/hello/good by/
0631名無しさん@お腹いっぱい。2012/03/22(木) 02:23:18.01
>>629
BASICのころはあったけどな。
if文分岐とかで速度差が出ないようにするとかで。
今はそういうのする必要ないけど。
0632名無しさん@お腹いっぱい。2012/03/22(木) 08:22:33.32
PerlやC#、COBOL、Fortran、アセンブリなんかも、見慣れてなければ読みにくく
感じるものさ
0633名無しさん@お腹いっぱい。2012/03/22(木) 08:28:41.72
Whitespaceもな。
0634名無しさん@お腹いっぱい。2012/03/22(木) 09:18:49.18
俺はsedが嫌いなので、できるだけperlを使うようにしている
0635名無しさん@お腹いっぱい。2012/03/22(木) 09:56:14.04
それは報告しなくてもいいです。
0636名無しさん@お腹いっぱい。2012/03/22(木) 11:24:16.01
kshで待ち行列を作りたいんですが、どうしたらいいでしょう?

基本動作はキューなんですが、
1 2 3
↓1を実行
2 3

1 2 3
↓2を実行
1 3
としたいです

unset 配列[N]でインデックスを詰めてくれればこんなの楽勝なのに…
0637名無しさん@お腹いっぱい。2012/03/22(木) 11:37:02.12
>>636
ファイルにしたらいい
■ このスレッドは過去ログ倉庫に格納されています