シェルスクリプト総合 その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/
0073名無しさん@お腹いっぱい。
2014/11/27(木) 14:31:21.58一回動けばそれでいい使い捨てのスクリプトもある
それだけの話っしょ
0074名無しさん@お腹いっぱい。
2014/11/27(木) 14:32:04.950075名無しさん@お腹いっぱい。
2014/11/27(木) 14:43:04.360076名無しさん@お腹いっぱい。
2014/11/27(木) 15:06:22.08自分しか使わないマシンでも他人にメンテをお願いする
前提で書かないとならないのかい?
むしろメンテ側の人間には全く関係ない話しなんだが。
0077名無しさん@お腹いっぱい。
2014/11/27(木) 15:08:35.87一ヶ月前の自分は他人と思えって諺があってだな
個人的には自分のコードを汚く書いてしまったせいで泣くはめになったことも良くある
0078名無しさん@お腹いっぱい。
2014/11/27(木) 15:12:04.960079名無しさん@お腹いっぱい。
2014/11/27(木) 15:23:18.84良い師匠に巡り会ったじゃない。
もし1ヶ月前の自分が完全無欠なら精進の可能性を断たれるな。
0080名無しさん@お腹いっぱい。
2014/11/27(木) 17:23:22.210081名無しさん@お腹いっぱい。
2014/11/27(木) 17:40:12.560082名無しさん@お腹いっぱい。
2014/11/27(木) 18:27:07.180083名無しさん@お腹いっぱい。
2014/11/27(木) 19:50:57.590084名無しさん@お腹いっぱい。
2014/11/28(金) 00:13:06.85書いた「つもり」だからだろ
0085名無しさん@お腹いっぱい。
2014/11/28(金) 00:35:46.310086名無しさん@お腹いっぱい。
2014/11/28(金) 05:41:19.53シェルスクリプトに問題が出て治す必要があるなら
最初から書いた方が良いよ、、その時の実力で
最良のものが書ける。
1度書いた流れなら数年経っても頭に残ってるから
高速で仕上がるし、できた物を比べても大した違いは無い事も多い。
駆け出しの頃の書き物はまったく変わるのかもしれないが
それはそれで、全く変わらないと困るだろ。
過去の駄作に手をいれてジタバタしたって無駄
0087名無しさん@お腹いっぱい。
2014/11/28(金) 08:44:15.84「これこういう風に変えられない?」とか言われて白目になったことはある。
もちろん一般化できる話じゃないとは思うけど。
0088名無しさん@お腹いっぱい。
2014/11/28(金) 12:08:04.77echo "1^M2"で2しか表示されません何故ですか?
echo "1\r2"もそうでした
echo "1\n2"はちゃんと改行されて1と2が表示されました
^M \r \nってどう使い分けるものですか?
^MはCTRL+V CTRL+Mで入力しました
0089名無しさん@お腹いっぱい。
2014/11/28(金) 12:22:58.74\nと^Jは同じでLF。
CRとLFの違いは自分で調べろ。
0090名無しさん@お腹いっぱい。
2014/11/28(金) 12:35:54.36LFは低周波であることはわかりましたが、
そこから先がわかりません、よろしく女教授ください。
0091名無しさん@お腹いっぱい。
2014/11/28(金) 12:50:56.72CRとLFやタブストップなどは
機械式タイプライター由来なので、一度現物を見れば忘れない
ヤフオクで1000円くらいで手に入るから買ってみるといいよ
私女だけど
0092名無しさん@お腹いっぱい。
2014/11/28(金) 13:03:16.650093名無しさん@お腹いっぱい。
2014/11/28(金) 13:54:56.36Linuxは0xJで改行、BSDは0xMで改行しますよね。
どうしてこういう違いができたんでしょう?
簡単に返還する方法はありますか?
0094名無しさん@お腹いっぱい。
2014/11/28(金) 14:34:44.34これってHP依存コマンドだっけ?
0095名無しさん@お腹いっぱい。
2014/11/28(金) 14:46:02.61ある
ちょっとは調べろよ
0096名無しさん@お腹いっぱい。
2014/11/28(金) 15:13:15.53改変コピペにかまうな
009788
2014/11/28(金) 20:10:29.27例えば
a<CR>
b<CR>
だったらbしか表示されないってことですか?
0098名無しさん@お腹いっぱい。
2014/11/28(金) 20:11:01.930099名無しさん@お腹いっぱい。
2014/11/28(金) 20:12:58.92http://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%AA%E3%83%83%E3%82%B8%E3%83%BB%E3%83%AA%E3%82%BF%E3%83%BC%E3%83%B3
この辺の話ね。
0100名無しさん@お腹いっぱい。
2014/11/28(金) 20:20:08.060101名無しさん@お腹いっぱい。
2014/11/28(金) 20:30:52.68組み込みでもCR改行の場合がある。
LFで良いだろうぜぇ…といつも思うわ
0102名無しさん@お腹いっぱい。
2014/11/28(金) 21:00:51.140103名無しさん@お腹いっぱい。
2014/11/28(金) 21:47:52.95>>102に許可が射るのか?
0104名無しさん@お腹いっぱい。
2014/11/28(金) 22:03:40.21その次に通る道はBOM…だったけど最近はWindows触ってないから今どうなってるのか分からん
0105名無しさん@お腹いっぱい。
2014/11/28(金) 22:38:41.11こんな反応じゃダメ?
0106名無しさん@お腹いっぱい。
2014/11/28(金) 23:06:22.07HTMLはWindowsで作ってるらしくgrepとsedで抽出したあとCRのごみがついてることに気がついた
なのでCR削除したんだけどsambaで共有してるディレクトリに置いていたファイルを
メモ帳で開くことがあってまたぐちゃぐちゃに、まあTeraPadとかで開けばいいんだけど
環境に依存してしまうので再度CRくっ付けて解決したな
0107名無しさん@お腹いっぱい。
2014/11/28(金) 23:11:48.200108名無しさん@お腹いっぱい。
2014/11/28(金) 23:48:34.230109102
2014/11/29(土) 00:39:08.93そのあたりから定期的に張られる改変コピペだろうと思っただけなんだが
今回やたらみんな親切だから気になっただけだ
0110名無しさん@お腹いっぱい。
2014/11/29(土) 00:48:29.810111名無しさん@お腹いっぱい。
2014/11/29(土) 01:05:04.710112名無しさん@お腹いっぱい。
2014/11/29(土) 01:37:27.481\r2
0113名無しさん@お腹いっぱい。
2014/11/29(土) 01:49:55.580114名無しさん@お腹いっぱい。
2014/11/29(土) 01:50:33.860115名無しさん@お腹いっぱい。
2014/11/29(土) 06:46:31.93おそらくいつものコピペ荒らし
http://peace.2ch.net/test/read.cgi/unix/1413122189/276
0116名無しさん@お腹いっぱい。
2014/11/29(土) 09:29:20.23その後誘導されてこっちに移動してきた
0117名無しさん@お腹いっぱい。
2014/11/29(土) 10:00:47.020118名無しさん@お腹いっぱい。
2014/11/29(土) 10:56:38.770119名無しさん@お腹いっぱい。
2014/11/29(土) 11:00:44.61これいやらしくて自分も引っかかったんだけど
>>112はshで目的の動作をしてbashだとだめなんだよな
自分はシェルがbashでスクリプトはshなんだけど
実行結果が違うから引っかかって結構悩んだ
0120名無しさん@お腹いっぱい。
2014/11/29(土) 12:05:12.750121名無しさん@お腹いっぱい。
2014/11/29(土) 12:07:01.300122名無しさん@お腹いっぱい。
2014/11/29(土) 12:12:50.640123名無しさん@お腹いっぱい。
2014/11/29(土) 12:27:45.780124名無しさん@お腹いっぱい。
2014/11/29(土) 13:00:19.16printfを使うか>>114のように展開するのがいいみたいね
https://fumiyas.github.io/2013/12/08/echo.sh-advent-calendar.html
http://mattintosh.hatenablog.com/entry/2013/12/11/201503
0125名無しさん@お腹いっぱい。
2014/12/04(木) 14:50:44.760126名無しさん@お腹いっぱい。
2014/12/05(金) 07:55:18.64http://stackoverflow.com/questions/15461737/how-to-execute-xpath-one-liners-from-shell
http://stackoverflow.com/questions/4680143/how-to-parse-xml-using-shellscript
0127名無しさん@お腹いっぱい。
2014/12/07(日) 12:25:15.01現在下記のようなシェルスクリプトを書いています。
trap 'echo "ERROR!!" ; exit 1' ERR
hoge 2>&1 | tee test.log
hoge2 2>&1 | tee test.log
hoge3 2>&1 | tee test.log
hoge4 2>&1 | tee test.log
コマンド結果の標準出力と標準エラー出力の両方を
ログファイルに残したいのですが
この場合、最初のコマンドで戻り値に1が返されても
次のteeコマンドで戻り値が0になってしまうため
trapで適切にエラーハンドリングできない状態です。
pipestatus使えば何とかなりそうなのですが
その場合コマンドを実行するたびにif文で
pipestatusを評価する必要があるため、冗長に感じてしまいます。
そのためもしより良い解決方法がありましたらご教授いただけませんか。
0128名無しさん@お腹いっぱい。
2014/12/07(日) 12:45:10.31err_and_exit () {
trap 'echo "ERROR!!" ; exit 1' ERR
eval "$@"
}
err_and_exit 'hoge' 2>&1 | tee test.log
0129名無しさん@お腹いっぱい。
2014/12/07(日) 13:35:25.85全部まとめて tee して、コマンドは && でつなげばエラーがあれば途中で打ち切ってくれるよ。
( hoge && hoge2 && hoge3 && hoge ) 2>&1 | tee test.log
0130129
2014/12/07(日) 13:37:42.00( hoge && hoge2 && hoge3 && hoge4 ) 2>&1 | tee test.log
0131名無しさん@お腹いっぱい。
2014/12/07(日) 17:01:01.110132名無しさん@お腹いっぱい。
2014/12/07(日) 17:03:41.55#!/bin/bash
exec > >(tee test.log) 2>&1
trap 'echo "ERROR!!" ; exit 1' ERR
hoge
hoge2
hoge3
hoge4
0133名無しさん@お腹いっぱい。
2014/12/07(日) 17:16:16.20set -e
false | true
echo 'set -e してもパイプ下流が真だと終了しないよw'
0134名無しさん@お腹いっぱい。
2014/12/07(日) 21:22:56.83お礼が遅くなりましたが、ご回答ありがとうございました。
今回用途としてはコマンドを実行してエラーが発生した段階で
スクリプトを終了させたかったため、下記のような記述に変更しました。
(hoge && hoge2 && hoge3 && hoge4 ) 2>&1 | tee test.log
[ ${PIPESTATUS[0]} - ne 0 ] && exit 1
hoge5
hoge6
>>127と比べると「tee test.log」の重複した記述もなくなったので
少しすっきりしたように感じます。
良い解決方法を教えていただき、ありがとうございました。
0135名無しさん@お腹いっぱい。
2014/12/11(木) 09:38:51.84なんだか勇気づけられた
ありがとう
0136名無しさん@お腹いっぱい。
2014/12/12(金) 12:07:03.36かしてください。
テキストの処理で、数千kBほどのテキストファイルをスクリプト
で処理したいと思っています。環境はCENTOS6.5(i686,32ビット)
で、シェルはBASHです。
シェルスクリプトの最初の方で得られた変数があり、これは動的に変化
します。
START="`grep start`"(←実際はgrepのあとにも処理あり)
END="`grep end`"
二つには行番号が入っており、これをsedのアドレスの指定に使って
START行からEND行までを削除させたいのです。この段階でデバグ
のため、START、ENDともスクリプト途中にechoで表示させて値が
きちんと入っているのを確認しています。
具体的には
sed -e "$START,$ENDd" /dir/file
を実行させても、sedは「,」が未知のコマンドです、と言ってき
ます。
sed -e "${START},${END}d" /dir/file
でも
sed -e '"${START}","${END}"d' /dir/file
でも駄目でした。sedが$を最終行と勘違いしているのかと
sed -e "\$START,\$ENDd" /dir/file
としてみても、これも駄目でした。
そもそも、sedのパラメータには変数は使えないのでしょうか?
同じ事がスクリプト中でできれば、sedでなくても構いませんが。
他におもいつきません。
ネットを検索すると、sedの置換(sed 's/$A/$B/'とか)ではそ
ういう例もあるようですが。よろしくお願いします。
0137名無しさん@お腹いっぱい。
2014/12/12(金) 12:30:40.72sed ${START},${END}d /dir/file
で行けるよ。
変数 START ENDに余分なスペースが入ってないか注意。
スペース取るには、
START=`echo $START`
END=`echo $ECHO`
で、代入し直す。
0138名無しさん@お腹いっぱい。
2014/12/12(金) 12:34:18.14sed "${START},${END}d" /dir/file
0139名無しさん@お腹いっぱい。
2014/12/12(金) 12:39:48.69END=2
printf "foo\nbar\nbaz\n" | sed "${START},${END}d"
=> baz
printf "foo\nbar\nbaz\n" | sed " ${START} , ${END} d"
=> baz
0140名無しさん@お腹いっぱい。
2014/12/12(金) 12:44:39.31> sedは「,」が未知のコマンドです、と言ってき
これ、START 変数が undef か空っぽ("")なんじゃない?
set -x してからスクリプトを実行してみて確かめたほうがいいよ。
0141名無しさん@お腹いっぱい。
2014/12/12(金) 12:45:54.060142名無しさん@お腹いっぱい。
2014/12/12(金) 12:55:10.570143名無しさん@お腹いっぱい。
2014/12/12(金) 13:05:14.93sed: -e 表現 #1, 文字数 1: 未知のコマンドです: 「,」
0144名無しさん@お腹いっぱい。
2014/12/12(金) 14:02:50.73やさしきみなさん、コメントありがとうございます。
これからいじくってみて、あとで結果報告いたします。
0145名無しさん@お腹いっぱい。
2014/12/12(金) 14:35:13.48デバグ用の
echo $START
echo $END
の直後に、
START=`echo $START`
START=`echo $END`
を追加して実行したところ、な、な、なんと!
思い通りの結果が得られました。この一週間悩んだのが
たった2行の追加でクリアされました。なんかポカーン状態
ですが。。。
画面上では空白が入ってないように見えただけかもしれま
せん。>>137 さん助かりました。ありがとうございます。
>>139 さんの書かれたprintf文、参考になりました。まずこ
れを試してみるべきでしたね。
0146名無しさん@お腹いっぱい。 転載ダメ©2ch.net
2014/12/12(金) 14:52:02.24^Mのやつ
0147名無しさん@お腹いっぱい。
2014/12/12(金) 15:06:40.30これのことだったのか、がてんいきました。
0148名無しさん@お腹いっぱい。
2014/12/12(金) 15:38:25.84START=`echo $START`
やっても^Mは取れないから、違うと思うぞ
0149名無しさん@お腹いっぱい。
2014/12/12(金) 18:17:01.24あいだに要素を追加したりとか
0150名無しさん@お腹いっぱい。
2014/12/12(金) 19:08:12.460151名無しさん@お腹いっぱい。
2014/12/12(金) 19:58:42.72やればできると思うが、結構面倒だしな
>>150
テキスト要素とかタグ要素とか
0152名無しさん@お腹いっぱい。
2014/12/12(金) 20:44:30.25xslt使えよ
0153名無しさん@お腹いっぱい。
2014/12/13(土) 00:48:34.76「のようなこと」ってあるから別の何かかと思った
使ったことは無いんだけど、XMLgawkが便利そう
0154名無しさん@お腹いっぱい。
2014/12/13(土) 03:47:01.580155名無しさん@お腹いっぱい。
2014/12/15(月) 19:52:22.36知らなかった。。。ash系なのか、ダッシュ島系なのか
0156名無しさん@お腹いっぱい。
2014/12/15(月) 20:11:02.180157グールドの著作を読むなら原書で
2014/12/16(火) 15:34:56.67#!/bin/csh -f
### Compact wise program that extracts user's first name only from result of "finger" command on UNIX without any Admin rights ###
set who = `finger -m $user`
echo -n ' Hi '"$who[7]" echo '\!' (= Hi YOURNAME!)
# First name comes at 7th place divided by spaces
当時の基準で採点してみてください。当時はこういうユーザフレンドリなプログラム見かけなかったんだけど。環境が違えばあったのかな?
0158名無しさん@お腹いっぱい。
2014/12/16(火) 17:02:19.691993年ってもうSVR4とかある時代だからそんなに古くないし、スクリプト内容も見所がない。
何を採点して欲しいやら。
強いて言うと、
cshスクリプト - 大減点
echoコマンドを2回に分ける必要ない - 減点
echoコマンドのところ改行のコピペミス?
fingerコマンドの出力って環境によってたぶん違うよ。
ちなみにこちらの環境では finger の 4番目の位置にファーストネームが入る。
#!/bin/sh
set `finger -m $USER`
echo ' Hi '"$4"'!'
0159グールドの著作を読むなら原書で
2014/12/16(火) 17:23:03.61echoコマンドはこういう遣り方じゃないと勝手に改行が入って苦労しました。
!も特殊文字扱いだったということでしょう。
それはさておきいちいちwhoとか名前付けてsetしなくてよいということですね。
こういうプログラムって当時からやってました?
sfcって遅れたキャンパスだったので、他大学の工学部などでは常識でも
あのキャンパスでは非常識ということも多々あるかと思います。
とにかくHi [first name]っていうプログラムを動かしてたのは学内で自分だけでした。
プログラムの全体はLaTeXをエクステンション除いたファイル名だけ打ち込めば
任意のプリンタから自動印刷できるという内容なんですがね。
0160名無しさん@お腹いっぱい。
2014/12/16(火) 17:28:04.570161グールドの著作を読むなら原書で
2014/12/16(火) 17:38:54.20基本的な構造はAmazon.comなどで金になってる商売だから。
0162名無しさん@お腹いっぱい。
2014/12/16(火) 17:51:39.82どこにでも普通に転がってるスクリプトだし、なんの変哲もないヘボスクリプトの何を評価しろとw
0163グールドの著作を読むなら原書で
2014/12/16(火) 17:54:06.780164名無しさん@お腹いっぱい。
2014/12/16(火) 17:54:28.410165グールドの著作を読むなら原書で
2014/12/16(火) 17:58:23.520166名無しさん@お腹いっぱい。
2014/12/16(火) 18:23:54.80/etc/passwdは一般ユーザーでももともと読めるし、(たとえshadowでもパスワード部分以外は)
NIS使ってるならypcat passwdは一般ユーザーでもできるし。
何の新規性もない。
0167グールドの著作を読むなら原書で
2014/12/16(火) 18:38:28.60そうではなくて、大したことの無いアイデアが金になることがある、ということを強調している。
Amazon.com等々が誰かに金を払っているのは事実の筈だし。無論アドミン権限の中のプログラム
であってもデータから抜き出す作業は同じ。で、Amazonとかできた当初はHi某とか言ってこなかった
筈なので、そこら辺の経緯を知りたいわけ。日本語では英語名で抜き出すのは日本語名で抜き出す
よりは厄介な筈。他に方法いくらでもあるから。
0168名無しさん@お腹いっぱい。
2014/12/16(火) 18:43:25.430169名無しさん@お腹いっぱい。
2014/12/16(火) 20:12:06.60ちなみにBBSにおいてユーザーの識別子として一方向ハッシュを表示する手法を、提唱したのは俺だ。
0170名無しさん@お腹いっぱい。
2014/12/16(火) 21:46:14.47そこまで知りたいなら調べて報告してくれ
おしえてクンじゃなければね
0171名無しさん@お腹いっぱい。
2014/12/17(水) 00:10:11.34> Amazon.com等々が誰かに金を払っているのは事実の筈だし。
まず、このソースを出してくれ
0172名無しさん@お腹いっぱい。
2014/12/19(金) 14:14:12.27ってのがあったんだ。
知らなかった。。。ash系なのか、ダッシュ島系なのか
■ このスレッドは過去ログ倉庫に格納されています