シェルスクリプト総合 その24©5ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net
2014/11/11(火) 00:54:03.43□お約束
・特記なき場合は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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その23
http://peace.2ch.net/test/read.cgi/unix/1404204950/
0478名無しさん@お腹いっぱい。
2015/04/08(水) 00:23:18.58なんとか自己解決しましたそして>>477有難う
0479名無しさん@お腹いっぱい。
2015/04/08(水) 00:30:06.79for i in *; do cd $i; mv photo picture; cd ..;done
こうだ!!一つしか変わってなかったぜ
0480名無しさん@お腹いっぱい。
2015/04/08(水) 05:44:31.48for i in *; do mv "$i"/photo "$i"/picture; done
ディレクトリ名等にスペースが含まれていてもいいように $i は "$i" としておく。
0481名無しさん@お腹いっぱい。
2015/04/09(木) 06:55:16.580482名無しさん@お腹いっぱい。
2015/04/09(木) 08:37:12.980483名無しさん@お腹いっぱい。
2015/04/09(木) 19:49:27.510484名無しさん@お腹いっぱい。
2015/04/09(木) 22:21:14.400485名無しさん@お腹いっぱい。
2015/04/09(木) 23:52:38.50http://x68000.q-e-d.net/~68user/unix/pickup?rename
util-linuxのrenameコマンドの場合
rename -v photo picture */photo
Debian系だと正規表現指定、できるかは不明
https://wiki.ubuntulinux.jp/UbuntuTips/FileHandling/RenameCommand
FreeBSDだとsysutils/renameで正規表現指定、できるかは不明
http://www.freshports.org/sysutils/rename/
0486名無しさん@お腹いっぱい。
2015/04/15(水) 08:31:50.31$> printf ${TIME:5:11}
04/15
$> echo ${TIME:5:11}
04/15 08:25
$> printf "${TIME:5:11}"
04/15 08:25
罠だ、はまった。。。
0487名無しさん@お腹いっぱい。
2015/04/15(水) 08:45:36.46シェル変数の展開時には " " でかこんで "${HOGE...}" にするのが基本。
0488名無しさん@お腹いっぱい。
2015/04/15(水) 08:48:00.87date '+%m/%d %H:%M'
にした方がいいのでは?
0489名無しさん@お腹いっぱい。
2015/04/15(水) 08:48:10.66$ printf "${TIME:5:11}"
04/15 08:25
$ printf "%s %s\n" ${TIME:5:11}
04/15 08:25
0490名無しさん@お腹いっぱい。
2015/04/15(水) 09:14:12.79$ printf ${TIME:5:11}
04/15
$ /usr/bin/printf ${TIME:5:11}
04/15/usr/bin/printf: warning: ignoring excess arguments, starting with `08:25'
$ type printf
printf is a shell builtin
0491名無しさん@お腹いっぱい。
2015/04/15(水) 13:25:09.88$ printf ${TIME:5:11}
04/15
$ IFS="wanada"
$ printf ${TIME:5:11}
04/15 13:30
0492名無しさん@お腹いっぱい。
2015/04/15(水) 13:48:45.04$ TIME="2015/04/15 08:25:16"
$ printf ${TIME:5:11}
sh: Bad substitution
$ IFS='/ :'
$ set $TIME
$ echo $2/$3 $4:$5
04/15 08:25
0493名無しさん@お腹いっぱい。
2015/04/16(木) 23:26:24.70$ TIME="2015/04/15 08:25:16"
$ date '+%m/%d %H:%M' --date="${TIME}"
04/15 08:25
0494名無しさん@お腹いっぱい。
2015/04/30(木) 23:24:48.530495名無しさん@お腹いっぱい。
2015/05/07(木) 20:52:12.51でも、エラー処理に困っています。例えば、ffmpegで作ったファイルが壊れているかどうかわからないのです。
ffmpegはファイルとログを出してくれるのでログの特定の文字(たとえば、bad header、skip)が出てきたときに、
その時のログを書き出し、そのログを使って処理を分岐させることは可能なのでしょうか?
このときffmpegは終了コードは0を返してきました。プログラムによっては終了コード1を返してしてくるものもありました。
0496名無しさん@お腹いっぱい。
2015/05/07(木) 20:53:06.510497名無しさん@お腹いっぱい。
2015/05/07(木) 21:54:28.34ffmpegは最後に 2>&1 を付ける
付ければログをgrepとかできる
0498名無しさん@お腹いっぱい。
2015/05/08(金) 20:35:13.720499名無しさん@お腹いっぱい。
2015/05/08(金) 22:13:16.560500名無しさん@お腹いっぱい。
2015/05/08(金) 22:36:52.79man見てくれよせめて--helpとかググるとかしろよ
0501名無しさん@お腹いっぱい。
2015/05/09(土) 12:39:02.61書き込みの内容見てる限りは無理だと思うけど
ffmpeg xxxx > xxxx.log 2>&1
cat xxxx.log | grep "bad header"
if [ $? -ne 0 ]
then
# エラー処理
fi
0502名無しさん@お腹いっぱい。
2015/05/09(土) 12:42:06.410503名無しさん@お腹いっぱい。
2015/05/09(土) 13:01:23.550504名無しさん@お腹いっぱい。
2015/05/09(土) 13:11:39.85判定が1種類だと思ってるアホ発見
0505名無しさん@お腹いっぱい。
2015/05/09(土) 13:25:48.27二種類あるとどうなるわけ?w
0506名無しさん@お腹いっぱい。
2015/05/09(土) 13:26:22.670507名無しさん@お腹いっぱい。
2015/05/09(土) 13:32:28.84わかった、こいつ馬鹿だから、catがどう無駄なのかわかってないんだ。
なるほどなー、馬鹿だなーw
0508名無しさん@お腹いっぱい。
2015/05/09(土) 15:56:32.15if ! grep "bad header" <xxxx.log
then
# エラー処理
fi
0509名無しさん@お腹いっぱい。
2015/05/09(土) 18:51:16.11fi
0510名無しさん@お腹いっぱい。
2015/05/09(土) 20:08:36.31case $? in 0) echo "Match";; 1) echo "No match";; *) echo "Error";; esac
0511名無しさん@お腹いっぱい。
2015/05/11(月) 21:15:37.13これだと判定のたびにログを全部読み直すから無駄無駄
0512名無しさん@お腹いっぱい。
2015/05/11(月) 22:56:21.16どう直せばいいと思う?
0513名無しさん@お腹いっぱい。
2015/05/12(火) 18:27:59.13for i in $@
do
command
echo ○○中××番目を処理中です。
done
としたいのですが、○○と××はどうすれば表示できるようになりますか?
0514名無しさん@お腹いっぱい。
2015/05/12(火) 19:54:49.92for i in $@にカレントディレクトリだけじゃなく
そのサブディレクトリのファイルを送るにはどう書けばよいのですか?
0515名無しさん@お腹いっぱい。
2015/05/12(火) 19:59:27.57count=1
for i in $@
do
echo "$#中${count}番目を処理中です。"
command
count=$(($count + 1))
done
0516名無しさん@お腹いっぱい。
2015/05/12(火) 20:00:20.690517名無しさん@お腹いっぱい。
2015/05/12(火) 20:18:46.18in $@ は無駄だな
0518名無しさん@お腹いっぱい。
2015/05/13(水) 06:35:40.84count=$(($count + 1)) の行自体も無駄とは言わないけどbashなら不要だな。
echo "$#中$(( count++ ))番目を処理中です。"
0519名無しさん@お腹いっぱい。
2015/05/13(水) 07:02:23.50可読性・保守性が悪いから却下
0520名無しさん@お腹いっぱい。
2015/05/13(水) 07:23:59.830521名無しさん@お腹いっぱい。
2015/05/13(水) 07:39:14.30それだと肝心の $@ の処理ができないじゃん、本末転倒。
0522名無しさん@お腹いっぱい。
2015/05/13(水) 08:39:25.96for ((i=1;i<=$#;i++)); do eval item=\${$i};echo "${#}中${i}番目($item)を処理中"; done
0523名無しさん@お腹いっぱい。
2015/05/13(水) 13:58:41.25もしかしてtelnetのような感じの方法になってスマートには無理なのだろうか?
0524名無しさん@お腹いっぱい。
2015/05/13(水) 17:11:23.00http://blog.sarabande.jp/post/88910085203
0525名無しさん@お腹いっぱい。
2015/05/13(水) 17:26:02.420526名無しさん@お腹いっぱい。
2015/05/13(水) 17:49:35.48調べればいいのにと思ったのに
実装されてるコードそのものが欲しかったのね
キミのレベルに合わせられなくてごめんね
0527名無しさん@お腹いっぱい。
2015/05/13(水) 17:52:16.160528名無しさん@お腹いっぱい。
2015/05/13(水) 19:45:16.01サブディレクトリのほうは無理のでしょうか?
0529名無しさん@お腹いっぱい。
2015/05/14(木) 01:27:00.37$ hogehoge.sh * カレントディレクトリのファイルだけ
$ hogehoge.sh $(find) カレントとサブディレクトリ全部
0530名無しさん@お腹いっぱい。
2015/05/14(木) 02:06:32.75できないなんて話は最初からどこにもないしなあ。
送信と受信の違いというかプロトコル自体が違うんだから参考になるかどうか。
0531名無しさん@お腹いっぱい。
2015/05/14(木) 05:00:09.66脳内で>>524=>>527って妄想でもしたか?
0532名無しさん@お腹いっぱい。
2015/05/14(木) 06:30:49.15IFS=$'\n'
set -- $( find . -type f )
count=0
for i
もしくは、
IFS=$'\n'
fileList="$( find . -type f )"
fileLength=$( echo "$fileList" | wc -l )
count=0
for i in ${fileList}
ところで、v="$( )" のダブルクォートって無駄かな?
0533名無しさん@お腹いっぱい。
2015/05/14(木) 07:13:26.75それより、findでスペース入りファイル名が見つかった場合とかの対応ができてない。
0534名無しさん@お腹いっぱい。
2015/05/14(木) 07:25:46.50for f in * */* */*/* */*/*/*
って書いちゃった方が早いんだよな。どうせ階層は何段階か有限だし、
アスタリスクならスペース入りでも無問題。
0535名無しさん@お腹いっぱい。
2015/05/14(木) 07:27:50.46IFS=$'\n'
0536名無しさん@お腹いっぱい。
2015/05/14(木) 07:35:52.800537名無しさん@お腹いっぱい。
2015/05/14(木) 07:44:29.36それは
IFS=$'\n'
と書いてある時点で、自明じゃない?
指摘自体が無駄だな
0538名無しさん@お腹いっぱい。
2015/05/14(木) 07:46:27.900539名無しさん@お腹いっぱい。
2015/05/14(木) 07:49:42.88findに欲しいな。(スペースも改行もその他記号もちゃんとクォートして、シェルで評価すると元のファイル名に戻る形式)
(-print0 は xargs 用にしか使えないし)
0540名無しさん@お腹いっぱい。
2015/05/14(木) 08:06:46.69$ find . -print0 | while read -r -d $'\0' f; do echo $f; done
それから bash の組み込み関数 printf にある %q が使えるかも
bash$ help printf
:
%q quote the argument in a way that can be reused as shell input
0541名無しさん@お腹いっぱい。
2015/05/14(木) 09:04:56.240542名無しさん@お腹いっぱい。
2015/05/14(木) 09:46:33.11なぜそういう話になるのかよくわからんが、記載があるならぐだぐだ言うよりコピペで一発なんじゃないか?
0543名無しさん@お腹いっぱい。
2015/05/14(木) 10:26:05.550544名無しさん@お腹いっぱい。
2015/05/14(木) 10:28:14.98read: 1: Illegal option -d
0545名無しさん@お腹いっぱい。
2015/05/14(木) 10:36:47.40どの質問の話?
0546名無しさん@お腹いっぱい。
2015/05/14(木) 11:21:47.00どう違うのでしょか?
0547名無しさん@お腹いっぱい。
2015/05/14(木) 11:31:29.33このスレのネタなんて大抵記載がある筈だから。
0548名無しさん@お腹いっぱい。
2015/05/14(木) 12:13:05.970549名無しさん@お腹いっぱい。
2015/05/14(木) 12:15:56.28使う分には
・コマンド置換は再利用ができない
・シェル関数は再利用ができる
の違いがある
0550名無しさん@お腹いっぱい。
2015/05/14(木) 12:19:07.870551名無しさん@お腹いっぱい。
2015/05/14(木) 12:21:29.00ll
ってのがシェル関数。
hoge=`ls`
echo "$hoge"
ってのがコマンド置換。
どこも似てない。
0552名無しさん@お腹いっぱい。
2015/05/14(木) 12:25:28.020553名無しさん@お腹いっぱい。
2015/05/14(木) 12:45:56.980554名無しさん@お腹いっぱい。
2015/05/14(木) 13:19:51.910555名無しさん@お腹いっぱい。
2015/05/14(木) 13:27:28.77今回はbash限定でいい話しだよ。まあ、無駄じゃあないけど
>>513
> bashで
> bashで
> bashで
0556名無しさん@お腹いっぱい。
2015/05/14(木) 14:08:51.71単にとある使い方では等価に思えたってだけだろう。
重箱の隅が知りたいみたいな話だな。
0557名無しさん@お腹いっぱい。
2015/05/14(木) 14:28:51.820558名無しさん@お腹いっぱい。
2015/05/14(木) 14:47:51.260559名無しさん@お腹いっぱい。
2015/05/14(木) 18:12:58.96どんな使い分けをしたらいいのだろうと思っていました
0560名無しさん@お腹いっぱい。
2015/05/14(木) 19:43:10.96いや、その気持ちが分かるなら答えてやれよ。
さっぱり分からん人間には答えようがないんだから。
0561名無しさん@お腹いっぱい。
2015/05/14(木) 20:08:14.55期待通りの動作をしない場合がないのかだけ考えれば。
0562名無しさん@お腹いっぱい。
2015/05/14(木) 20:38:06.69わからなきゃ聞くしかなかろ。
気持ちの想像すらできなければ回答役なんて荷が重いから
黙って見守るべきだと思う。
0563名無しさん@お腹いっぱい。
2015/05/14(木) 20:54:02.91は?だからお前が適任だろ?って話をしてるんだが?
さてはお前どえらい馬鹿だな?
0564名無しさん@お腹いっぱい。
2015/05/14(木) 21:13:48.75気持ちの想像すらできないなんて言われるんですよ。
0565名無しさん@お腹いっぱい。
2015/05/14(木) 21:20:34.11なんか壮大な勘違いをしてるようだから言っとくけど
お前かなり性格悪そうに見えてるぞ
0566名無しさん@お腹いっぱい。
2015/05/14(木) 21:25:29.940567名無しさん@お腹いっぱい。
2015/05/15(金) 06:21:18.71echo $a
b () {a=A;echo $a;}
b
echo $a
unset a
(a=A)
echo $a
a=A
echo $a
unset a
# 以下zsh。
() {typeset a=A;}
echo $a
() {a=A;}
echo $a
0568名無しさん@お腹いっぱい。
2015/05/15(金) 07:08:32.050569名無しさん@お腹いっぱい。
2015/05/15(金) 08:03:24.42IMAPもPOP3も普通に使える
0570名無しさん@お腹いっぱい。
2015/05/15(金) 08:50:33.60b () (a=A;echo $a)
0571名無しさん@お腹いっぱい。
2015/05/15(金) 11:06:13.53あのコマンドはああするべきだったとか思うことはあるけど
曲がりなりにも期待した動作はしてたから問題ないと思い直した
0572名無しさん@お腹いっぱい。
2015/05/15(金) 13:23:55.72そう。そこに違いがある事が言いたかった。
0573隼人新聞社
2015/05/15(金) 17:26:05.10★民主 枝 野 は殺人を平気で行う極左テロ暴力団と親密交際があった!!!親密交際!テロの手先!北朝鮮の手先(安倍総理の談話)
★ 菅 直 人 は朝鮮人と親密交際、献金があった!!朝鮮韓国の傀儡手先(TVで報道!)
★民主は日教組の巣窟。極めて危険な団体、危険な政権だった!北朝鮮を熱烈に支援するのが日教組(信頼できる情報スジの話)!!北朝鮮の手先!
民主の基本姿勢は死刑廃止!!だから自民の安倍総理を支援してください!
サヨクと公明創価を応援するは地獄行き
サヨクを応援して1票入れた人は反省してください
0574名無しさん@お腹いっぱい。
2015/05/16(土) 18:18:52.70何らかの方法で次のコマンドに行かせる方法はありますか?
0575名無しさん@お腹いっぱい。
2015/05/16(土) 18:38:27.01tclだとexpect
ただ単純な事なら
command<<EOF
y
y
n
EOF
とかこんなんで処理できるよ。
0576名無しさん@お腹いっぱい。
2015/05/16(土) 18:41:48.45plamolinuxのこじま氏の2015/1/8の日記に少し使い方が書いてある。
■ このスレッドは過去ログ倉庫に格納されています