1read 100read
2013年07月UNIX22: シェルスクリプト総合 その21 (790) TOP カテ一覧 スレ一覧 2ch元 削除依頼
★★UNIXを学ぶには何を使ったらいいの?★★ (106)
BSDとWinは仲良しなわけですが (107)
Courier-MTA (197)
新品のULTRA2(200MhzX2)を3万で買ったんだ! (100)
読み飛ばしてる言葉を告白するスレ (140)
NetHack 地下:58 (700)

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


1 :2012/11/15 〜 最終レス :2013/07/13
シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その20
http://toro.2ch.net/test/read.cgi/unix/1339083351/

2 :
Q. シェルは UNIX の勉強に使えますか?
A. シェルは UNIX に慣れた人間がスクリプトを書いて楽するのには向いていますが、
  UNIX の勉強には向いていません。

3 :
今月はじめ、職場に新しいPC(Core i7の結構ハイエンド構成)が入りました。
多分私が運用保守をまかされそうな雰囲気です。業務的にとある構造分析や
シミュレーションなど行う必要があり、制御コマンドとしてシェルスクリプトを
使用するのは聞いていたのですが、そのファイルを開いて1行目に書かれていたのは
#!/bin/tcshという文字列でした。
「うへぇ〜、よりによってtcshかよ」
ファイル記述子のリダイレクト不可、クオートのネスティング等に無理あり、
今の奴でさえシェル関数は使えないし、パイプラインの終了ステータスもおかしいし、
今時の担当者が扱ってセキュリティは大丈夫なのか不安はつきませんし、
スクリプトとしてのcshは嫌われるのでネット上の情報も少なく調べるのも大変です。
おそらく導入に際して、大学など教育機関で最初にcshに触れて刷りこまれた人間が
強気の知ったかぶりをして発言権を得て「俺流」をつらぬき紛れ込ませたのでしょう。
昔、当時、シェルで唯一aliasやhistoryやジョブコントロールの機能が使えた
cshは大学など教育機関に浸透していて、日本のシェル界に多くのバカが輩出しました。
これから私は、おそらくそういうバカが、$*でスペース入りファイル名が扱えないとか
$<でファイルから読めないのかとか、変数に*を入れた場合だけ構文エラーになって
実行できないなどと、シェル通気取りの偏ったどうでもいい我侭を言い出し
(だからcshスクリプト書くんじゃねーよ)それと戦わなければならないのでしょう。
そして時代によって決着している、過去25年のシェル界隈のくだらないそれらの議論が
再現され、それに巻き込まれるのでしょう。もう今からうんざりです。
だからお願いです。教育現場ではbashでもzshでもkshでもashでも
Bourne shでもなんでもいいですがBシェル系のシェルにしてください。
教育機関で懐古趣味のバカを量産されると現場が非常に苦労するのです。

4 :
>>2
シェルとシェルスクリプトの区別がついてないアホレスをコピペすんなよ

5 :
確かにww
シェルがないとコマンド実行すらできないし
何がユーザーの入力を受け付けるんだ

6 :
前スレ最後の頓珍漢は私です
アドバイス通り$args[1]→$1にしたらすんなりいきました。
ありがとうございました。スレなめるように見て勉強させて頂きます。

7 :
俺のもなめて。

8 :
Gnome Shellのスクリプトの話題もここでいいのか?

9 :
以下のような文章があったとします。
〜aaa〜bbbaaa〜bbbaaa〜bbb〜
(〜は文字数の定まっていない文字列を表しています。)
ここから、それぞれ最初のaaa〜bbbだけを抽出、真ん中のaaa〜bbbだけを抽出、最後のaaa〜bbbだけをgrepなどで抽出したい時、どう正規表現で表せばよいのでしょうか?

10 :
grepは抽出するというより、マッチした行は全部表示しちゃうけど?
sedなら
sed 's/\(aaa.*bbb\)\(aaa.*bbb\)\(aaa.*bbb\)/\2/'
みたいな?

11 :
>>9
>>1
>正規表現の話題はスレ違い(正規表現スレへ)

12 :
>>11
いや、それは
>>1
> ・シェルで使えるワイルドカード等は正規表現ではありません。
って話だからまた違う。

13 :
>>12
恥ずかしい奴。

14 :
正規表現スレはまともに機能してないし、ここでいいだろ。

15 :
だな。

16 :
正規表現スレがまともに機能してないというなら
まともに機能させるためにも正規表現スレに行くべき。
sedスレもあるし、sedスレでもいいよ。

17 :
了解です
正規表現スレに行ってきます
>>10
grep -oとしてマッチした部分のみ出力しようと考えてます

18 :
>>9
ってかこれ俺も分かんないんだけど
どうやんのさ

19 :
>>17
$ echo "〜aaa〜bbbaaa〜bbbaaa〜bbb〜" | grep -o "aaa〜bb"
ってやったら3個表示されちゃうな。。。

20 :
あとは、sed -n 1p 等でいいじゃない

21 :
あるシェルスクリプトに渡された空白を含む可変長引数を、別のコマンドに転送したいのですが書き方がわかりません
具体的にはシェルスクリプトhoge.shを./hoge.sh "a b" "c d"…と実行すると,内部で別のコマンドcmdを引数"a b" "c d"…で実行するような場合です.
引数の数が固定であればhoge.shの中にcmd "$1" "$2"…と記述すれば良いのですが,可変長に対応しようと$*をそのまま用いると
展開されてcmd a b c dというコマンドになり,引数が4つになります.
どなたかわかる方がいましたら,ご教授ください.

22 :
>>21
"$@"

23 :
ありがとうございます.これで彼女ができそうです><

24 :
ffmpeg(avconv)では連番のpngファイルから動画ファイルを作り出すことができます.
このような機能を利用して,画像生成スクリプトの吐き出す静止画群から動画を作っています.
これを,中間ファイルのpngを作ることなく実現したいのですが何かいい方法はないでしょうか.
静止画をまとめて標準出力に書き出すことはできそうなので,標準入力からの複数の静止画を
avconvが認識できれば簡単に実現できそうな気がするのですが.

25 :
>>24

動画編集ソフト
http://toro.2ch.net/test/read.cgi/unix/1055825616/

26 :
>>24
良い事を教えてやろうwebブラウザでhttp://www.google.com/を開くんだ。
まんなかにテキストボックスがあらわれるから
ffmpeg jpeg
ここまで入れれば候補に
ffmpeg jpeg 動画
がでてくるから、それをクリックする。あとは上から順番に開いていけばいい。
わかったか? http://www.google.com/はブックマーク(お気に入り)しとくと捗るぞ。

27 :
すみませんが詳しい方のみ回答をお願いします

28 :
賢者タイムの方のみお願いします

29 :
おかずもあげずに

30 :
質問です。
まず、以下のファイルがあります。
--------
$ cat hoge.dat
aaa
bbb
ccc
--------
次に、下記のスクリプトを用意します。
--------
$ cat hoge.sh
#!/bin/sh
cat hoge.dat | while read -r line
do
alldata=$alldata$line
done
echo $alldata
--------
処理結果は以下のようになりました。
--------
$ ./hoge.sh
$
--------
自分のイメージとしては、処理結果は、aaabbbcccと表示されるはずなのですが、
なぜ表示されないのでしょうか?表示するためにはどうすればいいでしょうか?

31 :
>>30
パイプ使うとサブシェルが作成されるから。この場合ループの中身はサブシェルで実行される。
bashでこれを避けるにはcatとパイプの代わりに<でファイルを渡せばいい。
#!/bin/sh
while read -r line
do
alldata=$alldata$line
done < hoge.dat
echo $alldata

32 :
ただのファイルなら < でいいけど、どうしてもパイプが必要ならこうかな
#!/bin/sh
alldata=`cat hoge.dat | (while read -r line
do
alldata=$alldata$line
done; echo $alldata)`
echo $alldata
あんまりエレガントじゃないか

33 :
<() 使うのはナシですか

34 :
sh(bash)ではなく、kshに変えるのが一番手っ取り早いな。

35 :
#!/bin/sh
while read -r line
do
alldata=$alldata$line
done <<EOF
`cat hoge.dat`
EOF

36 :
ほほー

37 :
やっぱカッケーな

38 :
>>32
これじゃだめ?
#!/bin/sh
cat hoge.dat | (while read -r line
do
alldata=$alldata$line
done
echo $alldata)
質問がほんとうにやりたいことなら、こんなのもあるかも。
#!/bin/sh
cat hoge.dat | while read -r line
do
echo -n $line
done
echo

39 :
みなさん、ご丁寧にありがとうございました。
なぜ、期待どおりにならないか理解しました。
ちなみに、こういうやりかたもありますね。
-----------
for line in `cat hoge.dat`
do
alldata=$alldata$line
done
echo $alldata
-----------

40 :
求めてるのと違うだろうけど、これでもできた
sed -n 'H;${g;s/\n//gp}' hoge.dat

41 :
bash の brace expansion {...} について教えてください.
環境は bash 4.2.39 MacOSX 10.7.5 です.
1$ a=foo
2$ echo $a{_a,_b,_c}
3$ echo $a{,_a,_b,_c}
foo
4$ echo ${a}{,_a,_b,_c}
foo foo_a foo_b foo_c
この変数aの区切りを明示しない時(2$,3$)の挙動がよく分かりません.
どう解釈すればいいのでしょうか?

42 :
>>41
このように展開される
$a{_a,_b,_c}→$a_a $a_b $a_c
$a{,_a,_b,_c}→$a $a_a $a_b $a_c
${a}{,_a,_b,_c}→${a} ${a}_a ${a}_b ${a}_c

43 :
>>42
ああ、よく分かりました。ありがとうございます。

44 :
>>41
手元で動作を確認する限り
2$ は {} の展開を先にしてる
つまり $a_a $a_b $a_c としてから変数の処理
=> 何も出力されない
3$ も同様
$a $a_a $a_b $a_c としてから変数の処理
=> $a だけ定義されてるから foo が出力
どこかマニュアルに展開の優先順位があるかもしれないがそれは確認してない

45 :
リロードしてなかった(´・ω・`)
すまない...

46 :
screen使いです。
bash_historyって何行ぐらいにしている?
直近のhistory | grep hoge | lessってするなら3桁の900行で十分だよね。
もうちょっと前のも検索したいなら4桁の9900行。 # 自分は余裕もってこれ。
9366$
メモリ食いそうだから、スクリプトを組んで今までの全部の履歴十数万行を検索するのも
超ひさしぶりのコマンド用途としてはありそう。その超ひさしぶりに使うコマンド用途なら
# とコメントをつけておくとちょっと使いやすいかも。

47 :
好きにしろ。

48 :
ヒストリーは何行にしてても
端末複数開いてたら消えちゃうし
いつ打ったかの時間情報ないし
あんまり意味がないよね

49 :
>>48
> ヒストリーは何行にしてても
> 端末複数開いてたら消えちゃうし
自分の力量の視野の狭さだとちゃんとexitって閉じると残るよ。
> いつ打ったかの時間情報ないし
> あんまり意味がないよね
時間情報は環境変数の設定で秒数まで残るかな。秒数の小数点はスクリプトで工夫すれば
残せそうかな。そこまでの必要性がないからやっていないけど。

50 :
シェルスクリプトでヒストリ残して何がうれしいの?

51 :
シェルスクリプト内でhistory使う方法教えて。

#!/bin/sh
コマンド1
コマンド2
history

と書いて実行してもhistoryが何も表示されない><

52 :
>>51
set -o history でどうかな。

53 :
>>46
zsh使いなら死ぬまで履歴を残すもんだってばっちゃが言ってたから
50万行にしてる。
もちろん複数の端末起動してもちゃんとshare_historyされる設定。

54 :
プログラミング初心者です。
以下のコードがシェルの文法的におかしい点を教えて下さい。
ex1はargvでファイル名を読み込む外部のC++プログラムです。
不足してる情報もあると思いますが、分かる範囲で教えていただけたら助かります。
#!/bin/sh
DIRx=$1
DIRy=$2
filesA=`ls $DIRx/*.data`
filesB=`ls $DIRy/*.data`
for x in $filesA;
for y in $filesB;
do
./ex1 $f $fi
done

55 :
なんでそんな間違い方するのか意味不明
釣りっぽい

56 :
すみません、釣りじゃないです。
ちょっと調べて、これでできたかもしれないです。
もし間違っていたら教えて頂けないでしょうか。
如何せんコンパイルはできるものの実行結果が合っているか確認する術が無いもので…
for x in $filesA;
do
for y in $filesB;
do
./ex1 $x $y
done
done

57 :
質問者ではないのですが この for/do/done の構文
言語仕様策定の上で、do の存在はどうしても必要だったの?
改行かセミコロンでループブロックの区切りは付きますよね
もし無かったらアレができないよみたいな do の活用法なんてあるのでしょうか?
単に do/done なら覚え易いよね!程度だったら残念かも

58 :
>>56
*.data で得るファイル名に空白がないのなら問題ない
空白があれば
IFS=$'\n'
が必要
文法はいい。というか文法以外のex1の意図がわからないけど

59 :
>>58
ありがとうございます、空白はありません。
お陰様でなんとかできました、ありがとうございました。
ex1はただの実行ファイルで、名前に特に意味はありません。

60 :
>>54,>>56
釣りとは思わないけど、やりたいことはなんとなくわかるけどケアレスミスが多すぎて
判読不可能。
>>57
どの力が働いて、今の構文なのかはわからない。おまじないってことでいいんじゃないのw
Unix創世期はほとんどがディスプレイなし、テレタイプ端末、スペック貧弱と想像できるから
テキストエディタvi, emacsは使えずに開発環境はラインエディタ。
創世期シェルを作った開発形態・志向も違うだろうし、for-do-doneを言うならcase-esac,
if-fiもどうなのってツッコミたくなるしなあ。その当時回文みたいなのが流行っていたの?
教育言語のPascalも律儀に{}だからね。
現在のemacsでksh, bashのfor文テンプレート使うとdo-doneってつくね。過剰に装飾している
だけかもしれないけど。

61 :
>>60
ラクダ本(オライリーのPerlの本)の初版用語集によると、ある語の逆綴りを
採用するのはALGOL主義、だそうだが、elif(fileの逆綴りでもある)がない
理由として半ばジョークめいた書き方だったので話半分に。
# Pascalはbegin/endじゃ…

62 :
>>60
born shellの作者がAlgolが好きだったから。

63 :
骨?

64 :
>>62-63
英語の成績悪かったらしい奴が2人いるみたいだが、突っ込んだら負け。

65 :
?マークの意味が分からない奴がいるな・・・

66 :
任意の一文字マッチって意味でしょ。それぐらい知ってるよ。

67 :
シェルスレなんだから変数が未設定かどうかの確認って答えるべきだな

68 :
シェルglobだから>>66で正しい。

69 :
>>66
bo?rn?

70 :
誰もシェルグロブなんて言ってないけどな

71 :
>>67
どういう意味? ?で変数の何が分かるの?

72 :
>>71
${hoge:?}

73 :
${foo:+hello}
fooが nullかunset なら "", それ以外は "hello"
${foo+hello}
fooが unsetなら "", それ以外は "hello"
前者は man bash にて仕様が
${parameter:+word}
Use Alternate Value. If parameter is null or unset, nothing is
substituted, otherwise the expansion of word is substituted.
のように確認できたのですが、後者が見あたりません
どの辺を見れば載っているでしょうか? 或いは man レベルでは載っていない仕様でしょうか?

74 :
>>73
あ、それちょうど今週のレポートで学生に課したネタなんで、
知ってる人も答をここには書かないでね。(偶然は恐ろしい)

75 :
うち学生じゃないんですが・・・
ならせめてレポート提出日が過ぎたら教えてください

76 :
さっきのは null か unset の判別はどうやったらいいのか調べていたら見つけた小技です

77 :
>>73
http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html#lbBB
> コロンを省略した場合には設定されているかどうかのみを調べます。
これじゃね。

78 :
>>77
ありがとうございます。それですね。
辿ってみたら man bash でも該当する箇所がありました。

79 :
そりゃman bashの和訳だもの。

80 :
わらかすなよ

81 :
>>79
意味不明

82 :
>>81
もともとbashのmanは英語で書かれていたんだよ

83 :
わかる方がいたら教えてください。
引数で入力した値で、設定ファイル(~/test.conf)の置換文字列(%replace%)を置換することを考えています。
replace_str=%replace%
input=$1
sed -e "s/${replace_str}/${input}/" ~/test.conf
上記のようなことを考えていますが、入力値に /(スラッシュ)があると、sedコマンドがエラーになってしまい、うまく置換ができません。
入力値に /(スラッシュ)がある場合でも正しく置換する方法はありますか?
また、/(スラッシュ)以外でもNGになってしまう文字はありますか?
その文字も正しく置換することは可能でしょうか。

84 :
>>83
入力値に絶対入らない文字はある?
あれば / のかわりにそれを使う。
sed -e "s,${replace_str},${input}," ~/test.conf
みたいに。

85 :
そんな文字を仮定できないなら、
$1中の / を \/ に置換してからinputに入れるしかないかな。
この置換がまたやっかいかもだが。

86 :
replace_str=${replace_str//\//\\/}
たぶんこれでいけるでしょう

87 :
>>83
\や&も特殊な意味を持つと思うよ
俺なら、sedを使わざるをえないなら$inputに使える文字に制限を付けるかな

88 :
sed 's/%replace%/_replace_/g' | m4 -D_replace_="$input"

89 :
>>87
相手がWebの先の人間だったりするとそういう制限は難しいんじゃ

90 :
シェルスクリプトでHex値を書き換える事は出来ますか?
バイナリファイルAのHex値
00100000のようなものを01100000のように書き換えたいです。
駄目元で、
cat A | sed -
e 's/00100000/01100000/' > A
のようにやってみましたがダメでした。

91 :
>>90
きみのsedは16進数値をかけるsedなのかい?

92 :
>>91
やっぱり無理なんでしょうか。…

93 :
bcかawkでも使っとけ

94 :
シェルスクリプト バイナリファイル でぐぐると最初になかなか面白そうなのが出てきた
個人的にはperl使うのが楽だと思うけど

95 :
>>94
これ?
http://www.flat7th.org/~keizo/wiki/?page=%2B+%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E6%93%8D%E4%BD%9C

96 :
FreeBSDの/bin/shのソースって単体配布されてないのん?

97 :
これを見る限り、それさえ既に魔改造版でしかないみたいw
ttp://www.in-ulm.de/~mascheck/various/ash/ash.png

98 :
shのソースV7のでおなかいっぱい

99 :
>>96
基本的に全部まとめて配布なのが
BSDの良い所の一つだよ。
でも単体取得する方法もある。

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
高卒に最適なUnixの件 (101)
Nginx (135)
【人生色々】UNIX遍歴を語れ!【UNIX色々】 (105)
Microsoft Windows Services for UNIX (SFU) (111)
Unixの深い歴史を勉強する (117)
WXG for Linux/FreeBSD (669)
--log9.info------------------
荒川美穂 Part4 (168)
野川さくらpart58 (274)
伊瀬茉莉也 Part9 (396)
金元寿子さんのスレ part.47 (510)
吉田真弓Part15 (234)
寺本來可 Part3 (831)
小倉唯 Part32 〜唯が大人になる前に〜 (842)
鹿野優以 Part 73 (628)
種田梨沙 Part1 (888)
上坂すみれアンチスレ1 (961)
岩男潤子スレッド 〜part21〜 (293)
南條愛乃 part16 (449)
赤羽根健治 (520)
秦佐和子 Part5 (452)
上坂すみれ часть27 (375)
♪仁後真耶子 54♪ (848)
--log55.com------------------
【助けてハロカス!】YouTube再生数ガタ落ち、低評価まみれの尾形はるみずが、運営にドッグフード喰わされる悲惨な状況
加賀「プルコギまだかなー?プルコギまだかなー?あ!プルコギ来た!!」横山「嬉しそう……加賀のためにまたプルコギよろしく」
トルコさん、ゴーン逃亡をほう助した7人の侍を捕まえる プライベートジェットの操縦士ら
国民年金を10年間、20年間、30年間、40年間払った人がそれぞれ毎月貰える支給額クソワロタwwwwwwwww
【悲報】宝くじ買わない一番の理由「当たらないから」
ガンダムが人気ないらしいがお前らはなぜだと思う?
【悲報】公式発表「ユニコーンガンダムは逆襲のシャアの続きではない」
【神ちゅーんず】こんにちわ私立恵比寿中学の小林歌穂です( ̄? ̄)【なるほど115ですねー】