シェルスクリプト総合 その21
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2012/11/15(木) 18:57:33.11□お約束
・特記なき場合は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/
0002名無しさん@お腹いっぱい。
2012/11/15(木) 19:26:11.32A. シェルは UNIX に慣れた人間がスクリプトを書いて楽するのには向いていますが、
UNIX の勉強には向いていません。
0003名無しさん@お腹いっぱい。
2012/11/15(木) 19:55:58.11多分私が運用保守をまかされそうな雰囲気です。業務的にとある構造分析や
シミュレーションなど行う必要があり、制御コマンドとしてシェルスクリプトを
使用するのは聞いていたのですが、そのファイルを開いて1行目に書かれていたのは
#!/bin/tcshという文字列でした。
「うへぇ〜、よりによってtcshかよ」
ファイル記述子のリダイレクト不可、クオートのネスティング等に無理あり、
今の奴でさえシェル関数は使えないし、パイプラインの終了ステータスもおかしいし、
今時の担当者が扱ってセキュリティは大丈夫なのか不安はつきませんし、
スクリプトとしてのcshは嫌われるのでネット上の情報も少なく調べるのも大変です。
おそらく導入に際して、大学など教育機関で最初にcshに触れて刷りこまれた人間が
強気の知ったかぶりをして発言権を得て「俺流」をつらぬき紛れ込ませたのでしょう。
昔、当時、シェルで唯一aliasやhistoryやジョブコントロールの機能が使えた
cshは大学など教育機関に浸透していて、日本のシェル界に多くのバカが輩出しました。
これから私は、おそらくそういうバカが、$*でスペース入りファイル名が扱えないとか
$<でファイルから読めないのかとか、変数に*を入れた場合だけ構文エラーになって
実行できないなどと、シェル通気取りの偏ったどうでもいい我侭を言い出し
(だからcshスクリプト書くんじゃねーよ)それと戦わなければならないのでしょう。
そして時代によって決着している、過去25年のシェル界隈のくだらないそれらの議論が
再現され、それに巻き込まれるのでしょう。もう今からうんざりです。
だからお願いです。教育現場ではbashでもzshでもkshでもashでも
Bourne shでもなんでもいいですがBシェル系のシェルにしてください。
教育機関で懐古趣味のバカを量産されると現場が非常に苦労するのです。
0004名無しさん@お腹いっぱい。
2012/11/15(木) 20:00:38.47シェルとシェルスクリプトの区別がついてないアホレスをコピペすんなよ
0005名無しさん@お腹いっぱい。
2012/11/15(木) 20:05:57.42シェルがないとコマンド実行すらできないし
何がユーザーの入力を受け付けるんだ
0006名無しさん@お腹いっぱい。
2012/11/15(木) 20:10:10.87アドバイス通り$args[1]→$1にしたらすんなりいきました。
ありがとうございました。スレなめるように見て勉強させて頂きます。
0007名無しさん@お腹いっぱい。
2012/11/15(木) 20:30:38.100008名無しさん@お腹いっぱい。
2012/11/18(日) 11:50:01.580009名無しさん@お腹いっぱい。
2012/11/20(火) 18:14:10.06〜aaa〜bbbaaa〜bbbaaa〜bbb〜
(〜は文字数の定まっていない文字列を表しています。)
ここから、それぞれ最初のaaa〜bbbだけを抽出、真ん中のaaa〜bbbだけを抽出、最後のaaa〜bbbだけをgrepなどで抽出したい時、どう正規表現で表せばよいのでしょうか?
0010名無しさん@お腹いっぱい。
2012/11/20(火) 18:23:34.33sedなら
sed 's/\(aaa.*bbb\)\(aaa.*bbb\)\(aaa.*bbb\)/\2/'
みたいな?
0011名無しさん@お腹いっぱい。
2012/11/20(火) 18:31:07.64>>1
>正規表現の話題はスレ違い(正規表現スレへ)
0012名無しさん@お腹いっぱい。
2012/11/20(火) 18:34:56.83いや、それは
>>1
> ・シェルで使えるワイルドカード等は正規表現ではありません。
って話だからまた違う。
0013名無しさん@お腹いっぱい。
2012/11/20(火) 18:38:12.26恥ずかしい奴。
0014名無しさん@お腹いっぱい。
2012/11/20(火) 18:40:22.600015名無しさん@お腹いっぱい。
2012/11/20(火) 18:45:22.530016名無しさん@お腹いっぱい。
2012/11/20(火) 18:47:12.07まともに機能させるためにも正規表現スレに行くべき。
sedスレもあるし、sedスレでもいいよ。
0017名無しさん@お腹いっぱい。
2012/11/20(火) 20:02:12.24正規表現スレに行ってきます
>>10
grep -oとしてマッチした部分のみ出力しようと考えてます
0018名無しさん@お腹いっぱい。
2012/11/20(火) 20:25:59.98ってかこれ俺も分かんないんだけど
どうやんのさ
0019名無しさん@お腹いっぱい。
2012/11/20(火) 21:32:57.96$ echo "〜aaa〜bbbaaa〜bbbaaa〜bbb〜" | grep -o "aaa〜bb"
ってやったら3個表示されちゃうな。。。
0020名無しさん@お腹いっぱい。
2012/11/21(水) 14:15:55.180021名無しさん@お腹いっぱい。
2012/11/22(木) 18:12:58.50具体的にはシェルスクリプトhoge.shを./hoge.sh "a b" "c d"…と実行すると,内部で別のコマンドcmdを引数"a b" "c d"…で実行するような場合です.
引数の数が固定であればhoge.shの中にcmd "$1" "$2"…と記述すれば良いのですが,可変長に対応しようと$*をそのまま用いると
展開されてcmd a b c dというコマンドになり,引数が4つになります.
どなたかわかる方がいましたら,ご教授ください.
0022名無しさん@お腹いっぱい。
2012/11/22(木) 18:17:06.55"$@"
002322
2012/11/22(木) 18:22:31.990024名無しさん@お腹いっぱい。
2012/11/24(土) 16:38:01.78このような機能を利用して,画像生成スクリプトの吐き出す静止画群から動画を作っています.
これを,中間ファイルのpngを作ることなく実現したいのですが何かいい方法はないでしょうか.
静止画をまとめて標準出力に書き出すことはできそうなので,標準入力からの複数の静止画を
avconvが認識できれば簡単に実現できそうな気がするのですが.
0025名無しさん@お腹いっぱい。
2012/11/24(土) 16:41:34.97↓
動画編集ソフト
http://toro.2ch.net/test/read.cgi/unix/1055825616/
0026名無しさん@お腹いっぱい。
2012/11/24(土) 20:36:48.33良い事を教えてやろうwebブラウザでhttp://www.google.com/を開くんだ。
まんなかにテキストボックスがあらわれるから
ffmpeg jpeg
ここまで入れれば候補に
ffmpeg jpeg 動画
がでてくるから、それをクリックする。あとは上から順番に開いていけばいい。
わかったか? http://www.google.com/はブックマーク(お気に入り)しとくと捗るぞ。
0027名無しさん@お腹いっぱい。
2012/11/24(土) 21:15:55.690028名無しさん@お腹いっぱい。
2012/11/25(日) 03:38:19.250029名無しさん@お腹いっぱい。
2012/11/25(日) 09:34:07.710030名無しさん@お腹いっぱい。
2012/11/28(水) 00:27:12.03まず、以下のファイルがあります。
--------
$ 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と表示されるはずなのですが、
なぜ表示されないのでしょうか?表示するためにはどうすればいいでしょうか?
0031名無しさん@お腹いっぱい。
2012/11/28(水) 00:52:03.02パイプ使うとサブシェルが作成されるから。この場合ループの中身はサブシェルで実行される。
bashでこれを避けるにはcatとパイプの代わりに<でファイルを渡せばいい。
#!/bin/sh
while read -r line
do
alldata=$alldata$line
done < hoge.dat
echo $alldata
0032名無しさん@お腹いっぱい。
2012/11/28(水) 00:54:33.58#!/bin/sh
alldata=`cat hoge.dat | (while read -r line
do
alldata=$alldata$line
done; echo $alldata)`
echo $alldata
あんまりエレガントじゃないか
0033名無しさん@お腹いっぱい。
2012/11/28(水) 01:02:24.570034名無しさん@お腹いっぱい。
2012/11/28(水) 07:45:45.490035名無しさん@お腹いっぱい。
2012/11/28(水) 09:52:28.20while read -r line
do
alldata=$alldata$line
done <<EOF
`cat hoge.dat`
EOF
0036名無しさん@お腹いっぱい。
2012/11/28(水) 10:07:00.100037名無しさん@お腹いっぱい。
2012/11/28(水) 21:38:42.240038名無しさん@お腹いっぱい。
2012/11/28(水) 23:36:34.31これじゃだめ?
#!/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
0039>>30
2012/11/29(木) 01:07:49.13なぜ、期待どおりにならないか理解しました。
ちなみに、こういうやりかたもありますね。
-----------
for line in `cat hoge.dat`
do
alldata=$alldata$line
done
echo $alldata
-----------
0040名無しさん@お腹いっぱい。
2012/12/02(日) 21:10:12.06sed -n 'H;${g;s/\n//gp}' hoge.dat
0041名無しさん@お腹いっぱい。
2012/12/06(木) 22:17:50.48環境は 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$)の挙動がよく分かりません.
どう解釈すればいいのでしょうか?
0042名無しさん@お腹いっぱい。
2012/12/06(木) 22:24:28.37このように展開される
$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
0043名無しさん@お腹いっぱい。
2012/12/06(木) 22:32:45.24ああ、よく分かりました。ありがとうございます。
0044名無しさん@お腹いっぱい。
2012/12/06(木) 22:33:08.64手元で動作を確認する限り
2$ は {} の展開を先にしてる
つまり $a_a $a_b $a_c としてから変数の処理
=> 何も出力されない
3$ も同様
$a $a_a $a_b $a_c としてから変数の処理
=> $a だけ定義されてるから foo が出力
どこかマニュアルに展開の優先順位があるかもしれないがそれは確認してない
004544
2012/12/06(木) 22:34:57.60すまない...
0046名無しさん@お腹いっぱい。
2012/12/07(金) 14:07:46.57bash_historyって何行ぐらいにしている?
直近のhistory | grep hoge | lessってするなら3桁の900行で十分だよね。
もうちょっと前のも検索したいなら4桁の9900行。 # 自分は余裕もってこれ。
9366$
メモリ食いそうだから、スクリプトを組んで今までの全部の履歴十数万行を検索するのも
超ひさしぶりのコマンド用途としてはありそう。その超ひさしぶりに使うコマンド用途なら
# とコメントをつけておくとちょっと使いやすいかも。
0047名無しさん@お腹いっぱい。
2012/12/07(金) 14:16:03.490048名無しさん@お腹いっぱい。
2012/12/07(金) 14:57:28.68端末複数開いてたら消えちゃうし
いつ打ったかの時間情報ないし
あんまり意味がないよね
0049名無しさん@お腹いっぱい。
2012/12/07(金) 15:29:36.16> ヒストリーは何行にしてても
> 端末複数開いてたら消えちゃうし
自分の力量の視野の狭さだとちゃんとexitって閉じると残るよ。
> いつ打ったかの時間情報ないし
> あんまり意味がないよね
時間情報は環境変数の設定で秒数まで残るかな。秒数の小数点はスクリプトで工夫すれば
残せそうかな。そこまでの必要性がないからやっていないけど。
0050名無しさん@お腹いっぱい。
2012/12/07(金) 15:43:25.010051名無しさん@お腹いっぱい。
2012/12/07(金) 17:11:43.25#!/bin/sh
コマンド1
コマンド2
history
と書いて実行してもhistoryが何も表示されない><
■ このスレッドは過去ログ倉庫に格納されています