シェルスクリプト総合 その25at UNIX
シェルスクリプト総合 その25 - 暇つぶし2ch559:名無しさん@お腹いっぱい。
16/04/16 00:27:13.14 .net
>>532
と言ってたら、bashの脆弱性が見つかったのは数年前だね

560:名無しさん@お腹いっぱい。
16/04/16 05:01:00.01 .net
明日は我が身だが、2つの変数が両方とも空だった確率が0%じゃなければ、事故が起きてしまうな。
この場合は、どう書けばよかったの?
URLリンク(business.newsln.jp)
レンタルサーバー業者で、従業員のミスによりサーバー上の全データが削除されるという
あり得ない事態が生じたことが14日、英大手紙「Independent」の報道で明らかとなった。
このレンタルサーバー業者では、削除してしまったデータを復元するために、大手QAサイトのserverfaultに
「Recovering from a rm -rf /(rm -rf /から復元する方法を教えてください)」とする書き込みをすることで、
問題の解決方法を模索しているが「バックアップがない限り、復元は難しい」といった回答も寄せられている。
QAサイトのserverfaultでは、日ごろ、初心者からの質問から、かなりの高度な質問まで、様々な質問が寄せられるとただちに、
最適な回答が付く状態が続いているが、さすがのserverfaultの熟練回答者であっても
会社の全データを「rm -rf /」で削除した後にどのような有効な復元策を講じることができるのかは、回答に詰まる状況となっている。
このミスをしてしまったレンタルサーバー業者の管理人となるMarco Marsalaによると、
プログラム中で、「rm -rf {foo}/{bar} 」と指定することで全サーバーを対象に、特定のディレクトリーのファイルだけを削除するスクリプトを動かしたところ、
このプログラムのバグにより、特定のディレクトリーだけでなく、全てのディレクトリーが強制削除の対象になってしまったと説明している。
また、バックアップを事前に取っていなかったのかという質問については、
もちろんバックアップは取得していたが、この全削除のプログラムによりバックアップファイルも削除の対象となってしまったと述べている。
このレンタルサーバー業者は、1535のカスタマーを抱えているが、この事故の発生により、これら全てのカスタマーのファイルが無くなってしまった。

561:名無しさん@お腹いっぱい。
16/04/16 09:24:48.15 .net
だから/は変数の中に入れておけとあれだけ

562:名無しさん@お腹いっぱい。
16/04/16 10:06:55.21 .net
>>550
そういう問題ではない。

563:名無しさん@お腹いっぱい。
16/04/16 10:35:23.38 .net
>>551
だったらどういう問題?

564:名無しさん@お腹いっぱい。
16/04/16 10:51:02.13 .net
>>552
なんでテストしてないの?

565:名無しさん@お腹いっぱい。
16/04/16 11:15:01.02 .net
バグがあっても大丈夫な設計を心がけろという話なのに
なんでテストしていないという話になる?頭大丈夫か?

566:名無しさん@お腹いっぱい。
16/04/16 11:25:08.28 .net
あまりにアレで何か別のことを隠すためのうんたらかんたらを妄想してしまう記事だな

567:名無しさん@お腹いっぱい。
16/04/16 13:52:26.18 .net
>>554
設計があって、テストをしないのはありえません。

568:名無しさん@お腹いっぱい。
16/04/16 13:56:59.02 .net
>>554
だいたいそれは設計じゃないだろ。
ただのコーディングミスを防げために、コーディングミス用のロジックを書くのは阿呆すぎる。

569:名無しさん@お腹いっぱい。
16/04/16 14:43:59.32 .net
>>557
フェイルセーフとフールプルーフの違いを学べよ

570:名無しさん@お腹いっぱい。
16/04/16 15:25:19.31 .net
>>558
いかにもインフラの人間がいいそうなことだが、キミは開発側ではありえない助言をしている。

571:名無しさん@お腹いっぱい。
16/04/16 15:27:25.43 .net
検証もしないで、ぶっつけ本番でそういう構成になっているから大丈夫という考え方はインフラでもありえない。

572:名無しさん@お腹いっぱい。
16/04/16 15:28:05.09 .net
そもそも操作ミスではないじゃん。

573:名無しさん@お腹いっぱい。
16/04/16 16:30:24.50 .net
バックアップは特定の権限でしか消せないとか、削除可能な範囲を絞るとか
万が一のためインフラ側で制限しないとダメなんだよ
それでもダメなときはダメだし
設計・テストとかプログラムのみでの対応はコストだけが跳ね上がるし現実的ではない
ジョブ管理システムやコンパイラのバグが絡んでくるともうお手上げになる

574:名無しさん@お腹いっぱい。
16/04/16 18:08:55.67 .net
シェルスクリプトなのにコンパイラのバグ?

575:名無しさん@お腹いっぱい。
16/04/16 19:49:59.88 .net
例で示しただけだから別にインタプリタでもなんでもいいよ

576:名無しさん@お腹いっぱい。
16/04/17 01:23:14.24 .net
バグに絡まれやすそうな奴だな

577:名無しさん@お腹いっぱい。
16/04/17 07:15:51.53 .net
>>549
rm -rfはシェル関数で。直接使う事は禁則。
rmしないでmv。定期的に掃除

578:名無しさん@お腹いっぱい。
16/04/18 20:09:07.34 .net
>>549
URLリンク(japanese.engadget.com)

579:名無しさん@お腹いっぱい。
16/04/18 20:24:48.32 .net
ひでーw
__
タヒんでしまえよ

580:名無しさん@お腹いっぱい。
16/04/18 22:44:34.25 .net
シェルショッカーとかいうおじさんおるよな

581:名無しさん@お腹いっぱい。
16/04/25 19:04:26.09 .net
bashで、新しいscreenウィンドウを開いてそこで引数で指定したコマンドを実行する関数
を作りたいのですが、引数の展開をどうやればいいかで悩んでいます。
# 例:sc tail -f ./hoge.log
sc() {
# "cd $PWD; $@"ではダメだった
screen -t "$1" -X screen bash -c "cd $PWD; '$1' '$2' '$3' '$4' '$5' '$6' '$7' '$8' '$9'"
}
10個以上の引数に対応するにはどう書くのがいいでしょうか?

582:名無しさん@お腹いっぱい。
16/04/25 21:45:04.21 .net
>>570
"cd $PWD; $@" だと screen のコマンド全体が、
"screen" "-t" "$1" "-X" "screen" "bash" "-c" "cd $PWD; $1" "$2" ...
という引数に展開される。
これは "cd $PWD; $@" がまず、"cd $PWD; ""$@" に変換され、
"$@" が "$1" "$2" ... に展開されて
"cd $PWD; ""$1" が連結されて "cd $PWD; $1" になるため。
なお set - "$@" cd "$PWD" ";" "$@" したら、 screen に渡るのは ; までで肝心のコマンドは渡らない。
"cd $PWD; $*" だと "cd $PWD; $1 $2 $3 ..." (配列としては展開されずに1つの文字列扱いになる)
に展開されて意図した動きになる。 ただ、引数に空白が入る場合はエスケープ入れないとNGね。

583:570
16/04/26 19:09:31.05 .net
空白のエスケープはどうやればいいんでしょう?

584:名無しさん@お腹いっぱい。
16/04/26 19:43:17.56 .net
>>572
シングルクォートと空白の例。
sc() {
  screen -t "$1" -X screen bash -c "cd $PWD; $*"
}
sc date +Date=\\\'%y\\\ %m/%d

585:名無しさん@お腹いっぱい。
16/04/27 12:24:16.19 .net
...なんだかなあ
与えたスクリプトの中で、展開すれば?
sh -c 'some command; "$@"' 'dummy' "$@"

sc() {
  screen -t "$1" -X screen bash -c 'cd $PWD; "$@"' 'dummy' "$@"
}

586:570
16/04/27 19:13:45.99 .net
なるほど、dummy 以降が -c で与えたコマンドへの引数になることを利用するわけですね。
ちなみに
screen -t "$1" -X screen bash
は冗長で
screen -t "$1" bash
でいいみたいでした。

587:名無しさん@お腹いっぱい。
16/04/27 21:07:51.80 .net
-c の次の次の引数からが $0 以降になるとは知らなかったなぁ。 勉強になったわ。
これは -c AAA BBB CCC DDD ... のとき、BBB 以降は実行されないけど BBB が $0 として、
CCC DDD ... が引数としてセットされた状態でプロセスが開始され、実際に実行される内容の
AAA 内に展開されずに渡された "$@" があるので CCC DDD ... が実行されるってことかな。
ちなみに cd の部分は 'cd "'"$PWD"'"; "$@"' の方がいいかな。
( パスに空白が入っていてもエラーにならないがダブルクォーテーションが入っていたらNGではあるが。 )

588:名無しさん@お腹いっぱい。
16/05/12 21:13:45.79 .net
コマンド応答が返ってくるまでの表示に文字を回転させてりしてみたくなった。
例えば、「*」がくるくると回っていたり・・・

589:名無しさん@お腹いっぱい。
16/05/13 00:30:46.45 .net
ええね

590:名無しさん@お腹いっぱい。
16/05/13 19:21:12.15 .net
>>577
難しい…どなたかヒントを

591:名無しさん@お腹いっぱい。
16/05/13 20:19:09.81 .net
>>579
なんだよ、すごい目算があって開発宣言したと期待してたのに
まず、文字回すのは無理
/|\-を同じ位置で順番に繰り返す出す程度
あと、コマンド実行中は通常シェルはwait状態で止まってしまうので
コマンドをバックグラウンドで起動してシェルを動かし続けるか
別プロセスを同時に起動してそいつに表示させる必要がある
どっちもコマンドラインで明示しなきゃならん
普通に起動して同じことをさせるにはシェルの改造くらいしか思いつかん
それともzshくらいになるとすごいモジュールがあったりするのだろうか

592:名無しさん@お腹いっぱい。
16/05/13 20:43:34.11 .net
OpenGLでぐりぐり回そうぜ

593:名無しさん@お腹いっぱい。
16/05/13 20:57:15.29 .net
bash 依存だけど、こんなんでどう
sleep 10 & {
tput civis
while kill -0 %- &>/dev/null
do
for c in {-,/,\|,\\}
do
printf '%c\r' $c
sleep 0.1
done
done
tput cvvis
}
途中で interrupt されるとカーソルが見えないままになるけど

594:名無しさん@お腹いっぱい。
16/05/14 20:15:01.86 .net
npm見れば解決しそう

595:534
16/05/21 22:04:30.88 .net
>>535
お陰さまで最低限現場の記述ルールに則ったものは普通に作れるようになりましたm(_ _)m

596:名無しさん@お腹いっぱい。
16/05/23 00:15:19.48 .net
>>559
超遅レスだかインフラでも
そんな事言わないあり得ない偏見すごいな
>>558
が伝えたいニュアンスは分かるけど
端的に考え方を言い表したいがために
登場場面が根本的に違う2つの用語だけで
端的に伝えようとするセンスが酷い
それにそもそも元の話と何かズレてるし
後輩育成とかは絶対に任せられないタイプ

597:名無しさん@お腹いっぱい。
16/05/23 08:05:15.40 .net
ログファイルのローテート処理のお勧め教えれ
元ファイルをコピーしてヌルを上書きすると
一瞬ログの内容ロストするから

598:名無しさん@お腹いっぱい。
16/05/23 08:55:28.11 .net
>>586
ログを出す側で制御 (SIGHUPとかで出力ログファイルを開きなおす) してくれないとその問題は防げない。
mkfifo で FIFO ファイル作ってログローテーション用後続スクリプトに一旦渡す方法やパイプで後続スクリプトに
渡してローテーションする方法も考えられるけど、FIFO のバッファがいっぱいになるとメインプロセス側が処理
待ち(write がブロック)したり、後続スクリプトの異常終了で SIGPIPE 食らってメインプロセスが死んだりする
のでお勧めできないそうな。

599:名無しさん@お腹いっぱい。
16/05/23 16:33:22.23 .net
syslogdを kill -STOP; ... ; kill -CONT じゃダメなん?

600:名無しさん@お腹いっぱい。
16/05/23 17:04:28.65 .net
logrotateでええやろ

601:587
16/05/23 23:22:16.85 .net
>>588
syslogd がつかんでいるのはファイルハンドルであってファイルのパスじゃない。
なのでそれをやっても、リネームした古いファイルの方に書き続けてしまう。
例えば /var/log/messages に書き続けている状態でファイルを mv して messages.1 にしても、syslogdは
messages.1 の方に書き続ける。
kill -HUP するとファイルハンドルを閉じて /var/log/messages を開くので、ここでようやく messages 側に書き始めるわけ。
# STOP/CONT は意味がない。 logrotate では syslogd のログについては HUP しかしない。
>>589
logrotate の samba のログ設定には copytruncate って書いてあるでしょ?
つまり logrotate が >> 586 の言う「コピーしてファイルを空にする」処理をやっている。
samba は syslogd のような開きなおす処理をしてくれないからこの実装にせざるを得ない。

602:名無しさん@お腹いっぱい。
16/05/24 04:38:11.44 .net
>>590
kill -HUP に対応してないsyslogdだったら、という話だろ。
kill -STOP してからログファイルを別ファイルにcpして、元のログは > file でゼロにする。
それで -CONT すればいいという話。
>syslogd がつかんでいるのはファイルハンドルであってファイルのパスじゃない。
というのは当然知ってるだろ。

603:名無しさん@お腹いっぱい。
16/05/24 08:44:45.64 .net
スレ違いになりつつあるが、便乗して質問。
STOP -> truncate -> CONT って安全?
TCP/UDPで待ち受けしているプログラムで syn やメッセージ取りこぼしたりとかしない?
fork する奴にも使える?

604:名無しさん@お腹いっぱい。
16/05/24 09:37:37.23 .net
>>592
TCPなら再送含めてOSがうまくやる
UDPだとバッファあふれたら消える
もともと消えるの前提だから再送はアプリの自己責任
forkしたら止まるのは当たり前だが指定したプロセスだけ
プロセスグループを指定したら該当するやつ全部
どの辺が疑問なのかむしろ知りたいわ

605:592
16/05/24 20:11:40.98 .net
>>593
THX
> どの辺が疑問なのかむしろ知りたいわ
logrotate コマンドの copytruncate の欄に SIGSTOP すると良い、とは書かれていない
あたり、何か不都合があるんじゃないかと思うんだがどーよ?

606:名無しさん@お腹いっぱい。
16/05/24 22:53:24.96 .net
>>594
そいつとtcpもudpもforkも関係ないのになんで出てきた?

607:名無しさん@お腹いっぱい。
16/05/25 08:40:27.70 .net
tcp 再送は5分までいけるが、ロードバランサー/L7swの監視の場合にはファイルコピーしている
ちょっとした間にサービス停止として検知される可能性があるな。

608:名無しさん@お腹いっぱい。
16/05/25 15:06:05.26 .net
>>596
5分って、どこの標準か興味がある。

609:名無しさん@お腹いっぱい。
16/05/27 20:10:08.30 .net
>>586
普通は単純にリネームしてタッチする

610:名無しさん@お腹いっぱい。
16/05/28 12:10:25.23 .net
タッチして逮捕されたらリネームじゃないのか。

611:名無しさん@お腹いっぱい。
16/05/29 01:58:44.16 .net
つ 座布団

612:名無しさん@お腹いっぱい。
16/05/29 20:46:35.04 .net
ユニックスの入門本が一冊欲しいのですが何がいいでしょうか
特定のコマンドやシェルのノウハウとかではなく
多くの場面で通用する本当に基礎的な知識を学びたいと思っています
私自身はいずれシェルを書きたいと思っていますが
LS、CPコマンドなどの使い方を知りたいわけではないということです

613:名無しさん@お腹いっぱい。
16/05/29 20:57:27.92 .net
>>601
UNIXスーパーテキスト
ってまだ売ってたっけ?

614:名無しさん@お腹いっぱい。
16/05/29 21:40:46.70 .net
>>601
古い本だけど砂原秀樹さんほかの『プロフェショナルBSD』
UNIXのコマンドはこういうふうに使うという根本的なことの理解に役立つ

615:名無しさん@お腹いっぱい。
16/05/29 22:26:33.91 .net
スレチにも回答してあげるとは優しいやつばっかやな

616:名無しさん@お腹いっぱい。
16/05/29 23:19:55.20 .net
>>601
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
名著です。
これを挙げると古いとか文句を付ける馬鹿がいますが、無視してください。

617:名無しさん@お腹いっぱい。
16/05/29 23:20:36.49 .net
あげ

618:名無しさん@お腹いっぱい。
16/05/30 00:14:11.32 .net
>>604
お前の心が汚れているだけだ

619:名無しさん@お腹いっぱい。
16/05/30 03:08:51.89 .net
shell から emacs 起動して終了すると、
[1] Done emacs
って出るよな?これって何が出しているんだろう?出来れば止めたい。

620:名無しさん@お腹いっぱい。
16/05/30 04:52:05.02 .net
>>608
set +m しておくと出なくなるよ。(出してるのはシェル自身)

621:名無しさん@お腹いっぱい。
16/05/30 09:25:10.53 .net
vim7.4使ってますが、書き込み時、sh -n みたいな、構文・文法チェックを
する方法はないでしょうか?
vimプラグインのsyntasticも試してみたのですが、.vimrcの記述のせいか
うまく動いてないようで。
何か簡単でうまい方法ありましたら、ご紹介ください。

622:名無しさん@お腹いっぱい。
16/05/30 10:19:27.79 .net
>>609
どうもです。なるほどシェルが出しているのですか。
でも、なぜ emacs しか出ないのでしょう?
教えていただいた set +m 「ジョブ制御の無効」は bash のみでしょうか?
私は tcsh なのですが、tcsh でも同様の事は可能でしょうか?

623:名無しさん@お腹いっぱい。
16/05/30 18:00:07.40 .net
ひとつ質問
シェルで2つの日時を元に所要時間を求めたい場合ぐぐるといろいろ方法はありますが
これが便利なコマンド一発で用意されていないのは需要がないと言うか
需要があった人が最終的に誰でも使える簡単な形にせずに終わらせたってことなんでしょうか?

624:名無しさん@お腹いっぱい。
16/05/30 18:55:30.71 .net
>>612
広く使われるほどの需要はなかった

625:名無しさん@お腹いっぱい。
16/05/30 19:36:20.17 .net
dateコマンドのオプションに互換性がなかったから。
GNU date限定とかならいいんだけど

626:名無しさん@お腹いっぱい。
16/05/30 21:40:48.25 .net
内部的にUNIX時間で持てば差分計算は簡単なような

627:名無しさん@お腹いっぱい。
16/05/31 08:52:48.30 .net
>>615
32bitマシンが絶滅するまでは難しいな。
あと20年普通に残りそうだし

628:名無しさん@お腹いっぱい。
16/05/31 21:45:59.92 .net
内部的にUNIX時間で持つってどういうこと?
内部というのは環境変数やシェル変数という意味?

629:名無しさん@お腹いっぱい。
16/05/31 23:23:59.98 .net
256bit機が普及するまで32bit機はなくならないだろうね。

630:名無しさん@お腹いっぱい。
16/05/31 23:24:37.85 .net
>>617
epochからの時間ってことじゃない?
>>616
difftime(3)て32bitと64bitで違うのかな

631:超音波テロの被害者
16/06/01 16:02:45.59 .net
超音波テロの被害にあっています。
卑劣極まりない被害にあっています。
何が起こったかわからないときから、
わかってみれば、
まだ世の中に知られていない超音波テロ。
世の中の多数の振動源・発信源が
システム化され、 ネットワークを通して、
超音波・音波を集中させて
対象を攻撃するらしい。
超音波による物理的な力で、
ものが飛び、ものが壊れる。
それが人間の体に対してまで。
形のあるもの、ないもの、壊され、奪われ、
聞こえる声、音。超音波テロの加害者の声。
卑猥な内容、卑劣な内容、脅しやいたぶり。

632:超音波テロの被害者
16/06/01 16:03:08.53 .net
身体の表面を突き抜け、内臓を攻撃される。
頭蓋骨を突き抜け、意識を失わされる。
臓器不全やがん、命に関わることまで。
人間の身体を壊そうとする超音波テロ。
日本国中、どこにいても超音波で襲われる。
車に乗っている人間が襲われる。
歩いている人間が襲われる。
自宅で超音波の攻撃を受ける。
人や社会が超音波で襲われ、
罪もない人が超音波で襲われ、
卑劣な被害にあっています。
被害を訴えても信じてもらえない。
「見続けるのがいやだから、殺して終わる」、
「証拠隠滅だ」という超音波テロの加害者の声とともに
強烈な超音波の攻撃。
叫ばされ、いたぶられ、それを口実にまた攻撃され、
超音波テロの、残酷残虐で、卑劣な攻撃の被害にあっています。
心の底から被害を訴え、祈っています。
天に神に届きますように。

633:名無しさん@お腹いっぱい。
16/06/01 17:45:47.97 .net
>620
これなんつーシェルのスクリプトですか?

634:名無しさん@お腹いっぱい。
16/06/02 07:52:05.22 .net
/bin/jpsh

635:名無しさん@お腹いっぱい。
16/06/02 08:00:02.53 .net
/bin/chouonpa/itaburare

636:名無しさん@お腹いっぱい。
16/06/05 11:03:53.19 .net
ディレクトリを指定する時って、「/dir/」が正しいのか、「/dir」
にすべきか、最後の/をつけるかつけないかでどんな違いがあるのか
いつもすごく気になる。

637:名無しさん@お腹いっぱい。
16/06/05 13:34:06.57 .net
>>625
rsync や ln 、mv あたりはありなしで挙動がかわる。
ln や mv はオプションで一応制御できるけど

638:名無しさん@お腹いっぱい。
16/06/09 19:13:38.61 .net
json形式のデータをSQLのjoinみたいにキーで結合したいのですが
いいスクリプト知りませんか?
jqはできそうな感じなんだけど、サンプルのページが見当たらなくて

639:名無しさん@お腹いっぱい。
16/06/09 21:10:02.49 .net
>json形式のデータをSQLのjoinみたいにキーで結合したいのですが
cpanモジュール使うべし。
力技でゴリゴリでもできるかもしらんが、時間の無駄

640:名無しさん@お腹いっぱい。
16/06/09 22:45:45.43 .net
>>627
データがどんなもんか分からないので何とも言えないけど例えば
[
{"id": 1, "name": "Tom", "gender": 1},
{"id": 2, "name": "Alice", "gender": 2},
{"gid": 1, "gender": "male"},
{"gid": 2, "gender": "female"}
]
なんてJSONファイルがあって gender と gid で join する場合、
jq '
map(
(select(has("id")) | { k: .gender, v: { id: .id, name: .name }}),
(select(has("gid")) | { k: .gid, v: { geder: .gender }})
)
| group_by(.k)
| map((map(.v) | add))
' data.json
かなぁ。

641:629
16/06/10 01:11:22.91 .net
あー、しまった、思いっきり間違えた…
jq '
(map(select(has("gid")) | {(.gid|tostring): .gender}) | add) as $g
|
map (select(has("id")) | .gender = $g[(.gender|tostring)])
' data.json

642:名無しさん@お腹いっぱい。
16/06/10 01:28:18.48 .net
[
{
"id": 1,
"name": "Tom",
"gender": "male"
},
{
"id": 2,
"name": "Alice",
"gender": "female"
}
]
できました、できましたけど書き方わからないです><
>>628
cpan使うのが主流なんですか?

643:名無しさん@お腹いっぱい。
16/06/10 01:54:22.40 .net
>>631
json 形式のデータを DB に insert する方法を調べた方がいいかも

644:名無しさん@お腹いっぱい。
16/06/10 14:14:19.71 .net
>>631
いやそういうわけではなくて、pythonでもrubyでもいいけど
JSONとかXMLとかYAMLなどの定形式な文書からスライスして取
り出すなら、すでにある専用モジュールとか使ったほうが断然
速いってはなし。俺はperlしかわからんのでcpanモジュール。
perlなら
use JSON::XS;
して、
my $json = 'json.txt'
my $data = decode_json($json); #jsonからperlのハッシュに変換
あとは、ハッシュの内容をダンプしてデータ構造みながら
必要なデータだけを拾う。
print %$data{features}->[$cnt]->{properties}->{title} .

645:名無しさん@お腹いっぱい。
16/06/10 16:33:17.98 .net
使うべしって言った割にショボ過ぎ

646:名無しさん@お腹いっぱい。
16/06/10 22:15:34.82 .net
スレ的にもここはあくまでシェルスクリプトでやるべきだろ
なんでもありなら今はPythonの方がメジャー
もしくはRubyとか

647:名無しさん@お腹いっぱい。
16/06/10 23:07:20.19 .net
場違いだったらすまん。
gomプレイヤーとかのソフト立ち上げるとスクリプトエラー出るんだけどどうしたらいい?
URLリンク(imgur.com)

648:名無しさん@お腹いっぱい。
16/06/11 00:12:44.31 .net
スレチ

649:名無しさん@お腹いっぱい。
16/06/11 00:34:35.87 .net
スクリプトエラーとやらがでる

にちゃんでスクリプトで検索

シェルスクリプトとかよくわからんけどスクリプトって入ってるからここに書けば誰か完璧な答えを出してくれるはず

ゆとり、ここに極まれり

650:名無しさん@お腹いっぱい。
16/06/11 03:40:49.78 .net
引数を受けて同名のサブディレクリ直下にある全てのシェルスクリプト(.sh)を実行するってどう書けばいいんでしょうか?

651:名無しさん@お腹いっぱい。
16/06/11 03:41:43.14 .net
bash環境です。同名とは引数に指定された文字です

652:名無しさん@お腹いっぱい。
16/06/11 03:53:01.79 .net
find 引数 -name *.sh -exec {};
こんな感じなのだろうか。

653:名無しさん@お腹いっぱい。
16/06/11 04:14:09.33 .net
ありがとうございます
こんな感じで良いのかな?
find 引数 -maxdepth 0 -name *.sh -exec bin/sh -c ' {} ' \;

654:名無しさん@お腹いっぱい。
16/06/11 10:22:42.97 .net
シェルスクリプトじゃないけどrun-partsが似たような仕事するね

655:名無しさん@お腹いっぱい。
16/06/12 05:31:11.76 .net
for sh in $dir/*.sh; do $sh; done

656:名無しさん@お腹いっぱい。
16/06/12 11:11:52.76 .net
Cygwin(bash)で特定の拡張子の映像ファイルをforループ文でまわして処理したいと思っています
for input in *
do
 (処理)
done
これだと映像ファイルだけでなく全てのファイルが対象になってしまいます。
そうではなくて WMV、MP4、AVI、MPEG、MPGといった映像ファイルだけを
処理するにはどうしたらいいでしょうか?

657:名無しさん@お腹いっぱい。
16/06/12 11:15:55.66 .net
>>645
そもそもなんでファイルを振り分けてないのか?

658:名無しさん@お腹いっぱい。
16/06/12 11:25:58.85 .net
>>646
ffmpegで処理してるので映像ファイルの種類は分けなくても良かったりします
あ、ただ変換後の拡張子は統一するようスクリプトを書かないといけませんね

659:名無しさん@お腹いっぱい。
16/06/12 11:44:06.36 .net
>>645
for input in $(ls -1 *.{wav,mp4,avi,mpeg,mpg} 2>/dev/null)
do
 (処理)
done
とか。

660:名無しさん@お腹いっぱい。
16/06/12 11:52:44.28 .net
>>648
これじゃダメな場合があるんだっけ?
for input in *.wav *.mp4 *.avi *.mpeg *.mpg
do

done

661:名無しさん@お腹いっぱい。
16/06/12 12:07:38.74 .net
.wavファイルがないとinputには"*.wav"がそのまま入る
だけど、ループの中で処理する時に
[ -f "$input" ] || continue
とでもしとけばいいよね

662:名無しさん@お腹いっぱい。
16/06/12 12:36:44.21 .net
>>648
>>650
なるほど、そういう方法がありましたか。
ありがとうございますm(_ _)m
>>649
>>650さんのご指摘通りその拡張子のファイルが無いとそのまま入っちゃうって問題がありますね

663:名無しさん@お腹いっぱい。
16/06/13 20:14:40.91 .net
テキストファイルの最終行に改行がないときだけ
改行を追加するようなスクリプトってどう書けばいいでしょうか?

664:名無しさん@お腹いっぱい。
16/06/13 22:21:10.97 .net
>>652
それ、自分が前悩んで作ったのがある。誰か改善してくれ
#!/bin/sh
file=$1
test -f $file || exit 0
# if size -eq 0; then exit 0
if [ ! -s $file ]; then
 exit 0
fi
# if the last character is not \n, then echo
if [ "$(tail -c 1 $file | cat -A)" != "$" ]; then
 echo
fi
if ! tail -n 1 $file | grep '^$' > /dev/null ; then
 echo
fi

665:名無しさん@お腹いっぱい。
16/06/13 22:23:13.08 .net
test -n "$(tail -n1 TXT)" && echo > TXT

666:652
16/06/13 22:28:48.20 .net
すまない。>>653はmbox形式のファイルにメールを追加するために作ったスクリプトだった
だから>>652さんの求めているスクリプトとはちょっと違った_o_

667:名無しさん@お腹いっぱい。
16/06/13 22:49:39.12 .net
>>654
ファイルがぶっ壊れちゃったじゃないか(#゚Д゚) ゴルァ!!
なんつって

668:名無しさん@お腹いっぱい。
16/06/13 22:58:56.61 .net
>>653
ありがとうございます
最終文字を取り出して調べるというわけですね
いじれそうです
たぶんGNUのtailが必須じゃないかと思うのですが、
非GNU環境でも動くようにはならないでしょうか

669:名無しさん@お腹いっぱい。
16/06/13 23:07:30.48 .net
>>654
ありがとうございます
ただ、これは目的の動作ではありません
末尾に空行が欲しいのではなく、
改行文字で終わっていない最終行に改行をつけたいのです

670:名無しさん@お腹いっぱい。
16/06/14 00:26:19.34 .net
>>652
#!/bin/sh
echo wq | ed "$1"

671:名無しさん@お腹いっぱい。
16/06/14 00:51:00.50 .net
>>652
for f in *.txt
do
[ $(tail -1 "$f" | wc -l) -eq 0 ] && echo >> "$f"
done

672:名無しさん@お腹いっぱい。
16/06/14 00:57:30.09 .net
>>652
for f in *.txt
do
{ tail -1 "$f" | read; } || echo >> "$f"
done

673:名無しさん@お腹いっぱい。
16/06/14 02:14:34.40 .net
edかex使ったほうが楽なんじゃないか

674:名無しさん@お腹いっぱい。
16/06/14 02:55:20.33 .net
659 と 661 の違いは空ファイル(サイズ0)の場合。
ed はそのままだけど、tail -1 ... | read では newline が追加される。

675:名無しさん@お腹いっぱい。
16/06/14 17:09:51.68 .net
>>659-663
みなさんありがとうございます
edは思いつきませんでした
どこでもあるかと思ったらないのもありますね。exはありそうです
改行のない最終行がwcにカウントされないとか
改行がないとreadがエラーコード返すとか
すごくためになりました
空ファイルの動作の差についてはサイズを調べて分岐すればいいですね

676:名無しさん@お腹いっぱい。
16/06/15 01:17:10.55 .net
>>652
sed -i -e '$a\' file
URLリンク(unix.stackexchange.com)


677:of-a-file



678:名無しさん@お腹いっぱい。
16/06/15 02:02:23.61 .net
ed や sed で追加する場合は元々ファイルの末尾に "\n" があるファイルの
タイムスタンプを更新してしまうんだな

679:名無しさん@お腹いっぱい。
16/06/15 14:17:26.63 .net
おまえら知らんだろうけど、俺の家のそばの歩行者信号はUNIXのコンソールみたいに
青になるまで(赤になるまで)ドット(.)の点滅がひとつずつ消えていくんだぜ・・?
夜なんか見るとKDEみたいな感じですげえカッコイイぜ。

680:名無しさん@お腹いっぱい。
16/06/15 14:54:39.46 .net
眼科行けよ・・・

681:名無しさん@お腹いっぱい。
16/06/15 14:58:10.28 .net
日常生活の夜景にKDEを妄想する病気か。
IT土方の後遺症

682:名無しさん@お腹いっぱい。
16/06/15 17:06:08.30 .net
>>665
おお、これはシンプルですね
空ファイルでもちゃんと対応できています
man見てもそんな動作するとは明示されてないのですが
安定した仕様と考えていいのでしょうか

683:名無しさん@お腹いっぱい。
16/06/15 19:20:41.67 .net
$ <- 最終行
a <- add. 置換ならsが有名. pでprint
\ 何もない シェルスクリプトでも改行またぐときに使うやつ
類似した構文
seq 20 | head
seq 20 | sed -n '1,10p'

684:名無しさん@お腹いっぱい。
16/06/15 21:22:12.46 .net
それだったら
seq 20 | sed 10q
の方が良いかもしんない

685:名無しさん@お腹いっぱい。
16/06/16 01:11:19.56 .net
>>652
URLリンク(stackoverflow.com)
awk
{ rm file;awk 1 >file; }<file
bash
[[ $(tail -c1 file) && -f file ]]&&echo ''>>file

686:名無しさん@お腹いっぱい。
16/06/16 14:28:12.81 .net
>>673
おお、awkは明白でわかりやすいですね
改行抜きで読んだ各行を改行付きでprintするわけですね
その意味ではawkで完璧なcatはできないのかな
紹介していただいたページには他にもいろいろ解法があっておもしろいです
ありがとうございます

687:名無しさん@お腹いっぱい。
16/06/16 15:35:18.42 .net
grep + moreutils の sponge
$ grep '' file | sponge file

688:名無しさん@お腹いっぱい。
16/06/16 19:35:59.66 .net
>>675
grepだけでも末尾に改行つけるんですね
でもこの仕様も安定性が心配

689:名無しさん@お腹いっぱい。
16/06/16 20:54:54.26 .net
コマンドラインから翻訳API使ってるがおもしろすぎるw

690:名無しさん@お腹いっぱい。
16/06/19 12:33:57.95 .net
Windows7上でCygwinを動かしbashスクリプトを記述しています。
特定のタスクが起動するのを監視して、起動を確認したら行動に移すスクリプトを
書こうと思っています。
たとえばWindows Media Playerを起動するとWindowsタスクマネージャー上の
「アプリケーション」タブに"Windows Media Player"が立ち上がるのが分かります。
このように特定のタスク/アプリケーションの起動を検知するスクリプトをbashで
記述するにはどうしたらよろしいでしょうか?

691:名無しさん@お腹いっぱい。
16/06/19 14:28:17.66 .net
ps -W | grep "Windows Media Player" | grep -v grep

692:名無しさん@お腹いっぱい。
16/06/19 14:30:25.15 .net
"Windows Media Player"の部分は実際のexeになると思うから
ps -Wで表示されるのにしてね

693:名無しさん@お腹いっぱい。
16/06/19 15:43:42.63 .net
>>679
>>680
ありがとうございますm(_ _)m

694:名無しさん@お腹いっぱい。
16/06/20 18:07:32.11 .net
そういう時は pgrep を使えよ! と思って手元の Cygwin (64bit) に procps-ng を
インストールしてみたんだけど、これって cygwin 配下のプロセスしか見えないのね……

695:名無しさん@お腹いっぱい。
16/06/20 23:14:14.04 .net
大変出遅れたけど
>>649
の問題はbashなんだしshopt -s nullglobで済むのでは?

696:名無しさん@お腹いっぱい。
16/06/21 02:08:19.29 .net
横からだけど、bash なら nullglob でいけるな~
むっちゃ参考になった。ありがとう

697:名無しさん@お腹いっぱい。
16/07/03 14:58:46.31 .net
OSXのsedメモ
ダメ
echo "12


698:3.abcd" | sed -e 's!\.[a-zA-Z]{2}!!g' echo "123.abcd" | sed -e 's!\.[a-zA-Z]{2,3}!!g' echo "123.abcd" | sed -e 's!\.[a-zA-Z]+!!g' echo "123.abcd" | sed -e 's!\.[a-zA-Z]?!!g' OK echo "123.abcd" | sed -e 's!\.[a-zA-Z]*!!g' OK echo "123.abcd" | sed -e 's!\.[a-zA-Z]\{2\}!!g' echo "123.abcd" | sed -e 's!\.[a-zA-Z]\{2,3\}!!g' ダメ echo "123.abcd" | sed -e 's!\.[a-zA-Z]\+!!g' echo "123.abcd" | sed -e 's!\.[a-zA-Z]\?!!g' OK echo "123.abcd" | sed -e 's!\(\.[a-zA-Z]\{2\}\)!z!g' echo "123.abcd" | sed -e 's!\(\.[a-zA-Z]\{2,3\}\)!z!g' +と?の代わりになるいい方法ないですか?



699:名無しさん@お腹いっぱい。
16/07/03 15:23:02.40 .net
-e じゃなくて -E つかうとか?

700:名無しさん@お腹いっぱい。
16/07/03 15:27:38.26 .net
$ echo "123.abcd" | sed -Ee 's!\.[a-zA-Z]+!!g'
123
$ echo "123.abcd" | sed -Ee 's!\.[a-zA-Z]?!!g'
123bcd

701:名無しさん@お腹いっぱい。
16/07/03 15:33:05.72 .net
あ、そうか -E は代わりじゃなくて -Ee とすべきだね

702:名無しさん@お腹いっぱい。
16/07/03 15:35:22.62 .net
-Eの存在をすっかり忘れてた
ありがとう

703:名無しさん@お腹いっぱい。
16/07/03 15:52:51.46 .net
OSXにする人への注意点
デフォのままだと、'、"、-が自動的に置換されるから、環境設定>キーボード>ユーザ辞書で自動置換をoffにしたほうがいい
appごと?、ファイルごと?でもメニューバー>編集>自動置換でも自動置換をoffにできる

704:名無しさん@お腹いっぱい。
16/07/03 20:21:24.00 .net
>>690
OSX歴10年ほどだけど、そんなんの知らんかったし、
そんな目にあったことがない。ぐぐったら実在する機能らしいが、
テキストエディットでコーディングするなんて考えられないし、
あたかもすべからく機能するように誤解を誘導するのはよくない。
OSXを使い始めて困ったのは、円とバックスラッシュを区別することぐらいだ。

705:名無しさん@お腹いっぱい。
16/07/04 20:49:46.74 .net
注意点でそんな攻撃的にならなくても
そのテキストエディットのデフォ値を晒した方が有益かと

706:名無しさん@お腹いっぱい。
16/07/04 21:44:12.04 .net
マカーのレスって ~ が、おかしいよね。
デフォルトでおかしいのが出ちゃうのか知らんけど、あれをなんとかしてほしい

707:名無しさん@お腹いっぱい。
16/07/05 02:10:41.78 .net
ゴシックなのに明朝っぽくなるやつね
自分も知ってるけど一発でマック使いだって分かるから
あのままでいいと思ってる

708:名無しさん@お腹いっぱい。
16/07/05 02:24:03.69 .net
波ダッシュの話?
あれは Windows XP がしくっただけじゃなかったっけ。
Unicode の仕様含め結構まとめてくれてる人がいるから一度読んでみたらいい。

709:名無しさん@お腹いっぱい。
16/07/05 09:28:26.99 .net
アポが勝手なことをしただけ

710:名無しさん@お腹いっぱい。
16/07/05 11:46:58.78 .net
>>696
どうぞ
URLリンク(internet.watch.impress.co.jp)
URLリンク(internet.watch.impress.co.jp)

711:名無しさん@お腹いっぱい。
16/07/05 14:27:46.64 .net
それより、UFT8-macを何とかしてほしい。
日本語ファイル名だとLinuxマシンとまともに連携が取れない。

712:名無しさん@お腹いっぱい。
16/07/05 15:14:05.40 .net
>>697
お前はまとめ見て引用しか出来ない馬鹿だな
そのリンク先にも書いてあるだろ
Unicodeのイメージ(字形)が間違ってたんだよ
XPはその仕様を忠実に実装しただけであって
アポは無視したんだよ
MSもヴィスタから同じ対応をしただけだ
知ったかぶりするんじゃねーよ

713:名無しさん@お腹いっぱい。
16/07/06 12:51:14.80 .net
おい、おまえら!
Unixの読み方はユニ(ッ)クスだぞ。Linuxの読み方はリナ(ッ)クスだぞ。
ちなみにASUSはエイサスな、日本語よみでユニックスとかリナックスとかアスースとか読むのは知能が低い証拠だぞ。
Xの前は何でも「ッ」をつければいいと思ってるのは、典型的な日本人のレベルだぞ!
ちなみに、Xの前に正々堂々と「ッ」をつけてもいいのは、貴様らにほとんど関係ない
セ○クス(S○X)だけだぞ!

714:名無しさん@お腹いっぱい。
16/07/06 17:47:32.09 .net
むかしYahooをヤッホーって言ってた友達を思い出した

715:名無しさん@お腹いっぱい。
16/07/06 19:07:35.87 .net
イット革命の時代には、よくあることだね

716:名無しさん@お腹いっぱい。
16/07/06 20:49:19.53 .net
伏せたらSIXだかSOXだかわかんねえな。

717:名無しさん@お腹いっぱい。
16/07/06 21:36:34.09 .net
アメリカで働いてたときはごちゃまぜだった
方言によって訛りもあるし正直通じればなんでもいい

718:名無しさん@お腹いっぱい。
16/07/07 18:04:30.74 .net
最初は現地読みで「りぬくす」または英語読みで「らいなっくす」と言われてた

719:名無しさん@お腹いっぱい。
16/07/12 21:25:52.98 .net
塩味のマムコ

720:名無しさん@お腹いっぱい。
16/07/12 23:15:08.76 .net
ちんぽ

721:名無しさん@お腹いっぱい。
16/07/14 00:29:39.15 .net
イスドンvsアドスル

722:名無しさん@お腹いっぱい。
16/07/19 06:19:56.96 .net
aliasの設定で
alias command='echo "hage"'
commandにスペースを含ませる事できないのでしょうか?

723:名無しさん@お腹いっぱい。
16/07/19 08:59:57.76 .net
>>709
bashだよね。普通にできる

724:名無しさん@お腹いっぱい。
16/07/19 09:07:33.10 .net
あ。command を "c o m m a n d" にしたいということなら
bashの識別子の条件に反するので不可

725:名無しさん@お腹いっぱい。
16/07/19 19:42:55.37 .net
>>710
710=711 と仮定して質問するけど、710はどういう場合? 何を勘違いしたかが気になって。

726:名無しさん@お腹いっぱい。
16/07/19 21:28:50.34 .net
>>712
710=711だけど、aliasで別名を定義するコマンド(つまりイコールの右側)に
スペースを入れられるのかという質問だと考えた。例示がそういう形になってるから。
もし、alias名にスペースを入れられるかという質問ならそういう例示をするはず
でも後者の質問という可能性に気づいたので、711を追加した

727:名無しさん@お腹いっぱい。
16/07/22 22:58:42.81 .net
<bashのfunctionをdeclare -fで表示すると整形してあることを利用>
URLリンク(d.hatena.ne.jp)
ほとんどなんもしてないワンライナーだけど、見事にスクリプト
ファイル整形してくれる。なんか感動すたw

728:名無しさん@お腹いっぱい。
16/08/06 14:00:53.40 .net
Windows10のISOをダウンロードするときに考えたんだけど
URLからファイル名だけを抜き出すこれより冴えたやり方ってある?
ちなみにWindows10のISOはISOファイルの後ろに
セッションIDかなにかがクエリで付くんだな
cat download.txt | grep -v ^$ | grep -v ^# | while read url
do
file=`echo "$url" | sed "s/.*\///g" | sed "s/\?.*//g"`
if [ $file == "" ]
then
echo file is null "$url"
continue
fi
ps -ef | grep wget | grep "$file"
if [ $? -eq 0 ]
then
echo download now "$file"
else
wget -c -t 1000 -O "work/$file" "$url"
fi
done
一応、ファイル名を正しく取得するのと
重複ダウンロード防止機能付き
wget -cにしたのは中断後の再開がもったいないし
wget -cで2重起動するとファイルが壊れて
いやな思いをした経験があるのでチェック入れてます

729:名無しさん@お腹いっぱい。
16/08/07 00:22:16.73 .net
basenameじゃ駄目なの?

730:名無しさん@お腹いっぱい。
16/08/07 11:38:22.64 .net
上のif文、$fileを""で囲わなくていいの?
実際引っかかることはなさそうだけど

731:名無しさん@お腹いっぱい。
16/08/08 22:34:42.13 .net
bash の変数内の文字列削除ってどうやるのでしょうか?削除したいのは"(ダブルクォート)なんですが
testvar=aaa"aa"
${testvar##\"}
これじゃ駄目だった

732:名無しさん@お腹いっぱい。
16/08/08 23:41:17.18 .net
>>718
## は前方最長一致
全部


733:置換するのは // testvar='aaa"aa"' echo ${testvar//\"} Bashマニュアル「パラメータの展開」セクション内「パターンの置換」 http://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBB



734:名無しさん@お腹いっぱい。
16/08/10 12:59:48.57 .net
selectはbash専用ですか?

735:名無しさん@お腹いっぱい。
16/08/11 00:06:31.61 .net
>>720
はい
URLリンク(wiki.ubuntu.com)
URLリンク(github.com)

736:名無しさん@お腹いっぱい。
16/08/16 04:34:02.37 .net
特定のディレクトリ配下のファイルの中身に特定の文字列が含まれるかどうかを判定するにはどうしたらいいですか?
find xargs grep?これの行数でも数えてtestに渡す?

737:名無しさん@お腹いっぱい。
16/08/16 08:28:28.59 .net
判断ってファイル名をリストすんの?
最終的にどうしたいの?

738:名無しさん@お腹いっぱい。
16/08/16 11:19:32.81 .net
grep -qr 文字列 ディレクトリ

739:名無しさん@お腹いっぱい。
16/08/16 12:55:22.82 .net
あったら処理Aを実行しその結果を返却、なかったら正常終了としたい

740:名無しさん@お腹いっぱい。
16/08/16 13:02:40.67 .net
if grep -qr 文字列 ディレクトリ; then 処理A; else exit 0; fi

741:名無しさん@お腹いっぱい。
16/08/20 19:23:45.23 .net
find . | grep xargs ~

742:名無しさん@お腹いっぱい。
16/08/21 09:28:24.43 .net
> find . | grep xargs ~
とても斬新

743:名無しさん@お腹いっぱい。
16/08/23 01:57:32.12 .net
今freebsdのミラーサイトおかしくない?

744:名無しさん@お腹いっぱい。
16/08/23 02:07:00.60 .net
どうおかしいのかくわしく

745:名無しさん@お腹いっぱい。
16/08/23 02:08:14.36 .net
freebsd-update fetch
freebsd-update install
ができない

746:名無しさん@お腹いっぱい。
16/08/23 02:08:58.40 .net
ミラーサイトを色々変えてもだめ

747:名無しさん@お腹いっぱい。
16/08/28 20:54:56.49 .net
読み込みたいデータが入ったファイルをcatしてwhileでreadすると
while抜けたときに変数の内容が保持されないんだけど
元のシェルスクリプトと別プロセスになってるからってことなのかな?
以下サンプル
user01@server01 ~/test $ cat t4.sh
cat work/uhl.txt | grep -v ^# | sort | uniq | while read title
do
grepvlist=`echo "$grepvlistw | grep -v \"$title\" "`
grepvlistw=$grepvlist
echo $grepvlist
done
echo "---------"
echo $grepvlist
echo $grepvlistw
echo "---------"
user01@server01 ~/test $ sh t4.sh
| grep -v "111"
| grep -v "111" | grep -v "222"
| grep -v "111" | grep -v "222" | grep -v "333"
| grep -v "111" | grep -v "222" | grep -v "333" | grep -v "444"
---------

---------
user01@server01 ~/test $ cat work/uhl.txt
111
222
333
444
user01@server01 ~/test $

748:名無しさん@お腹いっぱい。
16/08/28 21:02:27.99 .net
while ... do ... ; done <<EOT
$(grep -v ^# <file| sort | uniq)
EOT

749:名無しさん@お腹いっぱい。
16/08/28 21:03:00.60 .net
パイプせずに-eでやろうってのはその通りですが
疑問の本質ではないのでとりあえずスルーでお願いします

750:名無しさん@お腹いっぱい。
16/08/29 03:11:36.41 .net
だったら問題の本質だけのスクリプトにすべきでは?

751:名無しさん@お腹いっぱい。
16/08/29 06:36:10.22 .net
単に簡略化して書いただけじゃ?

752:名無しさん@お腹いっぱい。
16/08/29 12:49:07.23 .net
パイプが問題の本質なんだな
パイプでつなげたwhileはサブシェルで起動するから、
> while抜けたときに変数の内容が保持されないんだけど
> 元のシェルスクリプトと別プロセスになってるからってことなのかな?
ってことになる
whileをパイプの先に置いてる限り解決しないので、>>734が本質的な解
あるいは、shじゃなくてbashとかならプロセス置換が定石
while read title; do
...
done < <(cat work/uhl.txt | grep -v ^# | sort | uniq)

753:名無しさん@お腹いっぱい。
16/09/08 21:25:56.17 .net
urlを取得しようと、テストで下を試したのですがダメでした。
どなたか、どうすればいいか教えてください。
お願いします。
x="URLリンク(x")
echo $x | grep -Ee "/[\w\.]"
echo $x | grep -Ee "\/[\w\.]"
echo $x | grep -Ee '/[\w\.]'
echo $x | grep -Ee '\/[\w\.]'
echo $x | grep -e "/[\w\.]"
echo $x | grep -e "\/[\w\.]"
echo $x | grep -e '/[\w\.]'
echo $x | grep -e '\/[\w\.]'

754:名無しさん@お腹いっぱい。
16/09/09 00:28:23.04 .net
やりたいことがわからない...

755:名無しさん@お腹いっぱい。
16/09/09 13:26:15.96 .net
テキスト中のurlを取得しようと、grepに/が先頭に来るパターンを使ってテストしてみたら、htURLリンク(x)が取得できなかった。
ヘルプミー。
だろ。

grepに/が先頭に来るパターンを使った取得は俺も出来ない。

756:名無しさん@お腹いっぱい。
16/09/09 13:46:05.11 .net
>>739
期待する出力は?

757:名無しさん@お腹いっぱい。
16/09/09 14:07:32.50 .net
>>741
おまえの言うことも分からないから739と741は同一人物っぽいな
$xがURLそのものなら加工する必要が無い

758:名無しさん@お腹いっぱい。
16/09/09 15:51:28.22 .net
「grep」ではなくて「sed」による例だが、
URL(URI)の中からホスト名(サーバー名 *1)を抽出したいなら
 *1 スキーム(http:)とパス(/yyy/zzz/index.html)に挟まれた部分
[入力]URL URLリンク(www.xxx.co.jp)
[出力]ホスト名 www.xxx.co.jp
$ echo "URLリンク(www.xxx.co.jp) | sed -e 's/.*http:\/\/\([^\/]*\)\/.*/\1/i'
www.xxx.co.jp

759:744
16/09/09 16:31:07.62 .net
実行例、何かURLの後ろに勝手に「; セミコロン」が挿入されているな
これ2chの仕様?
もし試すなら「index.html"」の後ろの「; セミコロン」は削除して試してくれ

760:名無しさん@お腹いっぱい。
16/09/09 16:39:00.12 .net
セミコロンなんて入ってない
あんたのブラウザの問題だろ

761:名無しさん@お腹いっぱい。
16/09/09 16:57:52.70 .net
>>743
741です。
妄想、乙。そのするどい頭脳でサクッとコマンド貼ってみてくださいね。
ちなみに、\wにこだわらなければ
echo $x | grep -e "/[a-zA-Z0-9\.]"
で、できる。
\wがあると、どうしてだめかはしらない。
>>744
セミコロンないよ。

762:名無しさん@お腹いっぱい。
16/09/09 17:27:46.43 .net
書きたかったのは echo 'URLリンク(x)<)' | grep :// で良い気がする

763:名無しさん@お腹いっぱい。
16/09/09 18:44:47.37 .net
>>744はウェブブラウザで表示するとセミコロンが見える
2chの仕様っていうか read.cgi のバグ

>>747
> \wがあると、どうしてだめかはしらない。

grep や egrep の正規表現では文字クラス […] 内のバックスラッシュ \ が特別な意味を持たないから
[\w] は \ と w にマッチする
[\.] は \ と . にマッチする

764:名無しさん@お腹いっぱい。
16/09/09 22:23:01.76 .net
>>747
>>741とやってることが矛盾してるが

765:名無しさん@お腹いっぱい。
16/09/09 23:05:57.44 .net
結局>>739が出てこない限り>>740から何一つ進まない

766:739
16/09/10 17:00:28.25 .net
言葉足らずで、お騒がせしました。
やりたかったのは、テキスト中のurlの抽出です。
urlには/が入っていて、ドメイン名にはアルファベット、数字、ピリオドがあるので、
いろいろ試しているなかで、上のようなコマンドでgrepが機能しない?と思い込んだ状態に遭遇した所でした。
https+://をgrepから外したのは、http://やドメイン名から始まるurl対策のつもりでした。
自分の間違いを>>749の解説と>>747のイグザンプルで理解できました。
みなさん、ありがとうございました。
本来の目的はまだ試行錯誤中ですが。

767:739
16/09/10 17:16:44.65 .net
https+じゃなくてhttps?でした

768:名無しさん@お腹いっぱい。
16/09/14 14:31:43.86 .net
<<<を使うとechoで変数を渡すより速いというのを見かけて
time for i in $( seq -w 1 1000 ) ; do x="abcdefgh" ; y=$( echo ${x} | sed -Ee s'/b.*//g' ) ; done
time for i in $( seq -w 1 1000 ) ; do x="abcdefgh" ; y=$( sed -Ee s'/b.*//g' <<< ${x} ) ; done
を試したら、<<<の方が1割ほど遅かった。環境:macosx1095+sandy
みんなはどう?

769:名無しさん@お腹いっぱい。
16/09/14 20:50:13.24 .net
CentOS6.8(Hyper-V上)/Haswell でも前者の方が早いですね。
time を bash 添付の物ではなく、/usr/bin/time -v /bin/bash -c '...' で計測して詳細をみると、
前者は File system outputs: の値が 0 に対して、後者は 8000 (for の繰り返し1回あたり 8 増える)
となりました。

strace で見る限りどこかに書き込んでいるようには見えないですが、内部での実装に違いが
あるようですね。

770:名無しさん@お腹いっぱい。
16/09/15 09:05:23.94 .net
想像だけど、echoはbashのビルトインだから起動ロスが無いのとパイプは同時起動だから、stdinが常に準備状態
<<<だど読み込むときにstdinを準備
じゃないのか?

771:名無しさん@お腹いっぱい。
16/09/15 11:53:03.00 .net
<<<(ヒアストリング)ってbashのドキュメントにはビアドキュメントの変形と書かれてる
ってことは、fstat(0, ...)で調べりゃ、レギュラーファイルになってる筈

> <<<を使うとechoで変数を渡すより速いというのを見かけて
と言うデマの火元はどこ?

772:名無しさん@お腹いっぱい。
16/09/15 13:09:35.23 .net
前者はサブシェルを起動するからプロセッサが繁忙状態だと多分遅くなる
シングルコア/シングルプロセッサだと確実にヒアストリングの後者の方が速い

773:名無しさん@お腹いっぱい。
16/09/15 19:15:16.79 .net
>>756, >>757, >>758
解説㌧
ヒアストリングという言葉自体初めて知りました。
<<はヒアドキュメントということも知らずに使っていました。
環境によっては、<<<は速くなるんですね。
いい勉強になりました。

774:名無しさん@お腹いっぱい。
16/09/24 18:27:52.80 .net
ちょい困り案件が自己解決したのでココに書いておきます。
Macのファイルシステムって、ファイル名を UTF-8 で保存してるかと思いきや
独自の正規化がされてまして (UTF8-MAC) 例えば、
 find . -name "*ドイツ*"
とかやってもあるはずのファイルが出てこないわけです。(内部的に ド の字を ト+[濁点] みたいな格納をしてるせいです)
そこで .bash_profile に以下のように コマンドもどきの find2 を定義してやります。これで万事解決です。

# find に渡す引数を全て UTF8-MAC に変換してしてます
find2(){
eval "find "$(echo "$@" | iconv -f UTF-8 -t UTF8-MAC)
}

775:名無しさん@お腹いっぱい。
16/09/24 18:38:10.62 .net
>>760
他文字コードにも応用できそうだね

776:名無しさん@お腹いっぱい。
16/09/24 18:47:05.28 .net
変換すべきは-name ... だけでしょ 全部変換は手抜きすぎ
-execで他のプログラムに渡すUTF-8をUTF8-MACに変換されていやーんになる
汎用的にするなら要ブラッシュアップ

777:名無しさん@お腹いっぱい。
16/09/24 21:51:49.29 .net
>>762 了解です。
ただ -exec の方は 問題は別にあって
終端を表す \; の \(バックスラッシュ)
が消えちゃうんですね。そもそもiconv変換する前の時点で。
一応対応できたと思うんですが、
長くなったので貼るのはやめときます。

778:名無しさん@お腹いっぱい。
16/09/24 22:10:40.49 .net
-execは;じゃ無くて+で終端しないと原人扱いされちゃうよ
;じゃないと困るのはかなり特殊なケース

779:名無しさん@お腹いっぱい。
16/09/24 22:13:36.64 .net
>>760
どっかで読んだ内容だなぁと思ったら、これ↓のパクリか!
「新・OS X ハッキング! (169) Terminal上で「ダ」や「パ」が付くファイルを検索できない理由と対策 | マイナビニュース」
 URLリンク(news.mynavi.jp)

780:名無しさん@お腹いっぱい。
16/09/24 23:20:43.06 .net
やり方だけ覚えてたんですが、昔見たのはソレかもしれません。
ただ現実に必要になってみると
find . -name `echo "オランダ.png" | iconv -f UTF8 -t UTF8-MAC`
これ毎回打ち込むの面倒だなと思ってコマンド化してみた次第です。

781:名無しさん@お腹いっぱい。
16/09/24 23:54:36.90 .net
昔って、先月の25日(1ヶ月前)の記事だけどな

782:名無しさん@お腹いっぱい。
16/09/24 23:56:11.17 .net
実におもしろいw

783:名無しさん@お腹いっぱい。
16/09/25 00:01:20.09 .net
ん、もっと昔から知ってたよ。だから他の記事だと思います。

784:名無しさん@お腹いっぱい。
16/09/25 02:09:32.85 .net
>>763
>>終端を表す \; の \(バックスラッシュ) が消えちゃうんですね。

普通にfindするときもfindに渡る前に¥は消えるでしょ

find2(){
find $(echo "$@" | iconv -f UTF-8 -t UTF8-MAC)
}

じゃダメなの?

785:名無しさん@お腹いっぱい。
16/09/26 14:04:28.33 .net
それがベストだと思います

786:名無しさん@お腹いっぱい。
16/09/26 23:31:45.32 .net
昔から知ってたけどね

787:名無しさん@お腹いっぱい。
16/10/16 10:27:03.83 .net
以下のスクリプトはカレントディレクトリに「AABB」というファイルがあると
ワイルドカードが展開されて「find /tmp -name AABB」となってしまいますが、
これを「find /tmp -name

788:名無しさん@お腹いっぱい。
16/10/16 10:36:38.42 .net
すみません、失敗しました。

以下のスクリプトはカレントディレクトリに「AABB」というファイルがあると
ワイルドカードが展開されて「find /tmp -name AABB」となってしまいますが、
これを「find /tmp -name "AA*"」とさせるにはどうすればいいのでしょうか?

#!/bin/sh
name="AA*"
option="-name $name"
find /tmp $option
---------------------------
$ ls
AABB test.sh

$ ls /tmp
AACC

$ sh -x test.sh
+ name=AA*
+ option=-name AA*
+ find /tmp -name AABB

/tmp/AACC をヒットさせたくて
下のように変数の書き方を色々変えてみましたが、うまくいかず
悩んでます。
name="AA"*""
name="AA\*"
name="AA\"*\""
option="-name "${name}""
option="-name \${name}"

789:名無しさん@お腹いっぱい。
16/10/16 10:45:33.83 .net
option=

790:名無しさん@お腹いっぱい。
16/10/16 10:53:11.25 .net
あれ、ダブルクォーテーションで切れちゃった
全角にするけど
option=”-name \”$name\””
とすればよろし

791:名無しさん@お腹いっぱい。
16/10/16 11:06:04.27 .net
ダブルクォーテーション
ウェブブラウザで書いてて、書き込んでいいですかの確認画面を経由して書き込むと切れちゃう
俺調べ

792:名無しさん@お腹いっぱい。
16/10/16 13:48:12.77 .net
余計な変数使わないで
#!/bin/sh
name="AA*"
find /tmp -name "$name"
ってやればいいのに

793:名無しさん@お腹いっぱい。
16/10/16 13:54:36.43 .net
場合によって
option="$option 他のオプション"
とかやりたいんじゃないの

794:名無しさん@お腹いっぱい。
16/10/16 17:25:04.68 .net
>>777
まさにそれだったわ。情報ありがとう

795:名無しさん@お腹いっぱい。
16/10/16 18:08:50.16 .net
邪道で、bash 用だけど find の前に set -f
find の検索パスにワイルドカード使ってたらだめ

796:名無しさん@お腹いっぱい。
16/10/16 19:22:23.01 .net
テス
# name=

797:名無しさん@お腹いっぱい。
16/10/16 19:25:37.68 .net
>>777、あぁ、本当だWebブラウザからの書き込みだと回避できないのかな?
スクリプトソース貼るのに致命的だな

798:名無しさん@お腹いっぱい。
16/10/16 19:40:18.84 .net
hastebinにでも貼ればいいんだよ

799:名無しさん@お腹いっぱい。
16/10/26 22:58:52.49 .net
一般的なペーストビン

800:名無しさん@お腹いっぱい。
16/10/26 23:40:35.70 .net
hastebinのほうがちょっと見やすかったりする

801:名無しさん@お腹いっぱい。
16/10/29 21:05:55.08 .net
実行中の標準出力と標準エラーをログしながら表示させることって出来る?
むかしリダイレクトとtailでやったらうまく行かなかった覚えがあってやめた気がする

802:名無しさん@お腹いっぱい。
16/10/29 21:22:36.46 .net
プロセス置換を使う
cmd > >(tee stdout.log) 2> >(tee stderr.log)

803:名無しさん@お腹いっぱい。
16/10/29 22:19:49.67 .net
そういえばPOSIX shにはないな…すまん

804:名無しさん@お腹いっぱい。
16/10/30 09:23:07.74 .net
cmd > stdout.log 2> stderr.log & tail -f stdout.log stderr.log
で出来ないか?

805:名無しさん@お腹いっぱい。
16/10/30 21:41:34.72 .net
下記でOKだった

{ { cmd | tee stdout.log 1>&3; } 2>&1 | tee stderr.log 1>&2; } 3>&1

・bash: 標準出力、標準エラー出力をファイル、画面それぞれに出力する方法 - Qiita
 URLリンク(qiita.com)

806:名無しさん@お腹いっぱい。
16/11/04 12:24:35.95 .net
音楽CDを突っ込んでmp3を作る。
この時ファイル名とmp3タグにはCDDBから読み込んで来る。

これをやるのに手っ取り早い方法ってなんだろ

807:名無しさん@お腹いっぱい。
16/11/04 12:26:20.17 .net
EAC自動化

808:名無しさん@お腹いっぱい。
16/11/04 12:31:52.74 .net
abcde使えよ

809:名無しさん@お腹いっぱい。
16/11/17 04:52:04.55 .net
/usr/bin/test を使った判定がよくわからなくて困ってます

curl でhttp の応答をチェックしたいのですが
下記みたいにしてもちゃんと判定できないのですが何が原因でしょうか?

test $(curl -XHEAD -s -i URLリンク(www.google.co.jp) | awk NR=1) = 'HTTP/1.1 200 OK';echo $?

810:名無しさん@お腹いっぱい。
16/11/17 06:02:01.01 .net
くおー

$ [ $(curl -I URLリンク(localhost) 2>&- | head -n 1) = 'HTTP/1.1 200 OK' ]; echo $?
bash: [: too many arguments
2
$ [ "$(curl -I URLリンク(localhost) 2>&- | head -n 1)" = 'HTTP/1.1 200 OK' ]; echo $?
0
$ [ "$(curl -I URLリンク(localhost) 2>&- | head -n 1)" = 'HTTP/1.1 200 OK' ]; echo $?
1

っとちょっと色々違うけど、うちでは之でなんとかなってる

811:名無しさん@お腹いっぱい。
16/11/17 06:27:40.74 .net
"HTTP/1.1 200 OK"$'\r'

812:名無しさん@お腹いっぱい。
16/11/17 08:38:26.65 .net
そういうのはステータスコードだけを見るようにしたほうがいいよ

test "$(curl -I -s -o /dev/null -w '%{http_code}' URLリンク(www.google.co.jp))" = 200

HTTPステータス行の Reason-Phrase ("OK" や "Not Found" の部分) は送出者が自由に書けるし
HTTPバージョンも当然固定じゃない

# HTTP2を有効にしてビルドしたcurlの場合:
$ curl -I -s URLリンク(www.google.co.jp) | head -n 1
HTTP/2 200
$

813:名無しさん@お腹いっぱい。
16/11/17 08:49:14.72 .net
>>798
訂正
ウェブブラウザで表示すると余分なセミコロンが混じってしまう

test "$( curl -I -s -o /dev/null -w '%{http_code}' URLリンク(www.google.co.jp) )" = 200

814:名無しさん@お腹いっぱい。
16/11/17 12:19:57.15 .net
>>521
いいお(´・ω・`)

815:名無しさん@お腹いっぱい。
16/11/17 12:21:26.17 .net
うちのcurlは終了しなかった
-XHEAD を外してみた
-bash: test: too many argumentsになった
$()を""で括った
awkが効いてなさそう
NR==1 にした
まだ一致しない
行末がCRLFだった
$'\r'を付けた

とりあえず
test $(curl -XHEAD -s -i URLリンク(www.google.co.jp)<) | awk NR==1)" = 'HTTP/1.1 200 OK'$'\r';echo $?
なった

816:名無しさん@お腹いっぱい。
16/11/17 12:47:25.00 .net
つまり纏めるとこうか
test "$(curl -I -w "%{http_code}" URLリンク(example.com) 2>&- |tail -1)" = 200; echo $?

817:名無しさん@お腹いっぱい。
16/11/17 14:56:39.30 .net
なんでレスポンスを取得する操作と
取得したレスポンスをtestする操作を一度にしようとするのか理解不能

818:名無しさん@お腹いっぱい。
16/11/17 16:51:11.77 .net
ワンライナー原理教の方ですかね?w

まあ何でも一度にやってみたくなる衝動は理解できなくもない。
そこに山があるから、的な何か。

819:名無しさん@お腹いっぱい。
16/11/17 17:02:47.58 .net
そこにパイプがあるからな

820:名無しさん@お腹いっぱい。
16/12/07 08:00:32.91 .net
品位が問われるAdvent Calendar -- シェルスクリプトはどこでも動く!
URLリンク(www.peeep.us)

なんかあの界隈よく揉めてるな… 👀
Rock54: Caution(BBR-MD5:f4da0c707200fe35c49b788174082785)


821:名無しさん@お腹いっぱい。
16/12/07 09:27:19.82 .net
品位のないやつだな

822:名無しさん@お腹いっぱい。
16/12/07 10:58:10.89 .net
qiitaとかに書いちゃう輩なんてそんなもんだろ

823:名無しさん@お腹いっぱい。
16/12/07 12:13:29.28 .net
この記事がキモいのは認めるけど、十把一絡げにQiitaを悪く言うのはやめて!

とはいうもののオタクのコミュニティって、どこでもちんぽ騎士団ぽいのがいるよね……
ぼっち最高やで。

824:名無しさん@お腹いっぱい。
16/12/07 15:49:11.13 .net
シェルスクリプトで、if


825:とthenの間に改行がある場合で、その間に#をつけたコメント行を入れるのはNGですか? ifの条件を、動作テストのため、いくつか使い分けたくて、thenより上の行で、テストで使い終わった判定を コメント化しました。実際の判定が、コメント化したものが活かされたりと、おかしくなりました。 以下の、1分ごとに呼び出されるコードで、毎時40分だけ動いて貰いたいのに、10分おきに条件成立となりました。 #1hour if [ `date '+%M'` -eq "40" ] #10min # if [ `date '+%M' | tail -c 2` -eq 0 ] #all # if [ true ] then echo 処理 fi



826:名無しさん@お腹いっぱい。
16/12/07 16:18:47.23 .net
>>809
あそこで役に立つ記事あるか?
自己満のゴミ情報が大部分だからgoogole personal blockの対象だわ

827:名無しさん@お腹いっぱい。
16/12/07 16:49:19.73 .net
>>810 テストの大括弧の後ろにセミコロン付ければいいんでね?

828:名無しさん@お腹いっぱい。
16/12/07 18:34:13.86 v2ZV9RF7w
bash3.2+ で IFS=$' \t\n' な状態で

$ echo "foo bar" baz | hoge.bash

とした時に hoge.bash 内で "foo bar" と baz を
別々の引数として取得するにはどうすればいいですか?

829:名無しさん@お腹いっぱい。
16/12/07 19:49:58.99 .net
>>811
わかる。盛大な勘違い書いててドャァしてる感がすごい

830:名無しさん@お腹いっぱい。
16/12/07 21:31:23.08 .net
googoleとかのことか

831:名無しさん@お腹いっぱい。
16/12/07 23:23:03.71 .net
>>810
素直にcrontab使った方が良いんじゃね

832:名無しさん@お腹いっぱい。
16/12/08 09:58:48.36 .net
>>810
そんなこと起きないはず
ほんとにそのコード?

833:名無しさん@お腹いっぱい。
16/12/10 20:22:24.90 .net
すいません、教えて下さい。
色んなネットーワーク機器のログをsedでズバッとマスキングかけたいんだけど、URLと、IPアドレスの正規表現を教えて下さい。

834:名無しさん@お腹いっぱい。
16/12/10 20:25:17.66 .net
817d

835:名無しさん@お腹いっぱい。
16/12/14 16:17:30.58 .net
TBS

det dritte folkemn

836:名無しさん@お腹いっぱい。
16/12/21 04:35:52.23 .net
文字列から実行して、返り値も標準出力も格納したいんだけど

testCmd="なんかのコマンド"
result=$(eval testCmd)

この後の$0はevalの返り値なのかtestCmdの帰りなのかよくわからんのですが

837:名無しさん@お腹いっぱい。
16/12/21 05:11:40.55 .net
>>821

$0 ってどういうこと?
$? の間違いなら man bash の eval に書いてある。

838:名無しさん@お腹いっぱい。
16/12/21 06:35:22.65 .net
普通に考えるなら

export testCmd="コマンド"
$testCmd > ログファイル
戻り値=$?

839:名無しさん@お腹いっぱい。
16/12/21 06:47:35.19 .net
ちなみにスクリプトにすると
result=`$testCmd`
で標準出力が入って
$?でも戻り値は取れるけど
標準エラー出力は取れないね

840:名無しさん@お腹いっぱい。
16/12/21 11:34:52.01 .net
失礼いたしました$?ですね

testCmd="なんかのコマンド"
result=$(eval $testCmd)

returncode=$?

標準エラーはいらんのですが
プロセス置換?とかでできるのかな

841:名無しさん@お腹いっぱい。
16/12/22 09:27:10.08 .net
いまいち何を訊きたいのか分からん。
$?はevalの終了ステータスが設定される。evalの終了ステータスはtestCmdの終了ステータスが設定される

842:名無しさん@お腹いっぱい。
16/12/22 12:40:53.01 .net
> この後の$0はevalの返り値なのかtestCmdの帰りなのかよくわからんのですが

マニュアル読んでわかんなきゃ試してどうなるか調べないと
正常終了するコマンドだけじゃなくてそれ以外もね

843:名無しさん@お腹いっぱい。
17/01/15 17:41:24.20 .net
[ .... ] を [[ .... ]]に単純に置き換えて問題あります
でしょうか?

844:名無しさん@お腹いっぱい。
17/01/15 18:20:34.24 .net
コマンドの引数を変数化したときって、どうやってその変数をコマンドに渡せばいいの?

#!/bin/bash
opts=“-f $file”
hoge $opts

これだと hogeコマンドが unrecognized option エラーになってしまう。
初歩的な質問ですまん

845:828
17/01/15 18:27:02.19 .net
スマソ、自己解決
$fileが不正だっただけやん

846:名無しさん@お腹いっぱい。
17/01/16 21:28:07.13 .net
>>828
URLリンク(mywiki.wooledge.org)
> [[ is not defined by POSIX, originated in ksh and is also present in zsh

847:名無しさん@お腹いっぱい。
17/01/17 21:34:40.69 .net
bashでif使って変数に"ok"が入ってるかはどうやって確かめればいいんでしょうか?
if [ $a = "ok" ]; then
echo hoge
else
echo fuga
fi
の様にしているのですが"ok"が入っていても別の文字列が入っていてもfugaが出力されてしまいます

848:名無しさん@お腹いっぱい。
17/01/17 21:59:37.47 .net
$a の中身が引用符の無い裸の
ok
ならば真になるはず

849:名無しさん@お腹いっぱい。
17/01/17 22:02:25.13 .net
できればそのままやりたいんです
cutかなんかで事前に削るしかないですかね?

850:名無しさん@お腹いっぱい。
17/01/17 22:14:16.11 .net
831 の "ok" を '"ok"' または "\"ok\"" にすれば

851:名無しさん@お腹いっぱい。
17/01/18 09:13:18.95 .net
引用符付きの文字列なの?

852:名無しさん@お腹いっぱい。
17/01/18 11:40:24.29 .net
>>835
\"でうまく行きました
ありがとうございます
>>836
そうです
"ok"か"error"、またはそれ以外の文字列(引用符なし)が入ってる

853:名無しさん@お腹いっぱい。
17/01/21 12:38:14.00 .net
使ってないと何もかも忘れる・・

854:名無しさん@お腹いっぱい。
17/01/21 16:06:57.66 .net
忘れるで思い出した、シェルスクリプトと関係ないけどinfoでいつも迷子になるわ俺

855:.
17/01/21 20:26:15.12 .net
これってどうかな?
URLリンク(gihyo.jp)

856:名無しさん@お腹いっぱい。
17/01/21 21:16:52.05 .net
configure全部読めば桶

857:名無しさん@お腹いっぱい。
17/01/23 23:25:46.35 .net
httpdのログでIP直でアクセスして来たIPをbanするスクリプト作ってcronで回すようにした

858:名無しさん@お腹いっぱい。
17/01/23 23:40:12.97 .net
接続しに来た全IPをBAN判定する負荷のほうが高くなりそうだね

859:名無しさん@お腹いっぱい。
17/01/23 23:46:44.50 .net
blockはpfでやってるけど、負荷があるのかわからない。たいして無いように思う。前は中国IPを全部はじいてたけど、特に不都合はなかった

860:名無しさん@お腹いっぱい。
17/02/05 17:07:27.34 .net
ビギナーなんですが、教えてくれませんか。
for i in {1..3}
do
echo $i
done

1
2
3
ではなく{1..3}が出力されます。どうして?

861:名無しさん@お腹いっぱい。
17/02/05 17:13:16.91 .net
bash じゃないから

862:名無しさん@お腹いっぱい。
17/02/05 17:15:56.58 .net
>>846
ありがとう・・・ありがとう・・・

863:名無しさん@お腹いっぱい。
17/02/05 19:26:02.43 .net
もう一個お願いします。
testを
1
2
3
というファイルだとして、
cat test|while read line; do sed -e "s/.*/a/"; done
をやると
a
a
a
ではなく
a
a
となるのはなぜですか?

864:名無しさん@お腹いっぱい。
17/02/05 20:04:29.97 .net
ホントは、

cat test|while read line; do echo "$line" | sed -e 's/.*/a/'; done

ってしたいんじゃない?

cat test|while read line; do sed -e "s/.*/a/"; done

だと、1行目を read が喰って、2行目以降は全て sed に入力される
ことになるよ。

865:名無しさん@お腹いっぱい。
17/02/05 20:26:43.25 .net
>>849
ありがとう・・・。そういう仕組みになってるのは知らなかった。

866:名無しさん@お腹いっぱい。
17/02/08 13:58:57.76 .net
list.txt に書いてあるファイルを一括で転送するスクリプトを書いたのですが、
これに送信前と送信後のmd5を比較して、一致しなかったら再送させるにはどうすればいいですか?
URLリンク(pastebin.com)

867:名無しさん@お腹いっぱい。
17/02/08 23:14:15.74 .net
一度 mvしてしまったものは再送出来ない

868:名無しさん@お腹いっぱい。
17/02/09 12:54:00.09 .net
こういうファイルを重複箇所は2度目に出現する箇所のみ削ってマージする方法ってある?

$ cat file1.txt
1
2
3
4

$ cat file2.txt
3
4
5
5
6

センスない自分�


869:ニしてはheadとtailを使って逐一チェックしながら マージすると言うプログラミング的な方法しか思いつかなかった・・・



870:名無しさん@お腹いっぱい。
17/02/09 13:09:23.15 .net
cat file1.txt file2.txt | sort -nu
あくまでも中には数字しかないならばの話で。

871:名無しさん@お腹いっぱい。
17/02/09 13:17:38.41 .net
連結してsortしてuniqじゃダメなの?

872:名無しさん@お腹いっぱい。
17/02/09 13:35:43.26 .net
>>854-855
ありがとうございます
数字を使ったのは単なるサンプルなので・・・実際は文字列が入っています
今はcatで単純マージしたあとにviで重複箇所を削っていて
かつそのファイルを利用する時にsortしてuniqしています
できればファイルサイズとかも気にしたいので
パイプとかで簡単かつ堅実に出来ないかなと思ったのです

873:名無しさん@お腹いっぱい。
17/02/09 13:40:12.55 .net
すでにソートされてるんならuniqだけでいいんじゃね
そうじゃないんなら、ありうる最大限一般的な例を出さないのがだめ

874:名無しさん@お腹いっぱい。
17/02/09 16:02:59.69 .net
awk 使うとか

$ cat file1.txt file2.txt | awk '{if(!u[$0]){u[$0]=1;print;}}'

875:名無しさん@お腹いっぱい。
17/02/09 19:01:56.53 .net
URLリンク(www.youtube.com)

876:名無しさん@お腹いっぱい。
17/02/09 19:13:20.28 .net
2次元座標をy座標 -> x座標の順でソートしたいんだけど
ソートキーの値がある範囲内(例えばプラスマイナス100)にある場合は同じ値とみなすみたいなことできますか?

入力イメージ
0001 31 149
0002 21 156
0003 11 145
0004 52 344
0005 42 356
0005 12 353
0006 53 594
0007 13 613

出力イメージ
0003 11 145
0002 21 156
0001 31 149
0005 12 353
0005 42 356
0004 52 344
0007 13 613
0006 53 594

比較ロジック(0はa=b、-1はa<b, 1はa>b)
function compare (a, b) {
if (a.y < b.y - 100) return -1
if (a.y > b.y + 100) return 1
if (a.x < b.x - 100) return -1
if (a.x > b.x + 100) return 1
return 0
}

877:名無しさん@お腹いっぱい。
17/02/09 19:14:30.15 .net
>>860
入力イメージは(id, x, y)で
3カラム目がy座標、2カラム目がx座標です

878:名無しさん@お腹いっぱい。
17/02/09 19:50:30.95 .net
区間に分けていいんなら、100単位で丸めたキーを追加してソートすればいいけど、
その比較関数をきっちり実装するのは無理があるね
awkかそれ以上のスクリプト言語使うくらいかな

879:名無しさん@お腹いっぱい。
17/02/09 20:07:21.71 .net
プラマイ100とかだと全部同じ値になるんじゃないの?
四捨五入で丸めるなら分かるけど

880:名無しさん@お腹いっぱい。
17/02/09 21:01:26.79 .net
pythonのsortはstableだと保証されてるけど、他のは?

881:859
17/02/09 21:46:47.59 .net
>>862
>>863
入力イメージの値にあるみたいに丸めだと欲しい結果が得られないのでスクリプト言語使ってみます
ありがとうございます

>>864
stableかどうかはあんまり考えてませんでした
1カラム目のユニークな値でソート済みなところからの処理なので
stableじゃないsortの場合は比較ロジックに1カラム目を追加して対応します

882:名無しさん@お腹いっぱい。
17/02/09 22:44:27.46 .net
んー、500=560で、560=620だけど、500<620って、ソート誤らんかな

883:名無しさん@お腹いっぱい。
17/02/09 23:31:32.77 .net
>>865
このスレで言うべきでは無い気はするけど
Excelとかの表計算ソフトを使った方が良さそうな気が

884:859
17/02/10 00:45:19.33 .net
>>866
ユニークなキーも比較条件に追加すれば並び順は一意に決まるので誤ることはないかと

>>867
シェルスクリプトでいろいろ処理する途中の処理なんです

885:名無しさん@お腹いっぱい。
17/02/10 01:36:54.52 .net
>>868
qsortを仮定して、たまたまピボットが560になったときと
620になったときで結果が変わるよ

誤るというか、結果が一意で


886:ない



887:名無しさん@お腹いっぱい。
17/02/10 02:16:12.75 .net
1カラム目がユニークキーだとしてそれも比較条件に入れれば
各行の比較で必ず上下関係が明確になるのでqsortでも大丈夫じゃないでしょうか

001 620
002 560
003 500

888:名無しさん@お腹いっぱい。
17/02/10 05:48:37.28 .net
シェルでも他言語でもプログラミングが必要で
ループ処理しながら選択ソートするしかないね

まあまずシェルで~とかじゃなくて
ExcelでもJavaでも何でもいいから簡単に実装できる方法を調べてみて
シェルに落としこめるかを調べた方がいいと思う
例えば偏差とか一般的で誰でも使うから統計処理なんてawkで楽に出来るんだけど
>>860がやりたいのって特殊だから独自実装が必要になると思うよ

茶化してるわけじゃないけど
はじめに自分がやりたいことは何なんでしょうって聞くのが早いと思う

889:名無しさん@お腹いっぱい。
17/02/10 06:15:23.45 .net
数学詳しくないけど
前後のデータの単純比較じゃなくて
全データとの比較が必要になるから
コマンド1発じゃ無理だね(10発くらいでも無理だけど)

キーを追加するにしてもデータ数-1分のキーが必要になるし(xとyでさらに2倍か)
キーが別だからそこからソートする方法が浮かばない
スクリプトでもプログラムでもいいけど
プラマイ100を同値とするソートのロジック組むしかないと思う

890:名無しさん@お腹いっぱい。
17/02/10 08:25:47.98 .net
>>870
qsortの中身知ってる?
パーティショニングしたらあとはブロック内の入れ替えしかしないよ

891:名無しさん@お腹いっぱい。
17/02/10 08:29:02.88 .net
>>872
データ数-1とか2倍とか意味わからん

892:名無しさん@お腹いっぱい。
17/02/10 09:53:38.19 .net
>>868
並び順は良いだろうけど
A=B B=C A≠C の時そもそもどうなれば良いの?
001 A
001 B
??? C

893:名無しさん@お腹いっぱい。
17/02/10 10:06:02.58 .net
ソートっていうのは同値類とその間の全順序を決めて要素を並べることだよね

>>860のcompareだと推移律を満たさないので同値類になっていない
だからおかしなことになる

894:名無しさん@お腹いっぱい。
17/02/10 10:15:12.36 .net
このように複雑になる場合は要求定義が不適切な事が多い

895:名無しさん@お腹いっぱい。
17/02/10 10:16:20.47 .net
普通に全部出せよ
何で小出しにしてんだよアホじゃねえよ

896:名無しさん@お腹いっぱい。
17/02/10 10:35:17.25 .net
複雑って言うか単純なんだけど特殊なだけでしょ

897:名無しさん@お腹いっぱい。
17/02/10 10:52:33.90 .net
こんなアホソート誰が必要とするんだよwww

ソート前
001 200 200
002 100 100
003 0 0

ソート後
003 0 0 ←一番小さく200との差が100を超えているため入れ替える
001 200 200 ←一番大きいが100からは100以内なので入れ替えない
002 100 100 ←200より小さいが200からは100以内なので入れ替えない

アホだw

コレ意味の分かってないやつがロジック組むと
100から見たら0も200もプラマイ100以内だから
並べ替えしないとか言うことになるだろう

要するにプラマイ100を見込んだ最小値を求めて
2週目のループでそれを除外した中からさらに最小値を求めていくだけ
終わりまで選択ソートをやるだけなんだけど
そこにプラマイ100の比較を追加する必要がある

ぶっちゃけソート結果を見れば分かるように
こいつソートしてんの?って思うだろう
そもそも>>874の考えが破綻していると言うか思いつきソートなんだろうと思う
統計とか学んだ方がいいかな~

898:名無しさん@お腹いっぱい。
17/02/10 10:59:36.91 .net
ぶっちゃけプログラムを書くのは簡単

899:名無しさん@お腹いっぱい。
17/02/10 11:04:25.90 .net
特殊じゃなくて曖昧なんでしょ
早い話、1000x1000の平面のすべての整数座標に点があったらどうソートしたいわけ?
2次元だからややこしいわけでなく1次元でも同じこと

900:873
17/02/10 11:07:21.05 .net
>>880
俺になんの用?

901:名無しさん@お腹いっぱい。
17/02/10 11:15:25.85 .net
>>883
ごめん間違えた>>860

>>882
いや曖昧じゃない
2次元と言うのもちょっと複雑にしてるだけだろう
プラマイ100以内は同じと言う明確な基準がある

ただたぶんこのソートの結果は>>880に記したように
初期のデータの並びによって変わる部分があると思うね
だからこのソートは>>860の思いつきソートだってことだ

902:名無しさん@お腹いっぱい。
17/02/10 11:38:39.44 .net
多分、縦横10000くらいある座標にポツポツしかないと予想した処理なんだろうよ

903:名無しさん@お腹いっぱい。
17/02/10 14:05:33.33 .net
>>884
(0, 100)
(99, 300)
(198, 200)
どう並べりゃ良いのよ?

904:名無しさん@お腹いっぱい。
17/02/10 14:12:56.80 .net
>>886
(0, 202)
(99, 101)
(198, 0)
こうか

905:873
17/02/10 14:39:27.08 .net
(0,999)
(0,998)
...
(0,1)
(0,0)

どう並べる?

906:名無しさん@お腹いっぱい。
17/02/10 15:26:37.64 .net
cygwinでスクリプト書いてて時々

bar=`ls foo_*.txt|tail -1|cut -d\. -f1`
で$barに高確率で何も入らなかったり(foo_*.txtはあるのに)

bar=`echo $foo|perl -pE 's/^.*"hoge":"([^"]+)".*$/HOGE_\1/'`
echo $bar > /dev/null
echo "result:"$bar
の2行目がないと何故か3行目で$barが空のように表示されたり

というような現象が起きるんだけど、これってよくあること?
cygwin64にしてから起きているような気もする

907:名無しさん@お腹いっぱい。
17/02/10 15:56:58.38 .net
.
.
東京都三鷹市 元ニコ生主の莉里子です (整形後) URLリンク(i.imgur.com) (整形前) URLリンク(i.imgur.com)
不倫・浮気・密会・不道徳な行為は著名な小説家でしている人がいるので真似しちゃう池沼です URLリンク(i.imgur.com)


■2015年2月 釣りニコ生主コジコジと沖縄旅行でオフパコ

2015年2月2日-3日...釣り生主コジコジと沖縄旅行でセックス/やり捨てされ逆ギレ
2015年2月4日.........莉里子の父親から電話があって脅されたとコジコジに放送で暴露される
2015年2月6日.........リスカ画像UP 
2015年2月9日.........ツイ全消し/コミュ爆破逃亡
URLリンク(imgur.com) 

■2016年6月 バンドマン兼ニコ生ツイキャス配信者と密会 その3日後に穴るセックス~継続中
URLリンク(imgur.com)


●早川莉里子●土井莉里子●土井寧々●土井剛●早川剛●星崎●りりこ●りりこし●にゃんぱす
●ね子●にゃこ●みんち●めう●ねね●猫又●剛


※名古屋ゲイ風俗ホストとも体の関係※

908:名無しさん@お腹いっぱい。
17/02/10 15:57:21.03 .net
.
.
莉里子(本人公表)1994年3月7日 or 1996年4月25日 URLリンク(imgur.com)
生主時代(にゃんぱす、りりこし、莉里子)
剛 URLリンク(i.imgur.com)  URLリンク(imgur.com)
 

東京都三鷹市 シティハイツ吉祥寺通り
URLリンク(i.imgur.com)
URLリンク(i.imgur.com)
URLリンク(i.imgur.com)
URLリンク(imgur.com) (見せたがり乱交好きのメンヘラ) URLリンク(i.imgur.com)

URLリンク(i.imgur.com)
URLリンク(i.imgur.com)
URLリンク(i.imgur.com)
URLリンク(i.imgur.com)


莉里子 緊縛ハメ撮り師 『相馬ドリルrenji』 とラブホに2人で入って フルヌード緊縛ハメ撮り
URLリンク(pbs.twimg.com)  URLリンク(i.imgur.com)
URLリンク(twitter.com)
URLリンク(imgur.com)
URLリンク(i.imgur.com)

909:名無しさん@お腹いっぱい。
17/02/10 15:57:31.97 .net
.
.
.

>悪質パクツイ垢(自称ハッカー)のコピーライティング特定されててワロた

@copy__writing の中の人は東京都三鷹市の莉里子

URLリンク(twitter.com)
URLリンク(i.imgur.com)
URLリンク(i.imgur.com)
URLリンク(i.imgur.com)
URLリンク(www.mercari.com)

910:名無しさん@お腹いっぱい。
17/02/10 15:58:37.98 .net
■莉里子プライベート垢
@riricoco0
@bibliophilia333
@muzimuzi333
@nekomatagensou
@hanasoraumimori
@mirainosekai3
@zibanyan666
@parlorchild
@liliririko
@EriotN
@mike_peko
@riricoco0
@ririko_neko
@nyanpas ※1
@telegraphyneko
@riricatputi (新アカ) URLリンク(imgur.com)

911:名無しさん@お腹いっぱい。
17/02/10 22:49:49.54 .net
>>889
再現性はあるの?
手で実行してるのか知らないけど
lsの結果をファイルにリダイレクトしといて(ログ残しておいて)
地道に調べるしかないと思う

912:名無しさん@お腹いっぱい。
17/02/14 09:44:10.27 .net
SJISで漢字を含むCSVファイルを入力として、

while read line
do
なんちゃら
done < CSV

みたいに一行ずつ読み込んでなんちゃらすると、特定の漢字をreadで取った時に文字化けするんだが
これの回避策って兄貴何かないかな
とりあえずIFSを改行のみにしてfor line in `cat CSV`にして凌いだが、IFSいじるのが気持ち悪くて仕方がない

913:名無しさん@お腹いっぱい。
17/02/14 10:11:22.08 .net
なんの漢字?

914:名無しさん@お腹いっぱい。
17/02/14 10:13:38.18 .net
SJISなんてウンコを触っておきながらIFS弄るのが気持ち悪いというのは矛盾

915:名無しさん@お腹いっぱい。
17/02/14 10:35:53.64 .net
>>895
0x5C を含む漢字でしょ、「表」とか
だったら read -r line で

916:名無しさん@お腹いっぱい。
17/02/14 10:44:50.39 .net
>>898
KOREDAAAAA!!!
ありがとう兄貴
ちなみに構造って感じでつまづいてた
SJIS扱うのは古いプロジェクトならよくあることよ

917:名無しさん@お腹いっぱい。
17/02/14 10:54:10.92 .net
そうか2バイト文字の1バイトが&#165;なせいでエスケープ扱いしちゃってたのな…
UTF8とかだと回避出来るんかなこれは

918:名無しさん@お腹いっぱい。
17/02/14 11:54:23.78 .net
んなもん当たり前だろ、としか思えない私はおっさん確定。SJIS死すべしと思っていたのは25年前くらい?
これが世代というものなんですね……

919:894
17/02/14 13:40:31.07 .net
25年前からプログラマやってる人と並んだらさすがに俺はクソガキだわ
にしても意外なほどググっても出ないな、それほどマイナーなのかこの症状
もしくは当たり前すぎるのか

920:名無しさん@お腹いっぱい。
17/02/14 15:20:01.03 .net
>>902
sjis ダメ文字でググればごろごろと

921:894
17/02/14 15:23:50.72 .net
>>903
sh read 漢字 文字化け とかで出てほしかった…
勉強なったわサンクス

922:名無しさん@お腹いっぱい。
17/02/14 15:40:03.34 .net
sjis 文字化け でも出るで
もう少しやったな

923:894
17/02/14 16:05:30.25 .net
あー、出るには出るけど多分readとの関連に気づかなかったろうな…ダメ文字ってものをまず知らなかったし
特定の漢字が文字化けってあたりの記事から推察して、SJISがなんかマズイってとこにはたどり着いたかもしれんが、多分それでもread -rには気づかなかったと思うわ
iconv -t utf8してたと思う

924:名無しさん@お腹いっぱい。
17/02/14 17:11:17.24 .net
>>906
iconv を利用するのはアリだと思うよ。
業務系のシェルスクリプトでも「SJIS データを一時的に UTF-8 にコンバートして何らかの処理をした後に SJIS に戻す」という手法で実装することがある。

925:894
17/02/14 17:17:09.33 .net
>>907
便利だよねiconv

926:名無しさん@お腹いっぱい。
17/02/14 20:50:41.08 .net
おれは、使い慣れてるnkfでcp932→utf-8に変換してから作業してるわ。

927:名無しさん@お腹いっぱい。
17/02/15 01:22:16.71 .net
そんで戻ってこない文字が出てきて泣きそうになるまでがテンプレだね。

928:名無しさん@お腹いっぱい。
17/02/15 01:34:33.21 .net
それでもiconvなら
iconvならきっとなんとかしてくれる

929:名無しさん@お腹いっぱい。
17/02/15 04:53:01.40 .net
元がcp932なら変換不能になることはないだろう
そう、iconvならね

930:名無しさん@お腹いっぱい。
17/02/18 04:37:58.77 .net
#!/bin/bash
echo A > test.txt ; echo B >> test.txt
ARRAY=$(cat test.txt)
for item in ${ARRAY[@]}; do
echo $item
done
としたら
A
B
と表示されるので、$ARRAYは 2個の要素を持つ配列になったのだと思っていました。

ところが要素数を
echo ${#ARRAY[@]}
で表示させたら 1 が表示されます。

$ARRAYは配列になっていないのでしょうか?
だとすると、なぜ for item … で表示されたのか?

931:名無しさん@お腹いっぱい。
17/02/18 04:55:39.09 .net
indexも表示させればわかるよ

echo A > test.txt; echo B >> test.txt

ARRAY=$(cat /tmp/test.txt)
for (( i=0; i<${#ARRAY[@]}; i++ )) do
printf "ARRAY index:%d value:%s\n" "$i" "${ARRAY[i]}"
done

readarray -t ARRAY2 < <(cat /tmp/test.txt)
for (( i=0; i<${#ARRAY2[@]}; i++ )) do
printf "ARRAY2 index:%d value:%s\n" "$i" "${ARRAY2[i]}"
done

932:名無しさん@お腹いっぱい。
17/02/18 05:52:55.03 .net
>>914
readarray -t ARRAY < <(cat test.txt)
で綺麗に配列として読まれますね。
これでいま作っている自作ツールが完成出来ます。
ありがとうございます

933:名無しさん@お腹いっぱい。
17/02/18 09:43:20.54 .net
最初の例のやつ、多分配列になってないんじゃないか

934:名無しさん@お腹いっぱい。
17/02/18 14:18:47.86 .net
>>916
#!/bin/bash
echo A > test.txt ; echo B >> test.txt
ARRAY=$(cat test.txt)
N=1
for item in ${ARRAY[@]}; do
echo ARRAY[$N]=$item
N=$(($N + 1))
done

としたら
ARRAY[1]=A
ARRAY[2]=B
と表示されて、配列になっているようです

935:名無しさん@お腹いっぱい。
17/02/18 16:02:36.82 .net
>>917
それは配列になってるんじゃなくてforループで一つ目の要素がsplitされてるだけ
echo A > test.txt ; echo B C >> test.txt みたいにスペースなんかが入ると対処できないからそういうコードはやめたほうがいい
for item in "${ARRAY[@]}"; do ってクウォートすると結果変わるでしょ?

あと”<(cat test.txt)”は比較のために書いただけでcatしなくても大丈夫
readarray -t ARRAY < test.txt

while readするかreadarray(=mapfile)使うか
URLリンク(mywiki.wooledge.org)

936:名無しさん@お腹いっぱい。
17/02/18 17:07:28.86 .net
>>918
> それは配列になってるんじゃなくてforループで一つ目の要素がsplitされてるだけ
> for item in "${ARRAY[@]}"; do ってクウォートすると結果変わるでしょ?

なるほど。
配列になっていないのと、検証の方法が間違っていたことがよく理解出来ました。

> echo A > test.txt ; echo B C >> test.txt みたいにスペースなんかが入ると対処できないからそういうコードはやめたほうがいい

気を付けます。

> あと”<(cat test.txt)”は比較のために書いただけでcatしなくても大丈夫
> readarray -t ARRAY < test.txt
> while readするかreadarray(=mapfile)使うか
> URLリンク(mywiki.wooledge.org)

ありがとうございます。
もっと勉強します

937:名無しさん@お腹いっぱい。
17/02/20 13:16:49.47 .net
>>919
[user@f25 ~]$ ARRAY=$(cat test.txt)
[user@f25 ~]$ declare -p ARRAY
declare -- ARRAY="A
B"
[user@f25 ~]$ readarray -t ARRAY < test.txt
[user@f25 ~]$ declare -p ARRAY
declare -a ARRAY='([0]="A" [1]="B")'

938:名無しさん@お腹いっぱい。
17/02/20 18:00:26.41 .net
>>920
declare -p !!!
知らなんだ

939:名無しさん@お腹いっぱい。
17/02/20 18:11:16.14 .net
このスレ来ると度々便利な知識得られるからいいわ
grep -oとか

940:名無しさん@お腹いっぱい。
17/02/21 05:20:06.32 .net
配列にするなら
ARRAY=( $(cat test.txt) )

941:名無しさん@お腹いっぱい。
17/02/21 16:45:06.28 .net
>>923
echo A > test.txt ; echo B C >> test.txt みたいにスペースなんかが入ると…

942:名無しさん@お腹いっぱい。
17/02/21 19:03:20.01 .net
IFS=$'\n'
ARRAY=( $(cat test.txt) )
declare -p ARRAY

とすれば空白混じりの行も1行として扱われるが、
空行(何も文字が無い行)は$ARRAYに読み込まれない

readarray -t ARRAY < test.txt
declare -p ARRAY

だと空行も読み込んでくれる

943:名無しさん@お腹いっぱい。
17/02/28 23:57:54.64 .net
echo test | grep a
みたいな時に終了コードはgrepこの場合1
でかつ標準出力にはtestが出ていて欲しいのですが

どうしたらいいでしょうか?
環境はbashです

944:名無しさん@お腹いっぱい。
17/03/01 00:40:42.45 .net
echo test | tee /dev/tty | grep a

でどうだろう?


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch