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

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

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2012/06/08(金) 00:35:51.19
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。

□お約束
・特記なき場合は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 でトレースしましょう。

前スレ
シェルスクリプト総合 その19
http://toro.2ch.net/test/read.cgi/unix/1323515200/
0671名無しさん@お腹いっぱい。2012/08/11(土) 00:12:39.76
>>670
スクリプト言語から使うときなんかはテキストの方が楽だったりするね
(言語によるけど)。
そういう場合はprocfsやkernfsを使えばいいんだよ。
低級言語で書かれたOS付属コマンドまでそういうのに頼る必要はないけど。
0672名無しさん@お腹いっぱい。2012/08/11(土) 00:20:16.15
性能重視じゃないスクリプトなら
中継用のコマンドをユーザーランドに置いておけばよくて、
カーネルがサポートしなくてもいいよね
0673名無しさん@お腹いっぱい。2012/08/11(土) 01:49:37.99
sysctlコマンドなんて、まさにそういう中継用コマンドだな。
/dev/fd/* みたいなのは、なんらかのカーネルサポートが必要だが。
0674名無しさん@お腹いっぱい。2012/08/14(火) 03:35:46.04
PS1っていう環境変数は
bashだけのものですか?
他のシェルでも使える?
0675名無しさん@お腹いっぱい。2012/08/14(火) 09:38:22.60
PS1とPS2はすべてのシェル共通。PS3 PS4はbashとかのみ。

ただし、PS1とかの中の特殊文字の解釈はシェルごとに異なる。
0676名無しさん@お腹いっぱい。2012/08/14(火) 20:07:54.88
標準入力からzipする場合のファイル名って変えられないでしょうか?

echo abcde | zip test.zip -

ってやると圧縮ファイルに標準入力データを追加できるのですが
追加されたファイル名が「-」になってしまいます。
ファイルをディスクに書かずに、パイプを使ってzip圧縮までやりたいです。
0677名無しさん@お腹いっぱい。2012/08/14(火) 20:15:26.80
ln -s /dev/stdin hoge.txt
echo abcde | zip test.zip hoge.txt

とか。symlinkは許せ。
0678名無しさん@お腹いっぱい。2012/08/14(火) 22:50:08.33
>>677
希望が見えました。ありがとう。
0679名無しさん@お腹いっぱい。2012/08/14(火) 23:00:48.31
zip扱うライブラリがperlやpythonにある。そういうの使うと簡単。
0680名無しさん@お腹いっぱい。2012/08/15(水) 05:39:00.88
>>677
普通にtemporaryファイルつくって消したら?
0681名無しさん@お腹いっぱい。2012/08/15(水) 06:50:20.97
なんの役にも立たない >>680 をわざわざ書く意味がわからん
0682名無しさん@お腹いっぱい。2012/08/16(木) 00:43:00.83
例えばVAR=`df- h` というような場合に
echo $VAR とすると全て一行で表示されてしまいますが、
元のdfの出力結果をそのまま表示するようにするにはどうしたらいいでしょうか?
0683名無しさん@お腹いっぱい。2012/08/16(木) 00:47:05.41
echo "$VAR"

って最近似たような質問見たような。
0684名無しさん@お腹いっぱい。2012/08/16(木) 01:01:11.89
>>683
すいません、""の存在をすっかり忘れていました。
ありがとうございました。
0685名無しさん@お腹いっぱい。2012/08/16(木) 13:52:12.32
演算結果を変数に入れるにはどうしたらよいか
echo $((91-72)) はちゃんと出るけど
A=$((91-72)) は出来ない。
まさかいちいちA=`echo $((91-72))`ってやんの?
0686名無しさん@お腹いっぱい。2012/08/16(木) 13:57:08.74
>>685
$ A=$((91-72))
$ echo $A
19

できてるけど
0687名無しさん@お腹いっぱい。2012/08/16(木) 14:00:53.80
echo $((91-72)) は出来て、
A=$((91-72)) は出来ない、という環境は何か?
というエスパー検定だろw ちょっと上級の問題だな。
0688名無しさん@お腹いっぱい。2012/08/16(木) 16:01:24.16
「スクリプトを終了したら $Aがセットされていません」系か?
0689名無しさん@お腹いっぱい。2012/08/16(木) 17:14:30.15
sum=0; cat file | while read i; do sum=$(($sum+$i)); done; echo $sum
系とエスパー
0690名無しさん@お腹いっぱい。2012/08/16(木) 18:10:35.35
echo $(( `wc -l a.txt` / 2 ))
ってなんでエラーになるの?
0691名無しさん@お腹いっぱい。2012/08/16(木) 18:14:24.15
>>690
wcの出力にファイル名(a.txt)が出ちゃうから。

echo $(( `wc -l < a.txt` / 2 ))
で桶
0692名無しさん@お腹いっぱい。2012/08/16(木) 20:20:08.24
>>691
ありがとう
0693名無しさん@お腹いっぱい。2012/08/17(金) 12:54:21.22
>>671
ベタテキストよりオブジェクトそのままの方が扱いやすい。
0694名無しさん@お腹いっぱい。2012/08/17(金) 14:11:13.11
亀レスで新しい内容なしw
0695名無しさん@お腹いっぱい。2012/08/18(土) 09:29:13.33
2点教えて下さい。
linuxのシェルでの問題です。
@aaa="a b";echo ${aaa}
a b と半角スペースがなぜ詰まるのでしょうか?
ASJISテキストファイル編集時の文字化け
 やりたい事、csv2ファイル入力し、双方マッチングし
 条件により、行データを出力するしないを制御するだけのものです。
 そこで、head,cat,sort,uniqコマンドを|で通した後をリダイレクト
 で出力したものに関しては文字化けは見受けられなかった。
 文字化けが発生したのは
 read LINEで一行読込
 echo ${LINE} >> out.cvs で追加出力
 とした場合のみ
 前者後者あまり違いが内容に思われるのですが対策って有るでしょうか?
 ちなみにlinux側の文字コードはutf8設定です。
 当編集シェル実行時のみ文字コードを環境変数なりで変えることは
 可能でしょうか?またその方法は有効でしょうか?

よろしくお願いします。
0696名無しさん@お腹いっぱい。2012/08/18(土) 09:37:46.51
1 echo "${aaa}"
2 readはバックスラッシュを解釈する。したがってSJISでは利用できない。
0697名無しさん@お腹いっぱい。2012/08/18(土) 09:39:32.05
>>695
機種依存文字使うな

aaa="a b";echo "$aaa"

echo "$LINE"

同じような質問が、>>683 で出たばかり
0698名無しさん@お腹いっぱい。2012/08/18(土) 09:42:26.61
>>695
どうせbashだろうから、

IFS= read -r LINE
echo "$LINE"

でいいな。
0699名無しさん@お腹いっぱい。2012/08/18(土) 09:56:30.06
早速の多数の方、回答ありがとうございます。
1.機種依存注意します。
2.類似質問分からず失礼しました。
職場ではnetに繋げないため、別の場所からの質問でした。
直ぐの確認できませんが、後ほど確かめます。
ありがとうございました
0700名無しさん@お腹いっぱい。2012/08/18(土) 10:32:16.48
>>697
スレチですまんのだが、丸数字は10年以上前に UNICODE に採用されているし、
UTF-8 表示できない環境でまともに Web 閲覧できるとは思えないし、MAC も
最早 Windows 側にあわせてるらしいので機種依存文字として指摘するのもそろそろ
終わりにして良いんじゃないかな。
0701名無しさん@お腹いっぱい。2012/08/18(土) 10:46:31.57
UNICODEの丸数字とSJISの丸数字はコードが違う。
0702名無しさん@お腹いっぱい。2012/08/18(土) 10:56:37.52
UNICODE ?x2460;
SJIS @
0703名無しさん@お腹いっぱい。2012/08/18(土) 11:02:46.61
>>700
Web上で単純閲覧は出来ても、コピー(引用)編集時に化けるという問題があるよ。
0704名無しさん@お腹いっぱい。2012/08/18(土) 14:37:23.03
機種依存なんだからそんな問題が発生する機種を使ってる奴が悪いw
0705名無しさん@お腹いっぱい。2012/08/18(土) 14:43:39.83
にちゃんにきておいて機種依存文字がどうのって...
ばかじゃね?
0706名無しさん@お腹いっぱい。2012/08/18(土) 14:46:18.51
SJISの丸数字使いはこの板ではバカにされてもしょうがない。
0707名無しさん@お腹いっぱい。2012/08/18(土) 15:04:19.06
未だにこんなこという爺さんが生き残ってたんだ。すげー。
0708名無しさん@お腹いっぱい。2012/08/18(土) 15:26:19.78
丸文字は見た目がバカっぽい。
0709名無しさん@お腹いっぱい。2012/08/18(土) 15:33:34.03
そんなひっぱるほどの話でもない。
0710名無しさん@お腹いっぱい。2012/08/18(土) 16:26:28.28
機種依存馬鹿
0711名無しさん@お腹いっぱい。2012/08/18(土) 16:49:46.33
掲示板ならいいけどソースコードの中で丸数字見たらヤな気分になる人は多いのでは
0712名無しさん@お腹いっぱい。2012/08/18(土) 16:53:07.24
>>704、706
なんだかな。。。

>>711
意味不明なオレ様英語で書かれるより遥かにマシ。
0713名無しさん@お腹いっぱい。2012/08/18(土) 17:39:52.74
>>711
確かに。ヘタな英語のほうがまだマシだな。
0714名無しさん@お腹いっぱい。2012/08/18(土) 22:13:16.26
695です。
心配でしたので、自分のPCにcygwinをいれて試してみました。
1,2点確認取れました。
全く同じ環境ではないですが、問題なさそうですね。
安心しました。助かりました。
ありがとうございました。
0715名無しさん@お腹いっぱい。2012/08/19(日) 08:36:59.51
>>700
2chのエンコードコードがUTF-8なら同意見なんだが、残念ながらSJISだ。
そして、SJISのコードページが複数あり、HTMLのshift_jisが機種依存文字を明確に定義していない以上、機種依存問題は残る。
ただ、その中でも丸数字は現在Webクライアントで使われているほとんどのコードページで共通なので問題は起きないとは思う。
0716名無しさん@お腹いっぱい。2012/08/19(日) 08:55:36.89
UTF-8な板もあるんじゃないの?
0717名無しさん@お腹いっぱい。2012/08/19(日) 09:32:20.05
>>716
どの板?
0718名無しさん@お腹いっぱい。2012/08/19(日) 13:27:36.99
外国語の特殊文字の顔文字が2chに氾濫してる御時勢に機種依存文字とか何だか。
スレ違いなので誘導?です↓
2chで外国語の特殊文字を使うには[unicode][専ブラ] 2
http://awabi.2ch.net/test/read.cgi/gogaku/1298542858/
0719名無しさん@お腹いっぱい。2012/08/19(日) 14:00:34.37
>>718
その板も Shift_JISだねw
0720名無しさん@お腹いっぱい。2012/08/19(日) 17:08:00.35
今の2chで機種依存文字っつーと丸数字よりケータイ絵文字の印象が強いな
0721名無しさん@お腹いっぱい。2012/08/20(月) 00:07:04.29
引数のファイル名とかディレクトリ名を
正規化してフルパスにしたいんだけど
一番かっこういい方法はどんな手順?
0722名無しさん@お腹いっぱい。2012/08/20(月) 00:10:53.29
linuxならreadlink -fかrealpath
FreBSDならrealpath
0723名無しさん@お腹いっぱい。2012/08/20(月) 00:37:28.76
>>722
NetBSDではどうしたらいいんでしょうか
0724名無しさん@お腹いっぱい。2012/08/20(月) 00:40:15.07
GNU binutilsか何かにrealpathは入ってるから、入れろ
0725名無しさん@お腹いっぱい。2012/08/20(月) 00:40:16.43
Perlのrealpath関数でも使っておけ
0726名無しさん@お腹いっぱい。2012/08/20(月) 01:00:03.17
acroreadの起動スクリプト(シェルスクリプト)とか参考になるんじゃないかな
0727名無しさん@お腹いっぱい。2012/08/20(月) 01:56:51.87
>>721
完璧な方法

1 openする
2 fstatかける
2 /からinode,dev一致するファイルを探す
07287212012/08/20(月) 02:27:37.26
>>722-727
ありがとう
readlink -f
を使うことにします
0729名無しさん@お腹いっぱい。2012/08/20(月) 06:32:20.27
>>727
それだと対象ファイルがパーミッションでopenできない時に使えない。

openせずに直接 statした方が良い。
0730名無しさん@お腹いっぱい。2012/08/20(月) 06:40:53.50
>>726
acroreadの起動スクリプトって、ls -lの出力をsedしたりしてるから、
path名に特殊記号とかスペースが入ってる場合を考慮してないし、
全然完璧じゃないよ。
0731名無しさん@お腹いっぱい。2012/08/21(火) 15:37:54.91
パイプで最初の一行目だけを取得するにはどう書けばよいでしょうか?
ls -t | <最初の一行目を抽出するコマンド>
のような使いかたがしたいのですが。
0732名無しさん@お腹いっぱい。2012/08/21(火) 15:42:20.18
すみません、宿題で使うので説明も書いてほしいです。
0733名無しさん@お腹いっぱい。2012/08/21(火) 15:42:47.76
head -n1 じゃダメなのん?
0734名無しさん@お腹いっぱい。2012/08/21(火) 15:48:22.55
宿題なら他人と同じ答じゃ評価低いよな。

head -n 1 や head -1 は多数が回答するから面白くない。

sed -n 1p あたりで回答しとけ。評価上がるぞ。
0735名無しさん@お腹いっぱい。2012/08/21(火) 15:51:18.32
>>731
俺と同じ授業か? 俺は awk NR==1 で提出するから真似するなよ。
0736名無しさん@お腹いっぱい。2012/08/21(火) 15:57:36.75
じゃあ俺はbrainf*ckあたりで一行目を表示するスクリプト書くわー
0737名無しさん@お腹いっぱい。2012/08/21(火) 15:59:31.28
オレこれ↓
ls -t | (read f; echo "$f")
07387312012/08/21(火) 16:00:29.24
教えていただけてありがとうございました。
0739名無しさん@お腹いっぱい。2012/08/21(火) 16:48:36.64
sed -n 1pとhead -n 1じゃ前者はカス。
何故カスかという効率の差に関して記述すれば評価上がるぞ。
0740名無しさん@お腹いっぱい。2012/08/21(火) 16:51:32.61
>>739
sed 1q ならどうですか?
0741名無しさん@お腹いっぱい。2012/08/21(火) 16:58:40.58
headとかsedのプロセス起動のコストを考えると
シェル側でパイプ開いてreadするのが最強
0742名無しさん@お腹いっぱい。2012/08/21(火) 20:14:52.48
シェルへのパッチをレポートに貼るのか
0743名無しさん@お腹いっぱい。2012/08/22(水) 01:21:58.16
printf 'r !ls -t\n1p\nw' | ed -

パイプは使ったが
> ls -t | <最初の一行目を抽出するコマンド>
の形になってないからだめか
07447432012/08/22(水) 01:29:14.30
ls -t | printf "i\n`cat /dev/stdin`\n.\n1p\nw" | ed -

こうしたら一応できた
0745名無しさん@お腹いっぱい。2012/08/22(水) 01:40:47.17
FreeBSDではedがworldに含まれてるから当然インストールされてるんだけど
Linux系ではed入ってないことも多いんだよなあ。
0746名無しさん@お腹いっぱい。2012/08/22(水) 02:57:14.91
そうだっけ?Linuxでも割と入ってるイメージがある
中身はもしかしたらexモードのvim.tinyとかだったりするのかも知らんがw
0747名無しさん@お腹いっぱい。2012/08/22(水) 03:14:43.87
Linuxならedなしbusyboxなディストリビューションもあるわけで。
0748名無しさん@お腹いっぱい。2012/08/22(水) 15:08:45.07
edが入っていないなんてもはやunixじゃないな…ああ元々unixじゃなかった。
0749名無しさん@お腹いっぱい。2012/08/22(水) 22:33:02.24
fedoraに普通に入ってる ed-1.5-3.fc17.x86_64
0750名無しさん@お腹いっぱい。2012/08/22(水) 23:14:05.90
そういうことは聞いてない。
0751名無しさん@お腹いっぱい。2012/08/26(日) 11:54:24.95
初歩的な質問ですみません
グレイヴコマンド(例:echo `date` の`date`)はネストできませんが、
ネストしたような働きをさせるにはどうコマンドしたらよいでしょうか
0752名無しさん@お腹いっぱい。2012/08/26(日) 12:01:34.46
>>751
echo `echo ¥`date¥``
0753名無しさん@お腹いっぱい。2012/08/26(日) 12:03:20.51
$()が使える環境ならそっちを使う方がいいかもしれん
0754名無しさん@お腹いっぱい。2012/08/26(日) 12:11:27.99
なるほど ありがとうございます
0755名無しさん@お腹いっぱい。2012/08/30(木) 23:13:56.24
初歩的な質問ですみません。
レッドハットとHP-UX混在環境です。

サーバーA、サーバーB、サーバーCとあり
全て異なるネットワークに属しているサーバで
ftpやhulftでのファイルやり取りを行います。

サーバー間でファイルの送受信を行うスクリプトを組むのですが、
ファイルごとに組むと100本近くになってしまうため、外部定義ファイルにパスなどを記述し
そこからパスなどを読んで処理するような作りをかんがえてます。

例えばhulftならhulft idを引数にしてそのhulft idの行にファイルのパスやファイル名、
sendなのかrecvなのかを記載しそれらをスクリプト内で代入出来ればいいんじゃないか
と思ったのですが具体的な構文がいまいち浮かびません。

またサーバーA上にシェルA、サーバーB上にシェルBといて
シェルBはシェルAからキックされる場合、引数や変数は継承されますでしょうか。
0756名無しさん@お腹いっぱい。2012/08/30(木) 23:23:26.73
>>755
ファイル名にスペース等が含まれていないなら、

for file in `cat 外部定義ファイル`; do ...
で行ける。

異なるサーバー上のシェルに変数は継承されない。
引数は明示的に引数を渡せば当然継承される。
0757名無しさん@お腹いっぱい。2012/08/31(金) 09:31:26.31
どのシェルが普通なのか俺には分からない
少なくとも、バッシュやZSHかな大別できるのは…
Kshは癖があるな。
シェルを実行するためには、chmodのコマンド手続きがいるだろ?
そんなこと初心者には周知されていない。
コマンド入力にしても ./付けるとかひと工夫しないとだめだ。
この件も初心者には周知されていない。
初心者と言ってもシェル経験者ならPATHで権限を付ける知識くらいはある。
しかし、Windowsの経験者にはPATHの概念さえ聞いたことも何ができるかも
わからない筈だ。
0758名無しさん@お腹いっぱい。2012/08/31(金) 09:47:52.57
詩の宿題かなんか?
0759名無しさん@お腹いっぱい。2012/08/31(金) 12:48:53.44
export PATH="$PATH,."
0760名無しさん@お腹いっぱい。2012/08/31(金) 12:50:56.18
>>759
馬鹿は無理に答えなくていいよw
0761名無しさん@お腹いっぱい。2012/08/31(金) 13:04:38.23
>>760
どっか間違ってました?
0762名無しさん@お腹いっぱい。2012/08/31(金) 13:07:21.17
,じゃなく:だろ、と
.を含めちゃいかんだろ、と。
0763名無しさん@お腹いっぱい。2012/08/31(金) 13:08:11.26
>>757
勉強不足を人のせいにされてもなぁ。
0764名無しさん@お腹いっぱい。2012/08/31(金) 13:21:45.38
>>762
ああコロンでしたかすいません
前読んだ本にはlsっていうウイルスがカレントディレクトリにあったときに備えて.は置かない方がいいって書いてたけどPATHの後ろに書いとけば大丈夫かと



あとWindowsにもPATH変数はあるけどコントロールパネル->システム->どっかのタブ->環境変数って辿らないと設定するとこまでたどりつけなくてしかも再起動しないと反映されないありさまだったような
0765名無しさん@お腹いっぱい。2012/08/31(金) 14:24:17.00
slっていうウイルスがいるかもよ
0766名無しさん@お腹いっぱい。2012/08/31(金) 15:34:17.51
バッシュと呼ぶのやめようぜ。
かなりカッコ悪い。
0767名無しさん@お腹いっぱい。2012/08/31(金) 15:39:47.48
良く口頭でビーシェルみたいな言い方する人いるけど
あれってbashのことなんだろうか。
0768名無しさん@お腹いっぱい。2012/08/31(金) 16:03:33.42
そういうネタはいいです
0769名無しさん@お腹いっぱい。2012/08/31(金) 23:12:05.50
>>764
大丈夫じゃねーよ、バカ。
0770名無しさん@お腹いっぱい。2012/09/01(土) 02:21:32.43
触るな危険
■ このスレッドは過去ログ倉庫に格納されています