1read 100read
2013年03月UNIX6: シェルスクリプト総合 その21 (247) TOP カテ一覧 スレ一覧 2ch元 削除依頼
ワークステーションが欲しい。 (417)
UNIXの日本語GUIは何故明朝体を採用するのか? (616)
Hi-UXだぞゴルァ (283)
IMEなんとかしろ (465)
PGP / gpg スレ (340)
HOMEのディレクトリ管理 (229)

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


1 :2012/11/15 〜 最終レス :2013/03/12
シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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元 削除依頼
簡単!メモリクリーニング (663)
【Unix】糞を愛するUnixer【Linux】 (446)
UNIXカフェを作ろうかと思うんですが (793)
BSDバブルを仕掛けるスレ 第2案 (416)
C.i. for 2ch (313)
bashで補完スレ (347)
--log9.info------------------
【新規参入?】XXX Storage−Service【DQN鯖管?】 (251)
【ついに】arigato3.net 8枚目のCD-R【控訴】 (939)
【8月末撤退】Global Vision Network【訴訟へ?】 (607)
いらないものを窓から投げ捨てろ! 【鯖板】 (282)
SunSeagull FREESPACE Serviceって・・・ (928)
【復活】DQN鯖缶ランキング【業務怠慢】 (266)
【糞鯖】史上最悪の無料鯖決定戦【腐鯖】 (265)
CCTLD(国別ドメイン)について語るスレ2 (389)
レンタルサーバ雑談スレ (295)
この鯖の評価きぼんぬ 2 (532)
【】AT−LINKさんのサーバ Part3【】 (898)
【トスクー】TOS-ii-KOO Hosting【海外安鯖】 (431)
■ドメインを格安で取得できるところを語ろう 2■ (481)
BBzone.NETってどうすか? (359)
ものすごく頭の悪い発言してくださいinレン鯖板 (578)
サーバー運営者で2ちゃんねる被害者の会を作ろう (372)
--log55.com------------------
狼と香辛料のホロはしっぽカワイイ
【僕は友達が少ない】肉 せもぽぬめ 柏崎星奈 3
【マクロスF】早乙女アルトを愛でるスレ
とある魔術の禁書目録 浜面仕上アンチスレ part2
【僕は友達が少ない】三日月夜空に萌えるスレ
【Fate/Zero】ランサー 魅了7人目
【Fate/Zero】【虚淵玄】遠坂時臣の紅茶は7杯目【優雅に】
【Fate/Zero】イスカンダル&ウェイバー エルメロイ2世【ライダー陣営】