トップページ⇒linux
988コメント336KB

シェルスクリプト総合@LINUX Part3

■ このスレッドは過去ログ倉庫に格納されています
0001login:Penguin2007/07/10(火) 23:17:13ID:qGthZdME
UNIX板のスレを見ている方も多数おられるかと思いますが、
まあそれはそれとして、BASHウゼーとか言われる心配なく
平和にLINUX的スクリプト談義しましょうよ。

初めての自作スクリプト、自信ないから見てください。な初心者から
トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで
いろいろな人に参加して頂けると嬉しいです。

perlやらPythonやらの話が混ざっても良いんでない?

【sed】シェルスクリプト総合@LINUX Part2【awk】
http://pc11.2ch.net/test/read.cgi/linux/1154578200/
http://pc8.2ch.net/test/read.cgi/linux/1121994321/

>>2-5あたりに色々と。
0583login:Penguin2008/02/08(金) 08:15:13ID:D8JF1iVI
では、headとtailは使わずに。
sed -n '5,$p' file.txt | tac | sed -n '5,$p' | tac

…意義が見出せない。。。
05845812008/02/08(金) 15:35:34ID:aAYt8gpF
>>583
sedは習ってないので提出できないんですよ
他にないですか?
0585login:Penguin2008/02/08(金) 15:38:14ID:Yg3sGZTq
>>584
白紙で出せば...
0586login:Penguin2008/02/08(金) 16:08:13ID:z5e2UbEF
{ read a;read a;read a;read a;tac; } | { read a;read a;read a;read a;tac; }
0587login:Penguin2008/02/08(金) 16:57:33ID:rygBoGE6
習っていないと使えないって、そんな小学校じゃあるまいし
0588login:Penguin2008/02/08(金) 19:53:27ID:8gRlFmfx
>sedは習wwwwってwwないのwwwで提出でwwきないんですよww
>他になwwwwいですか?www
のように、wを適当にまぶすスクリプトを誰か考えてくれ。
0589login:Penguin2008/02/08(金) 21:34:44ID:Z8wDJkcZ
>>588
こんなwwのを作っwwwwてみたんwwだがww
どうだろうかwww
とりあえずwwwwちゃんwwと動いてるよwwうだがwwww
どんな例外wwがあるwwかわからんwww

#!/bin/sh

CHAR='w'

insertw() {
i=0
w=`expr $RANDOM % 3 + 2`
while [ $i -lt $w ]; do
i=`expr $i + 1`
echo -n $CHAR
done
}

while read LINE ;do
while [ "$LINE" ]; do
r=`expr $RANDOM % 6 + 2`
echo -n `echo $LINE | cut -c -${r}`
insertw
r=`expr $r + 1`
LINE=`echo $LINE | cut -c ${r}-`
done
echo ""
done
05905892008/02/08(金) 21:45:59ID:Z8wDJkcZ
初心wwww者でサーセンww
$RANDwwwwOM使wwってるのwwwで本wwww当のshではww動かなwwwいはずだけど,wwwここはwwLinux板wwwってことwwwで許wwwwしてもらえるwwよね?
0591login:Penguin2008/02/09(土) 21:05:58ID:sA/Tx79N
あの〜、正規表現についてお聞きしたいのですが
[a-z]で小文字のアルファベット全てにマッチですよね。
ならば
[あ-ん]でひらがな全てにマッチしますか?
0592login:Penguin2008/02/09(土) 21:44:35ID:y7ESpv1X
yes
0593login:Penguin2008/02/10(日) 00:32:01ID:HzElnwAK
「ぁ」はマッチしないのでは?

それはそうと、多バイト文字の正規表現って、大抵のアプリケーションで普通に使えるものなのか。
知らなんだ。
0594login:Penguin2008/02/10(日) 01:02:27ID:bq0IfXwT
質問です。ファイルの対象部分に別のファイルを挿入するコマンドってありますか?

% cat file1
aaa%sbbbccc
% cat file2
ZZZ
% hoge %s file2 < file1
aaaZZZbbbccc

のような動作を期待しています。

挿入するファイルは少し長めなのでsedで置換ではできない気がしています。

awkあたりでfile1を%sが出るまで出力 -> file2を出力 -> file1の%s以降を出力
という方法を考えていますが、もし専門のコマンドがあれば教えてください。
05955942008/02/10(日) 01:12:39ID:bq0IfXwT
誤爆先でm4というのを教えてもらいました。
一旦使ってみます
0596login:Penguin2008/02/10(日) 01:14:06ID:AyxHcvsn
そういうのはエディタで
0597login:Penguin2008/02/10(日) 01:52:24ID:EflaE009
>>595
おまえFedoraすれにいなかったか?
0598login:Penguin2008/02/10(日) 06:29:30ID:7q9QRaK3
>>594
printf "`cat file1`\n" `cat file2`
0599login:Penguin2008/02/11(月) 23:47:20ID:wSzjm7y4
>>593
grep でやってみたらマッチしやがったよ。
0600login:Penguin2008/02/12(火) 02:36:00ID:NhGbxXsu
文字列として検索できるということと、
全角文字も一文字として扱える、というのとでは意味がぜんぜん違う。
0601login:Penguin2008/02/13(水) 03:57:10ID:Z8x6psMH
[あ-ん]と[\xe4\x1c-\xe4\x5f]ではまるで別物だしな(コードは適当)
0602login:Penguin2008/02/13(水) 23:44:52ID:3LjmFUst
#スレ違いだが。
MS-Windowsとの可搬性に最も富むスクリプトは何ですか?
ただし、cygwin環境とperlは除外して。
0603login:Penguin2008/02/13(水) 23:58:15ID:jHUDsaVW
>>602
javascriptに一票
0604login:Penguin2008/02/14(木) 00:56:22ID:axFZQkw/
>>602
awk,ruby,Python つーかなんでperlダメなの?
たしかにWinのperlめんどいけどね。
0605login:Penguin2008/02/14(木) 20:13:50ID:oi3zsBt5
ディレクトリにあるmp3ファイルを1行に3つずつ番号付きで表示して
指定されたファイルを再生するスクリプトを考えてみました。
これだとファイル表示の見た目がいまいちなんですが、カラムを揃えて
表示するようなうまいやり方はありますか?
i=1
for file in *.mp3
    do
        #3カラムで出力する
        x=`expr $i % 3`
        if [ $x -eq 0 ]
            then echo -e "\033[1;31m$i\033[0m.$file"
        else
            echo -en "\033[1;31m$i\033[0m.$file "
        fi
        a[i]=$file
        (( i=i+1 ))
    done
echo -n "number? >"
read n
if [ -f "${a[n]}" ]
    then mplayer "${a[n]}"
else
    echo "ファイルがありません"
fi
0606login:Penguin2008/02/14(木) 21:53:57ID:gBoeKdqH
>>605

#!/bin/sh
FS=`zenity --file-selection`
#このままだと動画なんかもいけるけど、どうしても*.mp3のみにしたい場合は↑行を
#コメントアウトして↓行を有効にする
#FS=`ls *.mp3 | zenity --list --column "Files"`
if [ -z "${FS}" ]
then
 exit
fi
mplayer "$FS"

なんつってってねw
0607login:Penguin2008/02/14(木) 22:01:12ID:vsXOhty3
zenityってなんだろーと思ってググったら……反則すぎ。
0608login:Penguin2008/02/14(木) 22:52:41ID:fZu2vsjD
>>604
perl.exeの他に色々MS-Windows側に入れなきゃならないものがあるので可搬性に欠けるという理由を考えてみましたが、実は嫌いなだけです。

>>605
3列にこだわらないのなら、bashのselectはどうでしょう。
#!/bin/bash
select name in *.mp3
do
  echo "mplayer ${name}"
  #break
done
0609login:Penguin2008/02/15(金) 02:46:55ID:4QUqq28I
>>605
printf で頑張るという選択肢もある。
06106052008/02/15(金) 19:02:00ID:BuE7cyMU
>>605の件ですが、レスしてくれた方々、ありがとうございます。
selectを使うのが簡単でイメージどおりなので、それでいきたいと思います。
0611login:Penguin2008/02/16(土) 14:41:12ID:rUKDlild
久しぶりに来たけど相変わらず
キモいね
0612login:Penguin2008/02/16(土) 14:52:30ID:TWToK0Vy
シェルに閉じこもってるスレですから
0613login:Penguin2008/02/16(土) 15:09:40ID:hFdiJNir
ちょっとは環境変数も気にしろよ
0614login:Penguin2008/02/16(土) 15:14:02ID:TWToK0Vy
export KIMOI=false
0615login:Penguin2008/02/16(土) 15:25:59ID:hFdiJNir
$ export KIMOI=false
> if [ $KIMOI ]; then
> echo kimoi
> else kimokunai
> fi
kimoi

となります.助けてください><
0616login:Penguin2008/02/16(土) 16:57:40ID:TCXFbGKj
釣られてやるが
if $KIMOI; then
0617login:Penguin2008/02/16(土) 19:13:59ID:TWToK0Vy
いやいや、キモイとかキモクナイを超越することこそが答なのだよ。

 export KIMOI=

が正解なのだ。
0618login:Penguin2008/02/17(日) 01:08:38ID:iw9ufgAV
>>615-616
なぜそうなるか素人の私にも解説してくだされぇ〜
0619login:Penguin2008/02/17(日) 01:11:52ID:slw092IT
>>616 素で知らなかった.ありがと!
0620login:Penguin2008/02/17(日) 01:27:34ID:PyTcVmai
/usr/bin/[≒/usr/bin/test
0621login:Penguin2008/02/17(日) 03:00:02ID:tnXxiXa8
>>618

if文やwhile文の条件部に書くのは、実はコマンド。
コマンドの終了コードが0なら条件が成立したとみなされる。
で、true(0を返す)やfalse(1(非0)を返す)というコマンドがあるわけだな。
ちなみに [ もコマンドだ。
0622login:Penguin2008/02/17(日) 09:32:32ID:OGJD7PPY
みんな釣られ過ぎ…
$KIMOIに"false"という文字列を代入してるだけ。
0623login:Penguin2008/02/17(日) 14:07:35ID:4A7UiB6D
>>612
俺らはゴーストですか
0624login:Penguin2008/02/17(日) 14:21:15ID:slw092IT
>>623
ネットは広大だよな
0625login:Penguin2008/02/17(日) 14:29:38ID:uY7SK9GA
>>623
否、貴腐人間かもw
0626login:Penguin2008/02/17(日) 14:38:41ID:slw092IT
>>625
元ネタwkrn
0627login:Penguin2008/02/17(日) 14:42:27ID:uY7SK9GA
>>626 「貴腐老人」でggrks
0628login:Penguin2008/02/17(日) 14:44:26ID:slw092IT
>>627
tnks
0629login:Penguin2008/02/18(月) 07:12:54ID:AGIm4SRV
zenity でファイルの選択をさせるのに、最初に任意のフォルダを開くにはなんと書けばいいのか教えて下さい。
0630login:Penguin2008/02/18(月) 11:55:16ID:VgIMGwkB
カレントディレクトリを開くみたいだから、サブシェルを使ってこんな感じでどうかな
(cd /; zenity --file-selection)
0631login:Penguin2008/02/18(月) 13:16:10ID:AGIm4SRV
>>630
ありがとうございます。
やってみます。
0632login:Penguin2008/02/19(火) 08:50:21ID:90boQwVS
シェルスクリプトを覚えるとなにが出来るようになるんですか?
0633login:Penguin2008/02/19(火) 09:00:32ID:7ADZuvq7
>>632
ルーチンワークで楽できる(場合がある)
0634login:Penguin2008/02/19(火) 16:05:41ID:VrKwqWf/
>>632
作業の自動化や、例えばユーザを100人登録しないといけないとか言う、膨大な作業を
物凄い速度で短時間で終わらせる事が出来るようになるとか。
0635login:Penguin2008/02/19(火) 17:25:49ID:90boQwVS
>>633>>634
ほほぅ、ありがとうございます。
0636login:Penguin2008/02/19(火) 19:54:38ID:oWc/fsPo
ほほうって、コンピュータに仕事をさせるという観念のない人なんだろうか。
高級な紙と鉛筆だとしか思ってなさげな人。たまにいるけど……。
0637login:Penguin2008/02/19(火) 19:56:54ID:7ADZuvq7
魔法の箱だと思ってるよりマシだと思う
0638login:Penguin2008/02/19(火) 23:07:22ID:VrKwqWf/
コンピュータは ある機能を実現させる為の方法(アルゴリズム)を示してやれば
どんなにそれが重労働だろうが難しい計算をしないといけなかろうが、
忠実に高速かつ正確、大量に実行させる事が出来るから凄いよ・・・。

ただし、その仕事の仕方を教える(アルゴリズムを教える)のがかなり苦労するんだけどな・・・。
0639login:Penguin2008/02/20(水) 03:07:58ID:eOYCs3Nz
基本的に人間がやってもできることを高速ですることしかできないということを知らない人が多すぎる
0640login:Penguin2008/02/20(水) 03:37:12ID:Z0UaqwNw
それは、一秒間に3ギガ回も足し算したり、地球の裏側に光の速度で手紙を届けたりなんつーのは
基本的に人間には絶対できない、ということを知らない者は>>639だけだというだけの話かと。
0641login:Penguin2008/02/20(水) 04:33:00ID:H+YlTABW
君も頭悪いな。
639は高速で、と書いてあるんだから、「速度を問わなければ」人間が…と
読むのが妥当という答にしかならないぞ。
どうせそういう突っ込みするなら空間計算量でやればよかったのに。
0642login:Penguin2008/02/20(水) 07:24:32ID:kPfB9gdm
理論ばっかりのたまって生産性の無い人ってよくいるよね。
0643login:Penguin2008/02/20(水) 08:22:42ID:TBsfl6zQ
まとめ。

Q) シェルスクリプトを覚えるとなにが出来るようになるんですか?
A) 理論ばっかりのたまって生産性の無い人ってよくいるよね。
0644login:Penguin2008/02/20(水) 09:09:29ID:s2YtVBn2
>>632
シェルスクリプトでやりたいと思ったこと。
0645login:Penguin2008/02/20(水) 10:22:00ID:0BB6Gw/L
俺は…彼女にパイズリして欲しいな…。
乳はAAだけど orz
0646login:Penguin2008/02/20(水) 10:22:28ID:0BB6Gw/L
>>645
誤爆った。正直スマンかった。
0647login:Penguin2008/02/20(水) 10:47:15ID:VHJ6cFjQ
>>645
基本的に彼女ができないことなのでシェルスクリプトでもできません。
0648login:Penguin2008/02/20(水) 11:22:35ID:eOYCs3Nz
>>647
AAでもいいということなので,アスキーアートでおっぱいを表現することならシェルスクリプトで可能です
さらに最近のターミナルエミュレーターはアンチエイリアスがきいてるのでなめらかですよ
0649login:Penguin2008/02/20(水) 11:31:04ID:Z0UaqwNw
すごいな。>>641は地球の裏側に手紙を届けたりなんてことが「ゆっくりならできる」そうだ。
できるというなら精々一生をかけて歩いて船をこいで手紙を届けにいって、それを証明してほしいものだ。
コンピュータという人間が使うモノが、人間以上の方法(アルゴリズムなどの知性)を知らないのは当然のことだが
最近ではその知性すら、コンピュータを使ったシミュレーション解析などで
得ることが増えているのが現実だったりするわけで。特に知の最先端ほどそうだ。
もはや人類はコンピュータを使わないと新しい知識を得ることすら「できない」状況なんだけどね。
そういう現実が見えない人はやっぱり自分の納得を唯一の判断基準とする文系人かな。
人間は遠くのものが見え、遠くの人と話し、より多くの知識を得、共有できるようになった。
100年前に比べたら、ほんとうに夢の魔法かコミックの世界だ。コンピュータはほんとに魔法の箱みたいじゃないか。
そのセンスは逆にあまり間違っていない気がするけどな。
「高度に進んだ科学技術はもはや魔法と見分けがつかない」アーサー・C・クラーク

0650login:Penguin2008/02/20(水) 12:06:00ID:eOYCs3Nz
>>649
日本語でおk
電報というものがあるんだが最近のゆとりは知らないのか?
0651login:Penguin2008/02/20(水) 12:14:29ID:pg37fRgc
ゆとり言いたいだけちゃうんかと
0652login:Penguin2008/02/20(水) 12:23:41ID:XajlgLxx
ネタはよそでやっとくれよ。
0653login:Penguin2008/02/20(水) 16:28:17ID:vrkF+BtG
このスレの>>640や>>641の意見が興味深い。面白いな・・・。

>>648
そういうシェルスクリプト作って公開してよwwwwぜひ実行してみたい・・w
0654login:Penguin2008/02/20(水) 19:29:13ID:7TuVNRao
先日の芥川賞受賞作が>>649の文章に似てる。
句点から次の句点まで地球半周ぐらいあって、だらだらと続く感じが。
http://sankei.jp.msn.com/culture/academic/080116/
0655login:Penguin2008/02/21(木) 06:19:36ID:FDbXS9I4
>>649
こういう無駄な長文を書ける才能には素直に感心するよ。
0656login:Penguin2008/02/21(木) 12:33:09ID:xpu03eg4
時間を持て余してるんだろ?
0657login:Penguin2008/02/21(木) 18:35:15ID:oj1Q2W6E
ある意味うらやましい知性だ。
0658login:Penguin2008/02/24(日) 10:15:17ID:RUTtO6AQ
slコマンドってなかった?画面いっぱいにSLを表現
あれはシェルスクリプトではないから違うか・・・。
0659login:Penguin2008/02/24(日) 11:38:47ID:kyu4Np6c
>>658
つ www.tkl.iis.u-tokyo.ac.jp/~toyoda/
0660login:Penguin2008/02/24(日) 13:02:41ID:FjGZZj6V
bashです。

cdするたびに一緒にlsもして欲しいんですが、どうやって書いたらいいでしょうか?
aliasだとうまくできないです。
0661login:Penguin2008/02/24(日) 13:04:14ID:UaS7yo8D
alias cls='cd $1 && ls'
0662login:Penguin2008/02/24(日) 13:21:41ID:CzUoXlF2
clsといったらCLear Screenだろうに
0663login:Penguin2008/02/24(日) 13:24:30ID:UaS7yo8D
そうなのか。うちにはそんなコマンドないって言われたもので。
0664login:Penguin2008/02/24(日) 14:04:47ID:I77Y2jQo
そりゃDOSのコマンドだからな。
0665login:Penguin2008/02/24(日) 14:44:06ID:FjGZZj6V
>>661
できないみたいです。

カレントディレクトリが切り替わりません。
0666login:Penguin2008/02/24(日) 14:53:32ID:UaS7yo8D
>>665
うちでは動作確認したんだが・・・なんでだろね。
0667login:Penguin2008/02/24(日) 14:54:08ID:UaS7yo8D
あ、ほんとだ、切り替わらないねw
0668login:Penguin2008/02/24(日) 15:09:41ID:I77Y2jQo
PROMPT_COMMAND='if [ "$PWD" != "$PWD2" ]; then ls; PWD2="$PWD"; fi'
0669login:Penguin2008/02/24(日) 15:13:49ID:uTpa9gVS
>>667
ぢゃあ関数にしちゃうとか。
function cls {
cd $1 && ls
}
0670login:Penguin2008/02/24(日) 15:23:08ID:UaS7yo8D
cdはシェルの内部コマンドだから親プロセスには反映されないんだねえ。
#!/bin/sh
cd $1
ls
として、foo.shとして、
alias cds='. foo.sh'

かなあ。動作確認はしたw
0671login:Penguin2008/02/24(日) 15:36:14ID:FjGZZj6V
できればclsじゃなくてcdでやりたいです。

>>669,670 でcdにするとなぜか動かない。
でも参考になりました。

>>668
わかんないです。
0672login:Penguin2008/02/24(日) 15:41:52ID:FjGZZj6V
#!/bin/sh
'cd' $1
ls
として、foo.shとして、
alias cd='. foo.sh'

でできました。(・∀・)イイ!
ありがとう。
0673login:Penguin2008/02/24(日) 15:42:06ID:Sa+MU/+b
cd() {
   builtin cd $1 && ls
}
0674login:Penguin2008/02/24(日) 15:46:14ID:I77Y2jQo
( ゚д゚)……
0675login:Penguin2008/02/24(日) 15:47:40ID:UaS7yo8D
>>673
ビルトインか。やっぱりman読まないとダメだな。
ありがとう。
0676login:Penguin2008/02/24(日) 15:54:18ID:l3aT8ww/
ほう、すげっ
0677login:Penguin2008/02/24(日) 15:55:21ID:FjGZZj6V
>>673
それも(・∀・)イイ!
トン
0678login:Penguin2008/02/24(日) 16:08:01ID:OZdK2Ezs
668は逆にわかりやすいと思うが・・・なぜ分からぬ
0679login:Penguin2008/02/24(日) 16:57:30ID:M1aIs9jI
>>659
slねぇ・・・Vine 3.2だとmakeしてもエラーが出てmake出来ないんだけど・・・?
apt-get install build-essential は入ってる環境です。
0680login:Penguin2008/02/24(日) 21:43:32ID:X4+soAGj
>>679
libncurses.soのことか?
0681login:Penguin2008/02/24(日) 22:41:47ID:WU8Eis2Q
>>673
cd に -P とかオプションつけると機能しなくなるぞ。

cd() { builtin cd "$@" && ls; }
0682login:Penguin2008/02/24(日) 22:44:30ID:CzUoXlF2
>>673,>>681
それしばらく使ってみるとわかると思うけど、
そのままではナイーブすぎて少し不便だよ。

zshで同じようなことやってるけど、次の点は考慮した方がいいです。
・サブシェルで実行されたときにはlsしない
・行数が多すぎるときは適当な長さで切り、省略した旨を表示
0683login:Penguin2008/02/25(月) 12:48:54ID:fTf5K0mT
同一内容のファイルを調べるシェルスクリプトなんだけど、過去にここかUNIX板の方で出てたっぽい。
結局やらず仕舞いだったようだし、どうせならシェルスクリプトの勉強がてらやってみようとおもった。

作りたい理想は以下のとおり
 ・コマンドラインでオプション指定を行い、検索ディレクトリとサブディレクトリへの再帰検索をするかどうか、あとファイルサイズ閾値を指定できる
 ・走査しているディレクトリにあるファイルパス&ファイルサイズのペアをリストとして吐く
 ・ファイルサイズ閾値未満で、ファイルサイズが一致したものに対してmd5sumを実行し、両方が同一のハッシュを吐いた場合、表示する。
 ・ファイルサイズ閾値を設定する理由はmd5sumが時間がかかりそうだから。閾値以上のサイズ一致ファイルはmd5sumすることなく表示する。

■ このスレッドは過去ログ倉庫に格納されています