シェルスクリプト総合 その24at UNIX
シェルスクリプト総合 その24 - 暇つぶし2ch500:名無しさん@お腹いっぱい。
15/04/16 23:26:24.70 .net
GNU date
$ TIME="2015/04/15 08:25:16"
$ date '+%m/%d %H:%M' --date="${TIME}"
04/15 08:25

501:名無しさん@お腹いっぱい。
15/04/30 23:24:48.53 .net
今月のsoftware designはgrepsedawk入門で面白かったな

502:名無しさん@お腹いっぱい。
15/05/07 20:52:12.51 .net
シェルスクリプトを最近使うようになりffmpegなどにファイルを投げて一括処理できるようになりました。
でも、エラー処理に困っています。例えば、ffmpegで作ったファイルが壊れているかどうかわからないのです。
ffmpegはファイルとログを出してくれるのでログの特定の文字(たとえば、bad header、skip)が出てきたときに、
その時のログを書き出し、そのログを使って処理を分岐させることは可能なのでしょうか?
このときffmpegは終了コードは0を返してきました。プログラムによっては終了コード1を返してしてくるものもありました。

503:名無しさん@お腹いっぱい。
15/05/07 20:53:06.51 .net
grep君でうまく抽出したら正規表現で検索すればできるのでは?

504:名無しさん@お腹いっぱい。
15/05/07 21:54:28.34 .net
>>502
ffmpegは最後に 2>&1 を付ける
付ければログをgrepとかできる

505:名無しさん@お腹いっぱい。
15/05/08 20:35:13.72 .net
grepをどう使えばいいのですか?

506:名無しさん@お腹いっぱい。
15/05/08 22:13:16.56 .net
manくらい見た?

507:名無しさん@お腹いっぱい。
15/05/08 22:36:52.79 .net
うーんこの
man見てくれよせめて--helpとかググるとかしろよ

508:名無しさん@お腹いっぱい。
15/05/09 12:39:02.61 .net
こんな感じでエラー処理するんだよ
書き込みの内容見てる限りは無理だと思うけど
ffmpeg xxxx > xxxx.log 2>&1
cat xxxx.log | grep "bad header"
if [ $? -ne 0 ]
then
# エラー処理
fi

509:名無しさん@お腹いっぱい。
15/05/09 12:42:06.41 .net
catは無駄だな。

510:名無しさん@お腹いっぱい。
15/05/09 13:01:23.55 .net
if [ も無駄だな

511:名無しさん@お腹いっぱい。
15/05/09 13:11:39.85 .net
>>509
判定が1種類だと思ってるアホ発見

512:名無しさん@お腹いっぱい。
15/05/09 13:25:48.27 .net
>>511
二種類あるとどうなるわけ?w

513:名無しさん@お腹いっぱい。
15/05/09 13:26:22.67 .net
無駄だなw

514:名無しさん@お腹いっぱい。
15/05/09 13:32:28.84 .net
>>511
わかった、こいつ馬鹿だから、catがどう無駄なのかわかってないんだ。
なるほどなー、馬鹿だなーw

515:名無しさん@お腹いっぱい。
15/05/09 15:56:32.15 .net
ffmpeg xxxx > xxxx.log 2>&1
if ! grep "bad header" <xxxx.log
then
# エラー処理
fi

516:名無しさん@お腹いっぱい。
15/05/09 18:51:16.11 .net
if [ -n "$(grep 'bad header' xxxx.log)" ]; then
fi

517:名無しさん@お腹いっぱい。
15/05/09 20:08:36.31 .net
grep -qs "bad header" xxxx.log
case $? in 0) echo "Match";; 1) echo "No match";; *) echo "Error";; esac

518:名無しさん@お腹いっぱい。
15/05/11 21:15:37.13 .net
>>515
これだと判定のたびにログを全部読み直すから無駄無駄

519:名無しさん@お腹いっぱい。
15/05/11 22:56:21.16 .net
>>518
どう直せばいいと思う?

520:名無しさん@お腹いっぱい。
15/05/12 18:27:59.13 .net
bashで
for i in $@
do
command
echo ○○中××番目を処理中です。
done
としたいのですが、○○と××はどうすれば表示できるようになりますか?

521:名無しさん@お腹いっぱい。
15/05/12 19:54:49.92 .net
もう一つ聞きたいことがありました
for i in $@にカレントディレクトリだけじゃなく
そのサブディレクトリのファイルを送るにはどう書けばよいのですか?

522:名無しさん@お腹いっぱい。
15/05/12 19:59:27.57 .net
>>520
count=1
for i in $@
do
echo "$#中${count}番目を処理中です。"
command
count=$(($count + 1))
done

523:名無しさん@お腹いっぱい。
15/05/12 20:00:20.69 .net
コピペから脱却すればその答えはおのずと見つかるであろう

524:名無しさん@お腹いっぱい。
15/05/12 20:18:46.18 .net
わざわざ指摘させる流れですか?もうひとつは残しておいた
in $@ は無駄だな

525:名無しさん@お腹いっぱい。
15/05/13 06:35:40.84 .net
$count の $ は無駄だな。
count=$(($count + 1)) の行自体も無駄とは言わないけどbashなら不要だな。
echo "$#中$(( count++ ))番目を処理中です。"

526:名無しさん@お腹いっぱい。
15/05/13 07:02:23.50 .net
>>525
可読性・保守性が悪いから却下

527:名無しさん@お腹いっぱい。
15/05/13 07:23:59.83 .net
for ((i=1;i<=$#;i++)); do echo "${#}中${i}番目を処理中"; done

528:名無しさん@お腹いっぱい。
15/05/13 07:39:14.30 .net
>>527
それだと肝心の $@ の処理ができないじゃん、本末転倒。

529:名無しさん@お腹いっぱい。
15/05/13 08:39:25.96 .net
$@ をどう処理したいの? 例えばこんな感じ?
for ((i=1;i<=$#;i++)); do eval item=\${$i};echo "${#}中${i}番目($item)を処理中"; done

530:名無しさん@お腹いっぱい。
15/05/13 13:58:41.25 .net
curlでメールチェックできないかと思ったんだけど、どうも参考コードが見当たらないなあ。
もしかしてtelnetのような感じの方法になってスマートには無理なのだろうか?

531:名無しさん@お腹いっぱい。
15/05/13 17:11:23.00 .net
こういうことではなくて?
URLリンク(blog.sarabande.jp)

532:名無しさん@お腹いっぱい。
15/05/13 17:26:02.42 .net
送信と受信の違いがわからない男おことわりw

533:名無しさん@お腹いっぱい。
15/05/13 17:49:35.48 .net
ああなるほど、送信がわかれば受信もできるのがわかるから
調べればいいのにと思ったのに
実装されてるコードそのものが欲しかったのね
キミのレベルに合わせられなくてごめんね

534:名無しさん@お腹いっぱい。
15/05/13 17:52:16.16 .net
マニュアル見れば受信できることなんて一目瞭然だよ

535:名無しさん@お腹いっぱい。
15/05/13 19:45:16.01 .net
カウントありがとうございます
サブディレクトリのほうは無理のでしょうか?

536:名無しさん@お腹いっぱい。
15/05/14 01:27:00.37 .net
>>535
$ hogehoge.sh *     カレントディレクトリのファイルだけ
$ hogehoge.sh $(find)  カレントとサブディレクトリ全部

537:名無しさん@お腹いっぱい。
15/05/14 02:06:32.75 .net
>>534
できないなんて話は最初からどこにもないしなあ。
送信と受信の違いというかプロトコル自体が違うんだから参考になるかどうか。

538:名無しさん@お腹いっぱい。
15/05/14 05:00:09.66 .net
マニュアルにPOP3の記載とかあると思うんだが
脳内で>>531=>>534って妄想でもしたか?

539:名無しさん@お腹いっぱい。
15/05/14 06:30:49.15 .net
>>535
IFS=$'\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="$( )" のダブルクォートって無駄かな?

540:名無しさん@お腹いっぱい。
15/05/14 07:13:26.75 .net
v= のように直接代入する場合はダブルクォートは無駄。
それより、findでスペース入りファイル名が見つかった場合とかの対応ができてない。

541:名無しさん@お腹いっぱい。
15/05/14 07:25:46.50 .net
findで苦労してスペース入りファイル名の対処するより、
for f in * */* */*/* */*/*/*
って書いちゃった方が早いんだよな。どうせ階層は何段階か有限だし、
アスタリスクならスペース入りでも無問題。

542:名無しさん@お腹いっぱい。
15/05/14 07:27:50.46 .net
> findでスペース入りファイル名が見つかった場合とかの対応
IFS=$'\n'

543:名無しさん@お腹いっぱい。
15/05/14 07:35:52.80 .net
findで改行入りファイル名が見つかった場合とかの対応ができてない

544:名無しさん@お腹いっぱい。
15/05/14 07:44:29.36 .net
> 改行入りファイル名が
それは
IFS=$'\n'
と書いてある時点で、自明じゃない?
指摘自体が無駄だな

545:名無しさん@お腹いっぱい。
15/05/14 07:46:27.90 .net
自明ならバグを作り込んでもいいのかよw 結局使いものにならない

546:名無しさん@お腹いっぱい。
15/05/14 07:49:42.88 .net
シェルなどのコマンドラインの入力に再利用可能な方法でちゃんとエスケープしてファイル名出力できるようなオプションが
findに欲しいな。(スペースも改行もその他記号もちゃんとクォートして、シェルで評価すると元のファイル名に戻る形式)
(-print0 は xargs 用にしか使えないし)

547:名無しさん@お腹いっぱい。
15/05/14 08:06:46.69 .net
やるならこんな感じかな。
$ 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

548:名無しさん@お腹いっぱい。
15/05/14 09:04:56.24 .net
while read -rd ''

549:名無しさん@お腹いっぱい。
15/05/14 09:46:33.11 .net
>>538
なぜそういう話になるのかよくわからんが、記載があるならぐだぐだ言うよりコピペで一発なんじゃないか?

550:名無しさん@お腹いっぱい。
15/05/14 10:26:05.55 .net
誰も相手してないのになぜその質問に触れるかなあ・・・

551:名無しさん@お腹いっぱい。
15/05/14 10:28:14.98 .net
read -rd '' とかはbash依存なんだよなぁ。。
read: 1: Illegal option -d

552:名無しさん@お腹いっぱい。
15/05/14 10:36:47.40 .net
>>550
どの質問の話?

553:名無しさん@お腹いっぱい。
15/05/14 11:21:47.00 .net
コマンド置換とシェル関数の違いがピンとこないのですけど
どう違うのでしょか?

554:名無しさん@お腹いっぱい。
15/05/14 11:31:29.33 .net
記載がある筈 なんてはっきりしない話は要らないんだよなあ。
このスレのネタなんて大抵記載がある筈だから。

555:名無しさん@お腹いっぱい。
15/05/14 12:13:05.97 .net
どう勘違いしたらコマンド置換とシェル関数が同じようなものに思えるんだ??

556:名無しさん@お腹いっぱい。
15/05/14 12:15:56.28 .net
>>553
使う分には
・コマンド置換は再利用ができない
・シェル関数は再利用ができる
の違いがある

557:名無しさん@お腹いっぱい。
15/05/14 12:19:07.87 .net
それこそ置き換えの効かない例でも出せば理解するだろ。

558:名無しさん@お腹いっぱい。
15/05/14 12:21:29.00 .net
ll(){ ls -l;}
ll
ってのがシェル関数。
hoge=`ls`
echo "$hoge"
ってのがコマンド置換。
どこも似てない。

559:名無しさん@お腹いっぱい。
15/05/14 12:25:28.02 .net
どう勘違いしたら言語的文法的に似てるかという話に思えるんだ?

560:名無しさん@お腹いっぱい。
15/05/14 12:45:56.98 .net
むしろ似てると思うのは何か根本的な勘違いが原因

561:名無しさん@お腹いっぱい。
15/05/14 13:19:51.91 .net
コマンド置換をaliasと勘違いしてるとか?

562:名無しさん@お腹いっぱい。
15/05/14 13:27:28.77 .net
>>551
今回はbash限定でいい話しだよ。まあ、無駄じゃあないけど
>>520
> bashで
> bashで
> bashで

563:名無しさん@お腹いっぱい。
15/05/14 14:08:51.71 .net
違いを聞くのは別に似てるからじゃないと思うぞ。
単にとある使い方では等価に思えたってだけだろう。
重箱の隅が知りたいみたいな話だな。

564:名無しさん@お腹いっぱい。
15/05/14 14:28:51.82 .net
どう勘違いしたらコマンド置換とシェル関数が等価に思えるような使い方があるんだ??

565:名無しさん@お腹いっぱい。
15/05/14 14:47:51.26 .net
ageてる人が等価に思えるような話だろう。

566:名無しさん@お腹いっぱい。
15/05/14 18:12:58.96 .net
おっしゃる通り、使い方が同じに見えたので
どんな使い分けをしたらいいのだろうと思っていました

567:名無しさん@お腹いっぱい。
15/05/14 19:43:10.96 .net
>>563
いや、その気持ちが分かるなら答えてやれよ。
さっぱり分からん人間には答えようがないんだから。

568:名無しさん@お腹いっぱい。
15/05/14 20:08:14.55 .net
使い分けとか考えなくていいんじゃないの?
期待通りの動作をしない場合がないのかだけ考えれば。

569:名無しさん@お腹いっぱい。
15/05/14 20:38:06.69 .net
>>567
わからなきゃ聞くしかなかろ。
気持ちの想像すらできなければ回答役なんて荷が重いから
黙って見守るべきだと思う。

570:名無しさん@お腹いっぱい。
15/05/14 20:54:02.91 .net
>>569
は?だからお前が適任だろ?って話をしてるんだが?
さてはお前どえらい馬鹿だな?

571:名無しさん@お腹いっぱい。
15/05/14 21:13:48.75 .net
聞こうとしている時にそんな暴言を言うから
気持ちの想像すらできないなんて言われるんですよ。

572:名無しさん@お腹いっぱい。
15/05/14 21:20:34.11 .net
>>571
なんか壮大な勘違いをしてるようだから言っとくけど
お前かなり性格悪そうに見えてるぞ

573:名無しさん@お腹いっぱい。
15/05/14 21:25:29.94 .net
>>568以外になにか言う事でもあるの?

574:名無しさん@お腹いっぱい。
15/05/15 06:21:18.71 .net
echo $(a=A;echo $a)
echo $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

575:名無しさん@お腹いっぱい。
15/05/15 07:08:32.05 .net
色々言ってたけど結局メールチェックは誰も試してないの?

576:名無しさん@お腹いっぱい。
15/05/15 08:03:24.42 .net
curlでやってるよ
IMAPもPOP3も普通に使える

577:名無しさん@お腹いっぱい。
15/05/15 08:50:33.60 .net
./test.sh: 行 5: 予期しないトークン `{a=A' 周辺に構文エラーがあります
b () (a=A;echo $a)

578:名無しさん@お腹いっぱい。
15/05/15 11:06:13.53 .net
ここ見てると昔書いたスクリプトについて
あのコマンドはああするべきだったとか思うことはあるけど
曲がりなりにも期待した動作はしてたから問題ないと思い直した

579:名無しさん@お腹いっぱい。
15/05/15 13:23:55.72 .net
>>577
そう。そこに違いがある事が言いたかった。

580:隼人新聞社
15/05/15 17:26:05.10 .net
★サヨクを応援して1票入れた人は強く反省してください
★民主 枝 野 は殺人を平気で行う極左テロ暴力団と親密交際があった!!!親密交際!テロの手先!北朝鮮の手先(安倍総理の談話)
★   菅 直 人 は朝鮮人と親密交際、献金があった!!朝鮮韓国の傀儡手先(TVで報道!)
★民主は日教組の巣窟。極めて危険な団体、危険な政権だった!北朝鮮を熱烈に支援するのが日教組(信頼できる情報スジの話)!!北朝鮮の手先!
民主の基本姿勢は死刑廃止!!だから自民の安倍総理を支援してください!
サヨクと公明創価を応援するは地獄行き
サヨクを応援して1票入れた人は反省してください

581:名無しさん@お腹いっぱい。
15/05/16 18:18:52.70 .net
キー入力を受け付けを待って止まっているコマンドを
何らかの方法で次のコマンドに行かせる方法はありますか?

582:名無しさん@お腹いっぱい。
15/05/16 18:38:27.01 .net
zshだとzpty
tclだとexpect
ただ単純な事なら
command<<EOF
y
y
n
EOF
とかこんなんで処理できるよ。

583:名無しさん@お腹いっぱい。
15/05/16 18:41:48.45 .net
マウスつかってどうのこうのの話なら、xdotoolとかいうのが使えそう。
plamolinuxのこじま氏の2015/1/8の日記に少し使い方が書いてある。

584:名無しさん@お腹いっぱい。
15/05/17 09:38:15.41 .net
>>582, >>583
ありがとう
早速、調べてみます
今までできないものと思って諦めていたから感動

585:名無しさん@お腹いっぱい。
15/05/17 18:06:01.98 .net
freebsdのスレッドの人なのかなと思ったので以下でできたよ。詳しい事は知らない。
最近はbashのほうが強力なのかもしれないし、おそらく似た機能はあると思う。
ただexpectが定番だと思う。ただ構文はtclだけど、
たぶん他のshellを使うのって嫌な部分があるだろうし。
# まず以下のpasswordの部分を書いて、試して、感じる。
expect -c '
spawn su
expect Password:
send "your password\r"
interact
'
# passwordとpromptの指定の部分を書換える必要があると思う。
expect -c '
spawn su ;# expectで制御できるようにsuを起動する。
expect Password: ;# promptにPassword:が来るまで待機。
send "your password\r" ;# 来たら引数で指定されたpasswordを入力する。
expect -re {(%|#|\\$) $} ;# Password:が来るまで待機になってたものを、
;# promptの入力受け付け画面に変える。
;# -reは正規表現。ここはmanpageそのまま写しました。
;# 各々によって変える必要があるでしょう。
send "whoami\r"
send "exit\r"
expect eof
'

586:名無しさん@お腹いっぱい。
15/05/19 17:38:24.79 .net
forやwhileとかの中でコマンドを実行するとき
そのコマンドをforやwhileに直接書いて実行させるか
変数扱いさせてのforやwhile上にコマンドを書いて実行させるか
関数として定義してやってforやwhileの中で実行させてやるか
どれが効率的で高速に実行することができるようになるんだろう?
コマンドの呼び出しや実行や終了の重複を考えるとどうなんだろう?
シェルスクリプトを自分で書けるようになってきて、こんな疑問を持つようになりました
皆さんの意見を聞かせて下さい

587:名無しさん@お腹いっぱい。
15/05/19 17:45:28.31 .net
高速っていうなら直接コマンド記述が高速。
for/whileループであっても、ループ内をキャッシュしたりせず、
毎回コマンド行とか変数とか関数を評価し直しながら実行してる。
しかしシェルスクリプトに高速性なんて求めてはいけない。

588:名無しさん@お腹いっぱい。
15/05/19 20:08:13.54 .net
そもそも高速化ってそういう事じゃないしな。
何回そのプログラムを実行すれば、そんな間違った高速化の為に費した時間を取り戻せると思う?

589:名無しさん@お腹いっぱい。
15/05/19 21:29:44.56 .net
高速化したいならプログラム書くしかない
プロセスを起動するコストは莫大だから

590:名無しさん@お腹いっぱい。
15/05/19 21:54:05.59 .net
iniファイルを読み書きして、ファイル名をキーにしてすでに処理済みのファイルかどうかを条件判定、
みたいなことをbusyboxに内包された汎用コマンドだけでやるには、どうしたらいい?
決められたディレクトリの中に、リサイズしたいjpg画像群があって、
処理済みかどうかを条件分岐したかったんだけど、時間が無くて別のツールで
間に合わせてしまった。再びやりたくて調べてみたけど、実装事例を見つけられず。

591:名無しさん@お腹いっぱい。
15/05/19 22:48:04.62 .net
busyboxでやりたいならそちらでどうぞ
ちなみにシェルスクリプトでやるならlsでリスト作って
ループしながら処理すればいいと思う
処理済はどこかのファイルにファイル名を書き出して
ループでの処理前にその中にファイルがあるかどうかgrepなどで見て
無ければ処理すればいい
あとなんとなく579=583臭がするけど気のせいか

592:名無しさん@お腹いっぱい。
15/05/19 22:58:05.98 .net
ありがと。大きなヒントをもらえたので、作ってみる。
ちなみに同一人物じゃないよ。

593:名無しさん@お腹いっぱい。
15/05/20 11:34:26.93 .net
>>588, >>589
ドツボにはまりかけてました

>>591
妄想、乙

594:名無しさん@お腹いっぱい。
15/05/20 13:31:28.02 .net
なんだコイツ

595:名無しさん@お腹いっぱい。
15/05/20 17:55:29.75 .net
よう、ネット番長

596:名無しさん@お腹いっぱい。
15/05/20 18:12:52.71 .net
こんな>>586
何言いたいか曖昧な事にまともに答えてくれた人に感謝する事だね。
私は何も答えなかったよ。それこそ妄想、乙と感じたしね。

597:名無しさん@お腹いっぱい。
15/05/20 18:24:21.97 .net
× 答えなかった
○ 答えられなかった(コミュ能力不足)

598:名無しさん@お腹いっぱい。
15/05/20 18:27:39.23 .net
まぁある意味答えられなかったとは言えるな。
認めよう。

599:名無しさん@お腹いっぱい。
15/05/20 18:33:19.73 .net
少なくとも、ほかの人はある程度の要求仕様をくみ取るところまでは出来たわけだから、
コミュ能力であることは明白。キミさー、これじゃ仕事できないよ。

600:名無しさん@お腹いっぱい。
15/05/20 18:38:02.12 .net
そうだねバファリンの半分が優しさでできているのだとしたら、
彼等は九割方優しさで出来てるといえるね。

601:名無しさん@お腹いっぱい。
15/05/20 19:11:05.53 .net
追っ払っといた。以降スルーで。
あいつはおたくらが汚いレスする値打ちも無い。だからこそ俺の様な男がいるのさ。

602:名無しさん@お腹いっぱい。
15/05/21 06:15:13.14 .net
-gt の利点について教えてください。
[ HOGE -gt 123 ]
は、
((HOGE > 123))
とも記述できますよね? なら -gt の必要性はあるのでしょうか?

603:名無しさん@お腹いっぱい。
15/05/21 10:47:36.25 .net
>>576
一体どういう書式のどんな結果をどうやって受け取っているのか、参考までに見せて欲しい。

604:名無しさん@お腹いっぱい。
15/05/21 13:10:57.30 .net
>>602
前者はbourne shellから使える一般的な方法
後者は一部のシェルの拡張機能で、使えない場合がある。
使えるならどっちでもいい。上で出てたbusyboxのshだと使えないんじゃないかな多分

605:名無しさん@お腹いっぱい。
15/05/21 15:22:40.17 .net
>>602
数値比較だから16進や8進表現が使える

606:名無しさん@お腹いっぱい。
15/05/21 16:10:57.08 .net
>>605
-gt の利点として??

607:名無しさん@お腹いっぱい。
15/05/21 16:34:31.27 .net
利点欠点というより
数値比較と文字列比較で機能が異なるので
比べるものじゃない

608:名無しさん@お腹いっぱい。
15/05/21 17:02:11.38 .net
[ -gt ] も (( > )) も、数値としての比較だが、、

609:名無しさん@お腹いっぱい。
15/05/21 17:12:42.96 .net
ごめ、誤解してたわ

610:名無しさん@お腹いっぱい。
15/05/21 22:58:30.82 .net
>>603
いくら?

611:名無しさん@お腹いっぱい。
15/05/22 10:22:56.55 .net
まず自分なりに作ったサンプル出してからうまくいかないと相談すればいいのに
はなから見せろとか無いわ~

612:名無しさん@お腹いっぱい。
15/05/22 11:00:25.39 .net
#/bin/sh
curl
ほい

613:名無しさん@お腹いっぱい。
15/05/22 11:11:39.20 .net
すみませんが詳しい方のみ回答をお願いします

614:名無しさん@お腹いっぱい。
15/05/22 11:19:33.89 .net
>>612
ドキュメント読んで出直してこい

615:名無しさん@お腹いっぱい。
15/05/22 11:36:29.05 .net
やだね
(echo USER hoge; echo PASS pass; echo STAT) | nc server 110

616:名無しさん@お腹いっぱい。
15/05/22 11:38:38.49 .net
>>612
そこまでして欲しいのかwww
頭が無いなら金を払えよ

617:名無しさん@お腹いっぱい。
15/05/22 11:41:25.48 .net
>>616
>>613

618:名無しさん@お腹いっぱい。
15/05/22 11:52:29.57 .net
DOC嫁なんて言う奴に限って自分は読んでいないのもよくある話。

619:名無しさん@お腹いっぱい。
15/05/22 12:14:11.32 .net
読むのは質問者で回答者じゃない

620:名無しさん@お腹いっぱい。
15/05/22 12:15:28.97 .net
>>619
>>613

621:名無しさん@お腹いっぱい。
15/05/23 00:45:24.32 .net
>>613
そら違うだろ
回答してくれる気のある方のみレスしてくださいだろ

622:名無しさん@お腹いっぱい。
15/05/23 07:23:22.41 .net
コピペ荒らしにマジレスしてもねぇ

623:名無しさん@お腹いっぱい。
15/05/23 07:57:47.77 .net
利点とかより互換性だけじゃね?

624:名無しさん@お腹いっぱい。
15/05/23 09:04:23.16 .net
>>621
自分では回答しているつもりになっている半可通が居るからじゃないの?
>>532とかは回答なんだろうけど、回答者からは質問者だと錯覚されるから回答がこなくなる。

625:名無しさん@お腹いっぱい。
15/05/23 09:53:03.52 .net
100レス近く前の書き込みを引っ張る質問者も
相当な意気込みで実装したいらしいな
いじってやるからまた書き込みなよ

626:名無しさん@お腹いっぱい。
15/05/23 11:20:44.87 .net
ほら居るし。

627:名無しさん@お腹いっぱい。
15/05/23 11:26:14.78 .net
これだけの時間があればCででも実装できたろうにw

628:名無しさん@お腹いっぱい。
15/05/23 11:31:28.73 .net
教えてやるから結果を見せろというべきだな。
それが正当な対価だろう。

629:名無しさん@お腹いっぱい。
15/05/23 12:58:15.22 .net
他人の結果に興味はないだろ普通。
「できましたー!!」←これが対価なの?
馬鹿にしてるの?

630:名無しさん@お腹いっぱい。
15/05/23 14:47:50.85 .net
興味がないのに口出す訳ないだろう。

631:名無しさん@お腹いっぱい。
15/05/23 14:55:03.12 .net
>>613ですが、ロム容量が極小の組み込み機器に入れる予定で、
シェルスクリプトじゃないとダメです。
繰り返しますがわかる方のみ回答してください。
わからない方は技術力がないと同一ですので(認めたくないでしょうけど)、
素直に黙るのが賢明です。

632:名無しさん@お腹いっぱい。
15/05/23 15:29:15.99 .net
>>631
極小ならアセンブラだろ

633:名無しさん@お腹いっぱい。
15/05/23 15:32:43.77 .net
偽者の>>631は消えろ
まあこれぶっちゃけ200万レベルの仕事だね

634:名無しさん@お腹いっぱい。
15/05/23 15:50:06.27 .net
アセンブラでも構いません。ARMでお願いします。
繰り返しますがわかる方のみ回答してください。

635:名無しさん@お腹いっぱい。
15/05/23 15:58:55.20 .net
>>633
シェルスクリプトで暗号通貨のウォレットでも作れば?

636:名無しさん@お腹いっぱい。
15/05/23 16:04:25.94 .net
それはもうできています。
すみませんが質問にだけ回答してください。

637:名無しさん@お腹いっぱい。
15/05/23 16:39:09.77 .net
できてるならみせてよ

638:名無しさん@お腹いっぱい。
15/05/23 16:52:36.76 .net
繰り返しますがわかる方のみ、質問にだけ回答してください。

639:名無しさん@お腹いっぱい。
15/05/23 17:05:15.19 .net
>>638
回答者以外はご遠慮下さい。

640:名無しさん@お腹いっぱい。
15/05/23 17:07:20.51 .net
こっちは仕事でやってるんです。
趣味で遊んでるアナタ方とは違うんです。

641:名無しさん@お腹いっぱい。
15/05/23 17:09:47.01 .net
そういうネタをやられては困ります。

642:名無しさん@お腹いっぱい。
15/05/23 17:43:32.85 .net
仕事でやってるのにまさかただとは...

643:名無しさん@お腹いっぱい。
15/05/23 17:56:45.03 .net
仕事とかいうネタはやめましょうねボク。

644:名無しさん@お腹いっぱい。
15/05/23 18:22:50.65 .net
仕事=質量×距離

645:名無しさん@お腹いっぱい。
15/05/23 18:27:23.08 .net
>>644
仕事=力×距離
ネタぐらい正しく書こうね

646:名無しさん@お腹いっぱい。
15/05/23 18:57:31.97 .net
>>645
仕事=速度&#178;×質量
だろ

647:名無しさん@お腹いっぱい。
15/05/23 19:02:04.07 .net
電子工学系の者にとっては
仕事=電圧×電流×時間

648:名無しさん@お腹いっぱい。
15/05/24 08:36:07.43 .net
仕事=電界×磁界×断面積×時間

649:名無しさん@お腹いっぱい。
15/05/24 09:10:55.86 .net
金=仕事x時間

650:名無しさん@お腹いっぱい。
15/05/24 09:16:37.72 .net
∂金/∂t = ∇×仕事

651:名無しさん@お腹いっぱい。
15/05/24 09:43:16.72 .net
∇・金=0 (金は湧いてこない)

652:名無しさん@お腹いっぱい。
15/05/24 11:40:16.08 .net
>>644-652
もういいんじゃない?

653:名無しさん@お腹いっぱい。
15/05/24 11:47:41.07 .net
仕事×2ch=解雇

654:名無しさん@お腹いっぱい。
15/05/24 13:06:10.39 .net
シェルスクリプトで計算式記述してみてよ

655:名無しさん@お腹いっぱい。
15/05/24 13:18:01.71 .net
物理量の仕事じゃなくて、こっちは本当の仕事でやってるんです。
趣味で遊んでるアナタ方とは違うんです。

656:名無しさん@お腹いっぱい。
15/05/24 13:29:57.13 .net
まあどうみても>>631は趣味だけどな。

657:名無しさん@お腹いっぱい。
15/05/24 18:19:02.96 .net
まちがって、
cd //
ってやったら、エラーにならずに、pwdが//になったw
どこにいたんだ?ww

658:名無しさん@お腹いっぱい。
15/05/24 18:24:05.92 .net
ネットワークのトップか
そんなとこにも移動できるのか

659:名無しさん@お腹いっぱい。
15/05/24 18:58:32.27 .net
>>657
bashの仕様です。今ごろ気が付いたの?

660:名無しさん@お腹いっぱい。
15/05/24 21:43:39.35 .net
知らなかった

661:名無しさん@お腹いっぱい。
15/05/25 12:23:11.70 .net
> bashの仕様す。
というよりは、POSIX かな
URLリンク(pubs.opengroup.org)
3.267 Pathname
Multiple successive <slash> characters are considered to be the same as one <slash>,
except for the case of exactly two leading <slash> characters.
4.12 Pathname Resolution
If a pathname begins with two successive <slash> characters, the first component following
the leading <slash> characters may be interpreted in an implementation-defined manner,
although more than two leading <slash> characters shall be treated as a single <slash>
character.

662:名無しさん@お腹いっぱい。
15/05/25 12:36:39.43 .net
英語よめんけどなんか違う

663:名無しさん@お腹いっぱい。
15/05/25 14:37:48.45 .net
知識無いのに 「bashの仕様です。今ごろ気が付いたの?」 とか恥ずかしくないのだろうか

664:名無しさん@お腹いっぱい。
15/05/25 16:59:21.87 .net
script書いたらすぐ行き当たる問題だし、
pwdで//が二つ出るのはbashやdashの仕様だよ。
zsh rc tclsh tcshどれも/だよ。

665:名無しさん@お腹いっぱい。
15/05/25 19:39:52.69 .net
>>663の人生に暗黒の1ページが加えられた瞬間に立ちあえたことに感謝w

666:名無しさん@お腹いっぱい。
15/05/25 20:31:48.30 .net
ご質問です。
コマンドライン引数の数字を順番に四則演算するシェルプログラミングを
作りたいのですが、うまくいきません。
演算の順番は+(加算)-(減算)*(乗算)/(除算)です。
#!/bin/sh
total=0
a=("$@")
n=${#a[@]}
n=$((n - 1))
while [ $n -ge 0];
do
total=$((a[$n] + $total))
n=$((n-1))
done
echo "total = $total"
自分でできたのはコマンド引数を加算のみ繰り返す処理です。
もしよい解決方法がおありでしたらご教授お願いします。

667:名無しさん@お腹いっぱい。
15/05/25 21:12:27.93 .net
学校の宿題か?だったら自分でやれ

668:659
15/05/25 21:36:30.45 .net
シェルプログラミングの教本で学び始めた、IT土方目指してるニートです。
教本に応えが載ってなくて、序盤のページで行き詰ってしまいました。

669:名無しさん@お腹いっぱい。
15/05/25 21:46:27.07 .net
# こんな感じで動くけどzshじゃないと動かない。後は直してね。
total=0
r=0
until test $#@ -eq 0
do
case $(( r % 4 == 0 ? 1 : (r + 3) % 4 == 0 ? 2 : (r + 2) % 2 == 0 ? 3 : 4 )) in
1) total=$(( total + $1 ));;
2) total=$(( total - $1 ));;
3) total=$(( total * $1 ));;
4) total=$(( total / $1 ));;
esac
shift
(( ++r ))
done

670:名無しさん@お腹いっぱい。
15/05/25 21:53:31.12 .net
# bashで動いた。そっかzshでも$#だけでいいのか。
r=0
until test $# -eq 0
do
case $(( r % 4 == 0 ? 1 : (r + 3) % 4 == 0 ? 2 : (r + 2) % 2 == 0 ? 3 : 4 )) in
1) total=$(( total + $1 ));;
2) total=$(( total - $1 ));;
3) total=$(( total * $1 ));;
4) total=$(( total / $1 ));;
esac
shift
(( ++r ))
done

671:名無しさん@お腹いっぱい。
15/05/25 21:55:32.99 .net
他にもzshだと
for a b c in 1 2 3
do
echo $a $b $c
done
みたいな処理もできる。

672:名無しさん@お腹いっぱい。
15/05/25 22:08:26.16 .net
最初のr=0も無くて動くか。

673:名無しさん@お腹いっぱい。
15/05/25 22:21:07.68 .net
ifとelseでも書けるよ。
baseの後に何が書いてあるのか分らない時は
三項演算子というのを調べると良い。

674:名無しさん@お腹いっぱい。
15/05/25 22:21:52.93 .net
baseじゃなくてcaseね。

675:名無しさん@お腹いっぱい。
15/05/25 22:37:26.67 .net
total=$(echo "$1+$2-$3*$4/$5" | bc)
echo "total = $total"

676:名無しさん@お腹いっぱい。
15/05/25 23:22:22.44 .net
自分の行為に「ご」をつけるとか、
どれだけ偉いんだって話だよな。

677:名無しさん@お腹いっぱい。
15/05/26 01:08:45.37 .net
busyboxだとbcよりdcの方が都合がいいのだろうか?
まあawkでいいような気もするけど。

678:659
15/05/26 06:28:38.16 .net
遅くなりましたが、複数の例を挙げてもらって大変勉強になりました!!三項演算子を使う発想はなかった…

679:名無しさん@お腹いっぱい。
15/05/26 14:02:41.07 .net
お世話になります。
PROMPT_COMMANDの設定について教えて下さい。
ターミナルのタイトルバーに現在のディレクトリ名"だけ"を表示したいのですが、
プロンプトの設定でやる
PS1=\w
のような \w がPROMPT_COMMANDの設定では使えないんですね?
どうやったらいいのでしょうか?

680:名無しさん@お腹いっぱい。
15/05/26 15:34:18.87 .net
PROMPT_COMMAND="pwd"はできるから好きにやればいい

681:名無しさん@お腹いっぱい。
15/05/26 15:43:42.53 .net
PROMPT_COMMAND='RSET=$(tput sgr0); B=$(tput setf 1); echo "$USER ${B}${PWD}${RSET} $"'

682:名無しさん@お腹いっぱい。
15/05/26 15:53:38.10 .net
ターミナルでしたか。勘違いしていた
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'
PROMPT_COMMAND='echo -ne "\033]0;${PWD/$HOME/~}\007"'

683:名無しさん@お腹いっぱい。
15/05/26 20:32:22.47 .net
>>678
ごめん。三項演算子に間違いがあった。
(r + 2) % 2 == 0 ? 3 : 4 )) in じゃなくて
(r + 2) % 4 == 0 ? 3 : 4 )) in だった。
以下楽しくなって、もう一つ書いといた。zshでしか動かないけれど。
a=(+ - \* /)
b ()
{
(( $# == 1 )) || b $@[1,-2]
total=$(( total $a[$(( ($# + 3) % 4 == 0 ? 1 : ($# + 2) % 4 == 0 ? 2 : ($# + 1) % 4 == 0 ? 3 : 4 ))] $@[-1] ))
echo $total
}
b $@

じゃあ勉強頑張って。

684:659
15/05/26 21:00:09.14 .net
なぜか2で割ってるのはif文でつくり直してるときに気付きました!!
sh、zsh、bashの違いが何やら…

685:名無しさん@お腹いっぱい。
15/05/26 22:22:51.71 .net
>>684
そんなあなたにbusybox

686:名無しさん@お腹いっぱい。
15/05/27 08:32:10.49 .net
bashもzshも、shの機能を包括した上で拡張していて、shの構文なら共通して動くと捉えてれば良い
と思う。だからbashとzshは配列の扱いなど雑多な違いがある。以下昨日のbash版。
たぶんもっと簡素に書けるのだろうけど私も全然詳しくない。
a=(+ - \* /)
b ()
{
declare -a c=( $@ )
(( $# == 1 )) || b $( echo ${c[@]} |cut -d ' ' -f -$(( $# - 1 )) )
total=$(( total ${a[$(( ($# + 3) % 4 == 0 ? 0 : ($# + 2) % 4 == 0 ? 1 : ($# + 1) % 4 == 0 ? 2 : 3 ))]} ${c[$# - 1]} ))
echo $total
}
b $@

以下みたいな書き方も簡易な条件文。何が起こるのかは(( 1 ))した後にecho $?とかして
値を確認できる。c言語は0が偽だけどshellだと0が真なので注意。cでreturnで0返すでしょ。
さらに(( 0 ))などは、echo $?した時に0として返っていない事に注目。
(( 1 )) && echo true
(( 0 )) || echo true
自ら自らを呼ぶ、再帰関数は調べればすぐ出てくる。
declareは、再帰関数ゆえ、変数名が同じになってしまうから、関数を呼んだ側の変数の値を、
呼ばれた側が変える事が無いようにしている。ローカル変数とか、スコープとか調べると出てくる。

687:名無しさん@お腹いっぱい。
15/05/27 10:46:37.27 .net
シェルスクリプトに関するご質問です。
コマンドライン引数で指定されたキーワードに一致する部分を持つ、カレントディレクトリ配下のファイルをそのディレクトリ階層をそのままにコピーしたいのですが、何かよい方法はありますでしょうか。
何かよい方法はありますでしょうか。
実行環境はCentOSをTera Term とSSH接続している状態です。
実行例として
[user@portal ~]$ ./sample.sh A copyTo 
第1引数はキーワード、第2引数はコピー先のディレクトリ

これでコピーができたことをTera Term上で確認できることが望ましいです。

688:名無しさん@お腹いっぱい。
15/05/27 11:05:38.31 .net
ワイルドカード

689:名無しさん@お腹いっぱい。
15/05/27 13:08:06.76 .net
>>687
#!/bin/sh
find . -name "*$1*" | cpio -oc | (cd "$2" && cpio -ivdc)

690:名無しさん@お腹いっぱい。
15/05/27 13:41:16.73 .net
ワイルドカード使って自分で書いてみたらこんなのに…
#!/bin/sh
cp -Rv ["$1"] "$2"
>>689はビット演算子使っててよくわからないですが、目的の動作は確認致しました!
ありがとうございます!

691:名無しさん@お腹いっぱい。
15/05/27 16:04:06.52 .net
わざとトンチンカンなこと言ってんのかな

692:名無しさん@お腹いっぱい。
15/05/28 10:32:09.00 .net
>>670のやつ整数しか計算できないし、第1引数を0に足してるで
第1 + 第2 - 第3 * 第4 / 第5 + 第6 - …
って処理が正しい

693:名無しさん@お腹いっぱい。
15/05/28 12:07:05.77 .net
# こうすると動くよ。後は引数を実数にしてね。
total=$1; shift
a=(+ - \* /)
b ()
{
(( $# == 1 )) || b $@[1,-2]
total=$(( total $a[$(( ($# + 3) % 4 == 0 ? 1 : ($# + 2) % 4 == 0 ? 2 : ($# + 1) % 4 == 0 ? 3 : 4 ))] $@[-1] ))
echo $total
}
b $@

694:名無しさん@お腹いっぱい。
15/05/28 12:23:47.19 .net
そっか、%つかってるんだった。
まぁ本人じゃないだろうし引かせてもらおう。

695:名無しさん@お腹いっぱい。
15/05/28 12:25:16.28 .net
おそらく663のcodeに
total=$1; shift
だけでいいんじゃないかな。急ぎなので、確認して無いけど。

696:名無しさん@お腹いっぱい。
15/05/28 12:32:06.05 .net
いや%と関係ないか。$#にたいしてだったね。

697:名無しさん@お腹いっぱい。
15/05/28 12:32:46.85 .net
>>666
自分も、参考までに考えておいた
初期値は 0、引数の数は不定で、加算、減算、乗算、除算を繰り返すと解釈した
#! /bin/sh -x
while
total=$(
echo "( ${total:-0} ${1:++ $1} ${2:+- $2} ) ${3:+* $3} ${4:+/ $4}" | bc
)
[ 4 -lt $# ] && shift 4
do :
done
echo "ANSWER: ${total}"
exit

#! /bin/sh -x
while [ 0 -lt $# ]
do
total=$(
echo "( ${total:-0} + ${1:- 0} - ${2:- 0} ) * ${3:- 1} / ${4:- 1}" | bc
)
shift $(( $# > 4 ? 4 : $# ))
done
echo "ANSWER: ${total:-0}"
exit

698:名無しさん@お腹いっぱい。
15/05/28 12:35:03.52 .net
ああ、せっかく全角スペースで字下げしたのに、間違えてただのスペース打ち込んだか

699:名無しさん@お腹いっぱい。
15/05/28 18:17:15.57 .net
# 他の人のレスは後で確認する。なんだか覚醒してきた。dashで動くように作った。
# 以下をtest.shで保存。
#!/bin/sh
a='/+-*'
test $# -eq 1 && { echo $1; exit; } || total=$( ./test.sh $( echo $@ |cut -d ' ' -f -$(( $# - 1 )) ) )
echo $(( $total $( echo $a |cut -b $(( ( $# + 3 ) % 4 + 1 )) ) $( eval echo \$$#) ))

700:名無しさん@お腹いっぱい。
15/05/28 21:33:17.29 .net
大きな数の余りの計算とかできる?

701:名無しさん@お腹いっぱい。
15/05/28 21:54:55.27 .net
# 今その要求にshellだけで答えるように考えてる。
# 割り算部分はできたよ。もう疲れたからやめようかな。
# scaleの値を調整すれば何処まで計算するか指定できる。
# -の値を指定するとずっと計算し続けるので注意。
# dashで動くように書いてる。
#!bin/sh
scale=8
total=$1; shift
m ()
{
test $(( $3 )) -eq 0 -o $(( $1 )) -eq 0 && return
b=$1
a=$(( ${b}0 / $2 ))
echo -n $a
m $(( ${b}0 % $2 )) $2 $(( $3 - 1 )) # 余り、割る数、scale.
}
echo -n $(( total / $1 )).
m $(( total % $1 )) $1 $scale

702:名無しさん@お腹いっぱい。
15/05/28 22:03:27.91 .net
使い方書いてなかった。
./保存したfile 355 113
と引数二つです。

703:名無しさん@お腹いっぱい。
15/05/28 23:39:51.34 4mhEJHtNx
お題が不毛すぎ

704:名無しさん@お腹いっぱい。
15/05/29 02:54:31.46 .net
よし諦めた。
>>697 本人じゃなくてわめいてる方ですけど、勉強になります。
一つ目書き方は知らないので勉強しておく事して二つ目ので見ると、
そっか、と思わされました。確かにその通りだと、コードも短いし理解もしやすいし。
>>666は彼のを参考にしたほうが良かと。私のは今考えて見ると三項演算子も無駄だったし、
ただ>>699は毒毒しい事をしているので、結構勉強になると思う。

705:名無しさん@お腹いっぱい。
15/05/29 13:11:54.28 .net
#!/bin/sh
# ごめん>>701 それ再帰してるから途中で計算できてなかった。
# 悪い所も無駄に関数な所も直して無いけど。以下でいける。
scale=-1
total=$1; shift
m ()
{
b=$1 # $1: 余り、$2: 割る数、$3: scale.
until test $scale = 0 -o b = 0
do
a=$(( ${b}0 / $2 ))
echo -n $a
b=$(( ${b}0 % $2 ))
scale=$(( scale - 1 ))
done
}
echo -n $(( total / $1 )).
m $(( total % $1 )) $1 $scale

706:名無しさん@お腹いっぱい。
15/05/29 13:15:06.25 .net
やば>>705まさかの$3 scale意味ない説。

707:名無しさん@お腹いっぱい。
15/05/29 14:07:59.50 .net
いやコメント内で使ってたか。

708:名無しさん@お腹いっぱい。
15/05/29 17:25:17.77 .net
なるほどdo whileみたいに使えるだね。
while false
true
do
echo test
break
done
前にfor分は以下で動くのになんでwhileは駄目なんだろうと思った、謎がとけました。
for r in *
{
echo $r
}

709:名無しさん@お腹いっぱい。
15/05/29 17:41:57.11 .net
ふむ、whileから最後の戻り値の間、do doneの間を回るわけだからdo whileとはまた違う。
離れ隠しとも名付けようかこの新手

710:名無しさん@お腹いっぱい。
15/05/29 19:43:00.94 .net
>> 696
> >>697 本人じゃなくてわめいてる方ですけど、勉強になります。
意外な効果で驚くなあ。でも、役に立って良かった
> 一つ目書き方は知らないので勉強しておく
って言葉で改めて見直すと
> 序盤のページで行き詰ってしまいました。
序盤で行き詰まっているんだよね。そんな人に対して適当な回答じゃあ無かったかもしれないなあ
( parameter substitution の機能とか使うべきではなかったか )と思い、妙なヒント入りでもう一度書いておきました

蛇足だけど、V7 Bourne Shell だと、:- でなく - なんだよね
URLリンク(www.in-ulm.de)
> ${parameter-word}
> If parameter is set then substitute its value; otherwise substitute word.
それでなのか、POSIX でも定義されていて
URLリンク(pubs.opengroup.org)
bash や、dash でも echo ${HOGE-$HOME} が機能する

>>709
man dash, man bash, man ksh, man zshmisc と確認してみたけど
while list; do list; done 相当の事が書いてある
結構誰でも知っているて、新手では無いよ

711:名無しさん@お腹いっぱい。
15/05/29 19:44:12.32 .net
#! /bin/sh -x
total=0
while
 case $# in
 0)
  break
 ;;
 1)
  total=$( echo "${total} + $1" | bc )
  break
 ;;
 2)
  total=$( echo "( ${total} + $1 - $2 )" | bc )
  break
 ;;
 3)
  total=$( echo "( ${total} + $1 - $2 ) * $3" | bc )
  break
 ;;

712:名無しさん@お腹いっぱい。
15/05/29 19:44:26.35 .net
 4)
  total=$( echo "( ${total} + $1 - $2 ) * $3 / $4" | bc )
  break
 ;;
 [5-9]|[0-9]*[0-9])
  total=$( echo "( ${total} + $1 - $2 ) * $3 / $4" | bc )
  shift 4
  true
 ;;
 *)
  echo 'It never comes here and we know it.' >&2
  exit 1
 ;;
 esac
do : 'Do nothing with list-2 of "while list-1; do list-2; done"'
done
echo "ANSWER: ${total}"
exit

713:名無しさん@お腹いっぱい。
15/05/30 04:04:02.38 .net
# おかげさまで、また少し成長できました。

#!/bin/zsh
eval echo -n \${$#..1} \'$( yes '+-*/'|tr -d '\n' |dd bs=$(( $# - 1)) \
count=1 cbs=1 conv=unblock 2>/dev/null | sed 's#^#r#')\' p |dc

#!/bin/sh
{ eval echo -n $( seq -f "$%g" $# |tac ); echo "$( yes '+-*/'|tr -d '\n' \
|dd bs=$(( $# - 1)) count=1 cbs=1 conv=unblock 2>/dev/null | sed 's#^#r#' )" p; } |dc

714:名無しさん@お腹いっぱい。
15/05/30 07:57:05.78 .net
なんか凄いもの練り上げたね。なんか、スクリプトを書く 705 の楽しさが伝わってくるわw
eval echo $( seq -f "$%g" $# | tac )
の部分は "$@" とか使えないものかと思い、しばらく考えたんだが...
echo "$@ " | tac -s " "

715:名無しさん@お腹いっぱい。
15/05/31 07:18:32.49 .net
# 書けて良かった。
#!/bin/sh
eval echo 0 $( printf '$%d + $%d - $%d @ $%d /' $( seq $# ) | \
sed 's#+ $0#+ 0#g; s#- $0#- 1#g; s#@ $0#@ 1#g; a p' ) |tr '@' '*' |dc

716:名無しさん@お腹いっぱい。
15/05/31 08:54:03.31 .net
>>713
後段も書き換えてみた
echo "$( yes '+-*/'|tr -d '\n' \
|dd bs=$(( $# - 1)) count=1 cbs=1 conv=unblock 2>/dev/null | sed 's#^#r#' )" p

#! /bin/sh
# 何をするスクリプトかぱっと見で全くわからないので、一応書いておくけど、
# これも >>666 の回答
{
 echo "$@ " | tac -s " "
 yes 'r+r-r*r/' | tr -d '\n' | head -c $(( ( $# - 1 ) * 2 ))
 echo "p"
} | dc

>>715
アイデアが尽きないね。@は、エスケープ用かな?外しておいた
#! /bin/sh
eval echo 0 $(
 printf '$%d + $%d - $%d \\* $%d / ' $( seq $# ) |
 sed 's#+ $0#+ 0#g; s#- $0#- 1#g; s#* $0#* 1#g; a p'
) | dc

717:名無しさん@お腹いっぱい。
15/05/31 11:51:51.69 .net
大きな数の計算できるならRSA暗号化もできるんじゃないか?

718:名無しさん@お腹いっぱい。
15/05/31 12:23:30.92 .net
整形ついでに sed を整理してみた
eval とかなるべく使いたくないけど、printf で展開するアイデアが面白いな
#! /bin/sh
{
 eval echo 0 $(
  printf '$%d + $%d - $%d \\* $%d / ' $( seq $# ) |
   sed -e 's/$0 [+/*\-]* //g'
 )p
} | dc

719:名無しさん@お腹いっぱい。
15/05/31 18:16:33.13 .net
ちょっと危なっかしいけど、これで eval も外せたかな?
#! /bin/sh
{
 echo 0 $(
  n=$(( $# % 4 ))
  printf '%d + %d - %d \\* %d / ' "$@" |
   sed -e 's/\([0-9]\{1,\} [+/*\-]* \)\{'"$(( n == 0 ? 0 : 4 - n ))"'\}$//'
 )p
} | dc

720:名無しさん@お腹いっぱい。
15/06/01 06:34:30.80 .net
エスケープを外す前の方で書き込んでいた
訂正
#! /bin/sh
{
 echo "0 $(
  n=$(( $# % 4 ))
  printf '%d + %d - %d * %d / ' "$@" |
   sed -e 's/\([0-9]\{1,\} [+/*\-]* \)\{'"$(( n == 0 ? 0 : 4 - n ))"'\}$//'
 )p"
} | dc

721:名無しさん@お腹いっぱい。
15/06/02 19:51:41.64 .net
連投スマソ。printf 見直した
#! /bin/sh
echo "0 $( printf '%s + %s - %s * %s / ' "$@" "END" | sed -e 's/END.*$//' )p" | dc

722:名無しさん@お腹いっぱい。
15/06/02 20:48:50.22 .net
もうずいぶん前から計算違ってる

723:名無しさん@お腹いっぱい。
15/06/04 06:35:03.60 .net
解釈の違いだろ。echo も省いた
printf '%s + %s - %s * %s / ' "$@" "END" | sed -e 's/^/0 /; s/END.*$/p/' | dc

724:名無しさん@お腹いっぱい。
15/06/06 17:40:55.66 .net
先生のcodeを勉強する前に作っておきました。
ここのpageを見て理解しながら作りました。
URLリンク(www.maitou.gr.jp)
素数判定のアルゴリズムは以下のC言語のものを、冪乗の計算を一度に変えたものです。
URLリンク(ja.wikipedia.org)
今は一度コメントを全部消した状態で貼っておきます。
dcで書いてるので呪文っぽいので理解しようとしないほうが吉です。
そのうちbase64でコメントつけて貼るかもしれません。
factorにすぐやられますから、実用性は無いです。
dashで動くつもりでしたがzshでなければ動きません。
printf %d 010
とした時の挙動の違いに今気付きました。

725:名無しさん@お腹いっぱい。
15/06/06 17:42:57.23 .net
# $1から$2の範囲の素数を出力します。$2が省略された場合は$1一つの数に対して判定します。
# 例: prime 10000 20000
prime ()
{
dc -e "$( seq $1 ${2:-$1} )"'
z sc 0 sr [S2 lr 1 + sr lr lc >!] s! l! x
[[sg 3 Q] sk [p sg 3 Q] s.] sA
[d 2 >k d 2 =. d 2 % 0 =k] sB
[[sg 2 Q] sk [p sg 2 Q] s. d v s^ 3 s/] sC
[l^ l/ >. d l/ % 0 =k l/ 2 + s/ lD x] sD
0 sr
[L2 [lA x lB x lC x lD x]x lr 1 + sr lr lc >@] s@ l@ x
'
}
# 上記、prime関数から得られた適当な素数二つが引数です。
# そこから秘密鍵、公開鍵を出力します。
# 例: keygen 10243 19963
keygen ()
{
dc -e "[$1 1 :a]x [$2 2 :a]x [$1 $2 * 3 :a]x"'
[1 ;a]x 1 - [2 ;a]x 1 - * 2 / 1 + S2
[l2 lr [d la :k]x / [la :p]x la 1 + sa l. x] sA
[[la 1 - ;k]x n [ ] n [la 1 - ;p]x n [ ] n [3 ;a]x p sg] s.
1 sa l2 v s^ 2 sr
[l2 lr % 0 =A lr 1 + sr lr l^ !<B] sB lB x
'
}

726:名無しさん@お腹いっぱい。
15/06/06 17:44:29.67 .net
# 上記、keygenが出力した鍵から適当な一段を使い暗号化し、出力します。
# 例:
# keygen 10243 19963
# > 7 14603629 204481009
# > 17 6013259 204481009
# > 119 859037 204481009
# encrypt 859037 204481009 暗号化するfile >暗号化した後のfile
encrypt ()
{
echo 8 o $( printf "8 i %d 12 i $1 $2 | n [ ] n " $( od -vt oC -A n $3 ) ) |dc
}
# 上記の公開鍵で暗号化したものを、秘密鍵で復号します。秘密鍵は上記の例で暗号化した場合、
# 以下の組み合わせになります。
# encrypt 119 204481009 暗号化されたfile >復号化した後のfile
decrypt ()
{
printf "8 i %d 12 i $1 $2 | P " $( cat $3 ) |dc
}

727:名無しさん@お腹いっぱい。
15/06/06 20:13:54.61 .net
ごめんなさい。素数と素数をかけた数が512以下だと復号に失敗します。

728:名無しさん@お腹いっぱい。
15/06/06 20:27:58.37 .net
# 以下じゃなくて未満か。
# 他に、確認に使ったprogram.
# ずるしてopensslを使っています。
# まず!!!!!!!!復号化するfileに値を入れて下さい!!!!!!!!!!!!!。小さいfileが良いと思います。
# mktempで作るfileは自動では削除しません。最初にechoで出力するので手動でお願いします。
# primeで適当な素数を二つ選択しkeygenを行い、そこで作られた鍵で暗号化したfileを
# 復号できるかの確認です。
# 使い方。
# check_2 $( prime 10000 20000 )
# 出力は、出力した時に確認したkeygenに使った素数二つ,暗号化復号化に使える数字と法です。

729:名無しさん@お腹いっぱい。
15/06/06 20:29:33.71 .net
file=
file_encrypt=$( mktemp )
file_decrypt=$( mktemp )
echo 後で削除する事、$file_encrypt $file_decrypt
check_2 ()
{
test $# -lt 2 && return
p1=$( echo $@ |tr ' ' '\n' |sed -n $(( $( openssl rand 2 \
|od -t u -A n ) % $# + 1 ))p )
while # 使いました!!!
p2=$( echo $@ |tr ' ' '\n' |sed -n $(( $( openssl rand 2 \
|od -t u -A n ) % $# + 1 ))p )
test $p2 -eq $p1
do :
done
f ()
{
test $# -eq 0 && return
encrypt $(( $# % 2 ? $1 : $2 )) $3 $file >$file_encrypt
decrypt $(( $# % 2 ? $2 : $1 )) $3 $file_encrypt >$file_decrypt
diff $file $file_decrypt && echo 成功。keygen $p1 $p2, $1 $2 $3 \
|| echo 失敗。keygen $p1 $p2, $1 $2 $3 1>&2
shift 3
f $@
}
f $( keygen $p1 $p2 )
check_2 $( echo $@ |tr ' ' '\n' |grep -vE "($p1|$p2)" )
}
# rm $file_encrypt $file_decrypt

730:名無しさん@お腹いっぱい。
15/06/06 20:36:41.36 .net
もっと大きい値で確認する場合は、
opensslのrandの値も変える必要があったような気がします。もう忘れました。
現在対したコメント無くてごめんなさい。

731:名無しさん@お腹いっぱい。
15/06/07 19:13:41.49 .net
>>723 から sed も取り除いてみました
printf '%s + %s - %s * %s / ' '0 0' 0 1 1 "$@" 'p quit' | dc
>>724-730 力作ですなぁ

732:10人に1人はカルトか外国人
15/06/08 17:47:19.33 .net
●マインドコントロールの手法●
・沢山の人が偏った意見を一貫して支持する
 偏った意見でも、集団の中でその意見が信じられていれば、自分の考え方は間違っているのか、等と思わせる手法
・不利な質問をさせなくしたり、不利な質問には答えない、スルーする
 誰にも質問や反論をさせないことにより、誰もが皆、疑いなど無いんだと信じ込ませる手法
偏った思想や考え方に染まっていたり、常識が通じない人間は、頭が悪いフリをしているカルト工作員の可能性が高い
靖国参拝、皇族、国旗国歌、神社神道を嫌うカルト
10人に一人はカルトか外国人
「ガスライティング」で検索を!

733:名無しさん@お腹いっぱい。
15/06/08 21:12:33.56 .net
forの中で
find /foo -iname "123foo.txt" -o -iname "foo.txt"
をしたくて、"123foo.txt" から"foo.txt"を
作りたいのですけどいい方法を教えていただけないでしょうか?
123は0桁から4桁あります。
よろしくお願いします。

734:名無しさん@お腹いっぱい。
15/06/08 22:27:29.53 .net
「シェル 数値 ゼロ梅」でぐぐれ

735:名無しさん@お腹いっぱい。
15/06/08 23:04:24.58 .net
シェルっていうと、おじさんたちが激怒になるから気をつけな

736:名無しさん@お腹いっぱい。
15/06/09 00:33:36.94 .net
「シェルっていうと」じゃなくて「シェルクリプトのことをシェルっていうと」だ
>>734の場合は問題ない

737:名無しさん@お腹いっぱい。
15/06/09 01:25:54.94 .net
$ filename1=123foo.txt
$ filename2=$(echo $filename1 | tr -d [0-9])
$ echo $filename2
foo.txt

738:名無しさん@お腹いっぱい。
15/06/09 01:49:15.59 .net
数字の部分が必ずファイル名の先頭にかたまって出現するということなら
$ filename=123foo.txt
$ echo ${filename##*[0-9]}
foo.txt

739:名無しさん@お腹いっぱい。
15/06/09 08:44:03.74 .net
そうか
trか変数展開をつかうのか
自分は今まで何考えてたんだ
コマンド、変数展開を使いこなせてないことを痛感した
ありがとう

740:名無しさん@お腹いっぱい。
15/06/11 16:47:01.72 .net
いくつかのディレクトリにあるファイルすべてを一括処理してやろうと
foundfiles=$(find /hoge/hoge1 /foo/foo1 -name -type f *.txt)
for x in "${foundfiles}"
do
処理
done
としてみたのですが、うまくいきませんでした。
どこを直せばよいのでしょうか?

741:名無しさん@お腹いっぱい。
15/06/11 17:10:28.24 .net
-nameの引数の位置

742:名無しさん@お腹いっぱい。
15/06/11 18:04:07.93 .net
うわぁー、ばかなことやっちまってた
foundfiles=$(find /hoge/hoge1 /foo/foo1 -name *.txt -type f)
for x in "${foundfiles}"
do
処理
done
これでokですか?まだ、怪しいとこありますか?

743:名無しさん@お腹いっぱい。
15/06/11 18:13:25.03 .net
findの結果と処理のところにecho入れて
気体通りになってるか確認して終わり
かまう奴はアホか

744:名無しさん@お腹いっぱい。
15/06/11 19:55:03.20 .net
優しいんですね


745:名無しさん@お腹いっぱい。
15/06/12 12:06:31.64 .net
foundfiles=$(find /hoge/hoge1 /foo/foo1 -name *.txt -type f)
for x in "${foundfiles}"
do
echo "$x"
done
とやると一見上手くいったように見えましたが、
foundfiles=$(find /hoge/hoge1 /foo/foo1 -name *.txt -type f)
for x in "${foundfiles}"
do
echo "${x##*/}"
echo "$x"
done
としてやると、初めのファイルのファイル名だけ出てきて、あとは検索結果が表示されるだけでした。
なにがまずかったのですか?直すことはできるのでしょうか? 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)


746:名無しさん@お腹いっぱい。
15/06/12 13:33:39.96 .net
ダブルクォートはどんなときに使えばいいのかどんなときに使わないのか
そのあたりがわかってないみたい
がんばれ

747:名無しさん@お腹いっぱい。
15/06/12 14:39:13.27 .net
"${foundfiles}"のダブルクォートを外したらできました。
なんでなんだろう?
for x in "$@"
というのをよく見かけるからまねしてました。
"${foundfiles}"は検索結果を1つの文字列にする。
なら、"$@"は?あれれ?
どういうことなのでしょうか?

748:名無しさん@お腹いっぱい。
15/06/12 14:43:19.06 .net
シェルスクリプトの本でも一冊買ってきてまじめに勉強しろ
そうしない身に付かない

749:名無しさん@お腹いっぱい。
15/06/12 14:49:36.84 .net
find の結果を使って何かするなら、for while xargs findのexec 等を使うけど、
for で変数に入れて回す場合、IFSに改行をセットして、区切ってもらうために変数をクォートはしない
#!/bin/sh -x
var='
a b c d e
2OrMoreSpaces between the words
x y z
'
IFS='
'
# for i in "${var}"
for i in ${var}
do
 echo "=> $i <="
done
応援するよ。がんばって

750:741
15/06/12 15:27:47.27 .net
>>6 E.1 を中心に、man bsh、man dash で学習
□E. 学習用テキスト
1. Bourne Shell自習テキスト ( 1993年 ) pdf お薦め

一応、引用しといた
man dash
@ Expands to the positional parameters, starting from one.
  When the expansion occurs within double-quotes, each posi‐
  tional parameter expands as a separate argument. If there
  are no positional parameters, the expansion of @ generates
  zero arguments, even when @ is double-quoted. What this
  basically means, for example, is if $1 is “abc” and $2 is
  “def ghi”, then "$@" expands to the two arguments:
    "abc" "def ghi"
$1 が "abc"で、$2 が "def ghi" のとき、"$@" は "abc" "def ghi" に展開される

751:名無しさん@お腹いっぱい。
15/06/12 15:31:58.73 .net
読みなおしてよかったよ man bsh なんて
訂正 man bash、man dash

752:名無しさん@お腹いっぱい。
15/06/13 13:45:25.05 .net
ありがとう
ネット上の記述とmanで今までなんとかこなせてたけど
基本がないとだめですね
早速、>>6を読んでみます

753:名無しさん@お腹いっぱい。
15/06/13 20:52:58.13 .net
>>747
foundfiles=( $(find /hoge/hoge1 /foo/foo1 -name *.txt -type f) ) ←配列にする
for x in "${foundfiles[@]}"
でおk

754:名無しさん@お腹いっぱい。
15/06/15 13:27:36.31 .net
ありがとう
それでできました
()はコマンド置換だけじゃないんですね

755:名無しさん@お腹いっぱい。
15/06/15 13:44:30.60 .net
コマンド置換は $( )

756:名無しさん@お腹いっぱい。
15/06/15 23:58:45.64 .net
$() で思い出したけど
-----------------------
#!/bin/bash
LAST=0
function test() {
LAST=$1
echo $LAST
}
echo "LAST=$LAST"
test 111
echo "LAST=$LAST"
x=$(test 222)
echo "LAST=$LAST x=$x"
--------------------------
を実行すると
LAST=0
111
LAST=111
LAST=111 x=222 ←なぜ LASTが 222に変更されないのか?
実際は関数のネストとかでもっと複雑だったんだが、
変な動作するようになってデバッグに苦労した・・・

757:名無しさん@お腹いっぱい。
15/06/16 00:33:43.81 .net
えっ? 釣り?

758:名無しさん@お腹いっぱい。
15/06/16 00:48:56.39 .net
サブシェルで実行されるから

759:名無しさん@お腹いっぱい。
15/06/17 12:27:35.75 .net
>>753
スペース入りファイル名に未対応、失格。

760:名無しさん@お腹いっぱい。
15/06/17 13:55:31.31 .net
>>759
では模範解答をどうぞ

761:名無しさん@お腹いっぱい。
15/06/17 20:41:26.36 .net
IFS_tmp=$IFS; IFS=$’\n’

762:名無しさん@お腹いっぱい。
15/06/17 21:21:37.47 .net
改行入りファイル名に未対応、失格。

763:名無しさん@お腹いっぱい。
15/06/17 21:25:36.37 .net
最終模範解答
IFS_tmp=$IFS; IFS=$"\n"

764:名無しさん@お腹いっぱい。
15/06/18 05:55:23.84 .net
改行入りファイル名に未対応、失格。

765:名無しさん@お腹いっぱい。
15/06/18 07:35:13.14 .net
スペース等だけじゃなく、アスタなどの特殊記号にも未対応、失格。

766:名無しさん@お腹いっぱい。
15/06/18 07:48:16.57 .net
そんなファイルは作らなければ解決。

767:名無しさん@お腹いっぱい。
15/06/18 10:04:59.96 .net
だったら全部""でくくっておけばいいでないの?

768:名無しさん@お腹いっぱい。
15/06/18 10:17:46.54 .net
find ... -exec ... +
を避ける理由は?

769:名無しさん@お腹いっぱい。
15/06/23 21:09:03.45 .net
find -print0 | xargs -0
でスペースや改行の入ったファイル名もOKだよね
unix仕様のファイル名の終端はNULLだったっけ?

770:名無しさん@お腹いっぱい。
15/06/24 07:32:33.60 .net
>>769 パイプとプロセスが無駄
find ... -exec ... +
を避ける理由は?

771:名無しさん@お腹いっぱい。
15/06/24 15:25:39.96 .net
>>770
それ使うのは初心者で、逆に実行効率が悪くなる。

772:名無しさん@お腹いっぱい。
15/06/24 15:43:54.58 .net
>>771
理由は?

773:名無しさん@お腹いっぱい。
15/06/24 15:44:35.63 .net
-execだと見つかったファイルの数だけプロセスつくるんだよね?
xargsだとexecシステムコールの引数個数制限までは1個のプロセス作ってその引数に見つかったファイル全部渡すのかな?

774:名無しさん@お腹いっぱい。
15/06/24 15:53:10.35 .net
>>773
> find ... -exec ... +
これの最後の+の意味調べないで、言いがかりつけてんの?

775:名無しさん@お腹いっぱい。
15/06/24 20:58:37.54 .net
さすがに恥ずかしくて逃げ出したか。

776:名無しさん@お腹いっぱい。
15/06/26 03:14:09.55 .net
mvとかで使えない中途半端なもの出されてドヤ顔されてもなあ

777:名無しさん@お腹いっぱい。
15/06/26 08:16:34.16 .net
逃げ出さなかったメンタルだけは褒めてあげよう。
find . -exec sh -c 'mv "$@" hoge' {} +
今度は逃げ出すかな?

778:名無しさん@お腹いっぱい。
15/06/26 08:48:53.03 .net
>>777
それ、1番目に見つかったファイル(ディレクトリ)のみ取りこぼすバグあり。
find . -exec sh -c 'mv "$@" hoge' DUMMY {} +
DUMMYが必要。

779:名無しさん@お腹いっぱい。
15/06/26 09:07:10.65 .net
何だよ、そのDUMMYって。意味ねーどころか、エラー出るし。
xargsと比べてって事だから、省略したけど、.を避けるのはfindでやるんだろ。
あえてやるなら
find . -exec sh -c 'shift; mv "$@" hoge' {} +
xargs押しのベテランさんはどうするんだろう?
初心者に教えてくださいな。

780:名無しさん@お腹いっぱい。
15/06/26 09:11:18.72 .net
>>777
プロセスが無駄とか言っておきながらsh使うってバカなの?
しかもファイル数に比例した分だけ起動するから、一つで済むxargs以下じゃん。やっぱりバカだろ。

781:名無しさん@お腹いっぱい。
15/06/26 09:21:57.94 .net
>>779
オマエ、DUMMYの意味わかってないのか。
shiftしたら逆だぞ、引数「2個」取りこぼす。
shiftの逆(そんなのないけど)をやる必要があるんだよw

782:名無しさん@お腹いっぱい。
15/06/26 09:31:47.52 .net
>>779
$ sh -c 'echo "$@"' 1 2 3 4
2 3 4

↑なぜ 1 が消えるかわかるかな?
$ sh -c 'echo "$@"' DUMMY 1 2 3 4
1 2 3 4
↑DUMMYを入れると 1 を取りこぼさないねw

783:名無しさん@お腹いっぱい。
15/06/26 11:33:10.48 .net
>>780
ベテラン(老害ともいう)登場。
おじいちゃんが現役時代のfindはそうだったらしいけど、今のfindはもっとお利口なんだよ。
おじいちゃんが現役だったころは
find ... -exec ..... \;
だっただろ。今は
find ... -exec ..... +
ってやるんだよ。
>>781-782 これはスマンかった。これだね
| sh -c string [name [arg ...]]
でも、shiftは$1以降に対して働くから
> shiftしたら逆だぞ、引数「2個」取りこぼす。
キミもわかってないね。

784:名無しさん@お腹いっぱい。
15/06/26 11:51:05.26 .net
エントリが沢山あって複数回起動されるかもしれないので、$1がカレントディレクトリの時だけshiftにした方が良いね。

785:名無しさん@お腹いっぱい。
15/06/26 11:55:14.50 .net
あえて DUMMY を外すとしたら、こんな感じかな
sh -c 'echo "${1:+"$0" "$@"}"' 1 2 3 4
煽りぎみの言葉(言いがかり、逃げ出した、メンタルだけは褒めてあげよう、バカ)を
無闇に使うのは止めてさあ、楽しくいこう
これだけ知ってりゃあ良いでしょ
歴史的には -print0 は GNU find の、-exec + は他の多くの Unix での拡張で、
移植の際は注意が必要だったが、-exec + が 2001年版から POSIX に記載された事で
GNU find でも 2005 年頃( ver 4.2.12 )から -exec + が使える様になった
新しく書くスクリプトでは xargs の別の機能を使う場合を除いて find -exec + の方が良いだろう
ちなみに -exec + も SVR4 からあるようだよ
URLリンク(www.in-ulm.de)
> Actually it originates from SVR4 ('88), where it was not documented yet (this feature implemented by
> D.Korn, see two messages from the austin-group-list, local copies),

786:名無しさん@お腹いっぱい。
15/06/26 12:06:22.64 .net
$0 だけしか無い際の考慮が足りなかったけど、下らないので訂正は省略します

787:名無しさん@お腹いっぱい。
15/06/26 12:11:39.69 .net
動作変わったら場合分けしないと使えないから長くなるな。

788:名無しさん@お腹いっぱい。
15/06/26 13:06:31.47 .net
>>783
なにを指摘されたのかも理解していないようだ

789:名無しさん@お腹いっぱい。
15/06/26 13:08:31.26 .net
>>785
>新しく書くスクリプトでは xargs の別の機能を使う場合を除いて find -exec + の方が良いだろう
よくない、という指摘をしてるんだが...

790:名無しさん@お腹いっぱい。
15/06/26 17:04:27.96 .net
>>788
なにを指摘されたのかも理解していないようだ

791:名無しさん@お腹いっぱい。
15/06/26 18:36:29.66 .net
念の為貼っておきますよ
URLリンク(pubs.opengroup.org)
URLリンク(www.jp.freebsd.org)
> -exec utility [argument ...] {} +
>  -exec と同じですが、各 utility の起動において ``{}'' はなるべく多
>  くのパス名と置き換えられます。この動作は xargs(1) のものに似てい
>  ます。
URLリンク(linuxjm.osdn.jp)
> -exec command {} +
>  アクション -exec のこの変形も、選択したファイルに対して指定したコマンドを実行するが、
> コマンドラインを形成するとき、選択した各ファイル名をコマンドラインの末尾に
> 追加して行くという方法を取る(訳注: 略)。
> そのため、コマンドを呼び出す回数は、マッチしたファイルの数より ずっと少なくてすむわけだ。
> コマンドラインの形成法は、xargs のコマンドライン形成法とほぼ同じである。

792:名無しさん@お腹いっぱい。
15/06/26 18:48:07.56 .net
理解できましたかあ? おじいちゃん。

793:名無しさん@お腹いっぱい。
15/06/26 22:37:52.51 .net
>sh -c 'echo "${1:+"$0" "$@"}"' 1 2 3 4
こんなの書かなきゃいけなくなる場合ならxargsでいい気がする

794:名無しさん@お腹いっぱい。
15/06/26 23:30:59.69 .net
>>790
バカはすぐオウム返しするよな。

795:名無しさん@お腹いっぱい。
15/06/26 23:32:45.65 .net
>>791
それを貼って、何の意味があるの?

796:名無しさん@お腹いっぱい。
15/06/27 00:07:20.23 .net
>>795
-exec + を分かっていなさそうな発言 >>773 に加え >>780 でも見られ、
話がかみ合っていない原因かもしれないと考え、念の為貼っておいた
ちなみに >>792 は別人

797:名無しさん@お腹いっぱい。
15/06/27 00:25:43.31 .net
>>796
お前、プロセスの数も数えられないの?
日本語も読めないようだし、本当、生きてて大丈夫か?

798:名無しさん@お腹いっぱい。
15/06/27 07:41:59.25 .net
悪いけど相手はしない

799:名無しさん@お腹いっぱい。
15/06/27 08:10:57.63 .net
>>797
おじいちゃんの頃はステップ関数は比例って習ったの?
今はちがうんだよ。

800:名無しさん@お腹いっぱい。
15/06/27 13:57:24.86 .net
なんだ、さんざん煽っておいて、自分が逃げてやんの。

801:名無しさん@お腹いっぱい。
15/06/27 18:01:58.60 .net
ん? おじいちゃんの基準では
限定的な条件でxargsの方がファイル数/MAX_ARGSだけプロセス数が少ないから勝ちなの?
はいはい、えらいえらい。

802:名無しさん@お腹いっぱい。
15/06/27 19:42:45.43 .net
一番最初に煽ったバカの基準がそれだろ。
+は使い物にならんとか親切に教えてあげたら、
shとか持ち出す本末転倒ぶりを晒してるだけじゃん。
いい加減逆ギレはみっともないよ。

803:名無しさん@お腹いっぱい。
15/06/27 20:48:29.92 .net
パイプが不要なのには目をつぶるんだ。
おじいちゃんの世代って、わかりやすくて楽だね。

804:名無しさん@お腹いっぱい。
15/06/27 22:37:52.63 .net
プロセスの数が増えたら余計非効率だと何回言えば分かるんだ?

805:名無しさん@お腹いっぱい。
15/06/28 07:24:37.85 .net
find /dir -オプション ... -exec mv -t ディレクトリ {} +
↑で解決。不要プロセスなし。

806:名無しさん@お腹いっぱい。
15/06/28 16:41:15.99 .net
解決とか言ってる割りに、比較した結果が貼られてないから机上の空論だね。

807:名無しさん@お腹いっぱい。
15/06/28 17:03:28.70 .net
アスペは放置で。

808:名無しさん@お腹いっぱい。
15/06/28 22:54:42.25 .net
CPUの頭打ちだからマルチコアっていう時代にパイプに神経質とか何

809:名無しさん@お腹いっぱい。
15/06/29 11:33:48.48 .net
テキスト中の文字列abc123をabcAA123にしようとsedで
sed -e 's/[a-z][0-9]/.00./g' やsed -e 's/[a-z][0-9]/[a-z]AA[0-9]/g' を
試しましたがうまくいきませんでした。
どのようにすればよいのでしょうか?sed以外でできるのでしょうか?

810:名無しさん@お腹いっぱい。
15/06/29 12:03:55.86 .net
sed -e 's/\([a-z][a-z]*\)\([0-9][0-9]*\)/\1AA\2/g'

811:名無しさん@お腹いっぱい。
15/06/29 12:06:03.81 .net
+でよかったか・・・
sed -e 's/\([a-z]+\)\([0-9]+\)/\1AA\2/g'

812:名無しさん@お腹いっぱい。
15/06/29 12:21:46.28 .net
echo abc123|sed -e 's/\([a-z]+\)\([0-9]+\)/\1AA\2/g'
をやってみましたがだめでした。なんでだろう。
manをみると2005年のものでした。

813:名無しさん@お腹いっぱい。
15/06/29 13:47:40.61 .net
+を外したらでました
バージョンのせいかな
勉強になりました
ありがとうございました

814:名無しさん@お腹いっぱい。
15/06/29 13:57:57.10 .net
どのsedを使ってるのかわからんし
どのmanを読んでるのかわからん

815:名無しさん@お腹いっぱい。
15/06/29 14:26:49.95 .net
憶測で書いてみるけど、「古来の sed の正規表現では + が使えないが
GNU sed では + が使える」というオチの予感がします。
# 今ちょっと調べてみるまで GNU sed で + が使えるとは知らなかった……

816:名無しさん@お腹いっぱい。
15/06/29 14:40:06.66 .net
坊や、もうちょっと勉強してからおいで、としか

817:名無しさん@お腹いっぱい。
15/06/29 19:01:07.47 .net
debian系でスクリプト作ってVMで軽いDSLで動かそうとしたら
使ってるコマンドのオプションが違ってて使えなかったなあ
まあ最新のパッケージ落とせばよかったんだろうけど皆はどうしてる?

818:名無しさん@お腹いっぱい。
15/06/29 20:34:14.84 .net
>>813
+ じゃなくて \+ ではどうよ?
echo abc123 | sed -e 's/\([a-z]\+\)\([0-9]\+\)/\1AA\2/g'

819:名無しさん@お腹いっぱい。
15/06/29 21:17:14.01 .net
興味でお聞きしたいのですが
シェルスクリプトで株の発注のようなことはできませんかね?
証券会社にログインしフォーム入力して発注ボタン押すような・・
そんな言語じゃないと思うのですができたら人気出るかなあと

820:名無しさん@お腹いっぱい。
15/06/29 21:20:48.70 .net
人気じゃなくて覚える気でした

821:名無しさん@お腹いっぱい。
15/06/29 21:26:58.24 .net
シェルスクリプトで出来ないことなんて何もない

822:名無しさん@お腹いっぱい。
15/06/29 21:38:54.99 .net
シェルスクリプトを覚えたら彼女が出来ました

823:名無しさん@お腹いっぱい。
15/06/29 21:41:19.11 .net
フフフ
昔、シェルスクリプトでロト6の番号を出していたのはいい思い出
一度も当たらなかったけどな・・・

824:名無しさん@お腹いっぱい。
15/06/29 21:53:20.99 .net
>>819
できるし、発想はわかるが
アルゴリズム取引の時代にシェルスクリプトではだぶん勝負にならない

825:名無しさん@お腹いっぱい。
15/06/29 22:08:23.46 .net
>>819
>>349とか>>371は知ってる?

826:名無しさん@お腹いっぱい。
15/06/29 23:36:01.62 .net
>>823
ロト6、わたしも時々やっています。シェルスクリプトで番号を出すのは考えもしませんでしたw
>>821
>>824
>>825
ご親切にありがとうございました
grepとかのパイプ並列化されてると聞いたので、もしかしてなにかしら分からない理由で発注も早いのかなと
思って聞いてみました。
>>349>>371は知りませんでした。勝手にシェルスクリプトっていうとブラウザレスのワンライナーをイメージしていました。
教えていただいた348や370を触ってみようと思います

827:名無しさん@お腹いっぱい。
15/06/30 00:21:38.40 .net
ぶっちゃけwget使えばできる

828:名無しさん@お腹いっぱい。
15/06/30 00:51:21.32 .net
むしろシェルスクリプトでパケットキャプチャして通信を解析しよう。

829:名無しさん@お腹いっぱい。
15/06/30 06:02:29.85 .net
>>827
JavaScriptとか使われてたらwgetでは無理

830:名無しさん@お腹いっぱい。
15/06/30 07:54:44.40 .net
>>818
GNU sedでも+は使えないと思っていたけど\+なんて拡張があるんだね。
知らなかった。今後は便利に使わせてもらおう…

831:名無しさん@お腹いっぱい。
15/06/30 10:54:23.76 .net
ブラウザのクッキーが必要で、JavaScriptで得られるリンクの抽出をしたいのですが
ソースを保存してgrepで試したのですがうまくいきませんでした。
なにかいい方法ありますか。

832:名無しさん@お腹いっぱい。
15/06/30 11:12:25.50 .net
もうちょい条件を具体的に

833:名無しさん@お腹いっぱい。
15/06/30 12:12:09.26 .net
>>829>>831
wgetでも切った貼ったすればURLは作れる
まあそれでカバーできないのもあるだろうから100%じゃないけど
自分はフレームが分かれてるページで挫折したというか対応をやめた

834:名無しさん@お腹いっぱい。
15/06/30 12:24:48.15 .net
ブラウザで操作するようなものは
firefoxのアドオンで使えるseleniumが便利なんじゃないかな

835:名無しさん@お腹いっぱい。
15/06/30 13:49:39.60 .net
トイレで大きな音って屁だろ

836:名無しさん@お腹いっぱい。
15/06/30 13:50:38.46 .net
誤爆しましたごめん

837:名無しさん@お腹いっぱい。
15/06/30 19:21:47.66 .net
>>833, >>834
しらべてみる
ありがとう

838:名無しさん@お腹いっぱい。
15/07/01 00:58:33.93 .net
>>804
おじいちゃん。-exec .... +を知らなかった事を必死にごまかそうとしてもダメだよ。

765 名無しさん@お腹いっぱい。[sage] 2015/06/24(水) 15:44:35.63
-execだと見つかったファイルの数だけプロセスつくるんだよね?
xargsだとexecシステムコールの引数個数制限までは1個のプロセス作ってその引数に見つかったファイル全部渡すのかな?

839:名無しさん@お腹いっぱい。
15/07/01 01:13:29.53 .net
つまんね。

840:名無しさん@お腹いっぱい。
15/07/01 07:46:12.63 .net
GNU sedで -rオプション、*BSD sedで -Eオプションつけるとバックスラッシュ
つけなくても+が使えるみたいだ。

841:名無しさん@お腹いっぱい。
15/07/01 13:58:10.28 .net
そりゃ、そっちは拡張正規表現だからな……

842:名無しさん@お腹いっぱい。
15/07/01 14:36:35.81 .net
最近、ポイントがずれた応答するヤツ一人いるなぁ

843:名無しさん@お腹いっぱい。
15/07/01 15:04:35.61 .net
わざとだろう
あんまり相手しちゃいけない

844:名無しさん@お腹いっぱい。
15/07/02 08:18:40.41 .net
言葉が足りなかった。拡張機能なのに素の状態でバックスラッシュつければ
動いてしまうのはどうなのかな?と思ったんだ。

845:名無しさん@お腹いっぱい。
15/07/02 18:33:26.44 .net
>>834
JSなページもいけるらしいが、実際やってみたら、サイトを開く、
ボタン押すなどは記録してくれるが、スクロールするとか、細かい
事は記録されなかった。画像をキャプチャしたいんだが無理の模様。
シェルスクリプトで書こうとして、LinksをJava対応とかにしてみた
ものの、努力実らず。。。

846:名無しさん@お腹いっぱい。
15/07/02 18:41:44.19 .net
>>831
もしかして、ローカルマシンでの話か?

847:名無しさん@お腹いっぱい。
15/07/02 19:10:07.26 .net
bashでの正規表現、コマンドごとの正規表現。
最初はバカばかしく思えた、たとえばpythonでの
import re
のほうが、思想としては正しいような気がしてきた。

848:名無しさん@お腹いっぱい。
15/07/02 23:42:14.95 .net
bashで
aaa=$(( bbb + ccc ))
という表記の仕方と
aaa=$(( $bbb + $ccc ))
という表記の仕方、どちらも同じ計算結果が得られるんですが
どちらが正しいんでしょうか?どちらで書いても良い仕様なんでしょうか?

849:名無しさん@お腹いっぱい。
15/07/03 00:54:37.65 .net
>>848
yes
function add() # 引数の$1と$2を足す
{
ANSWER=$(( $1 + $2 ))
}
こういうのは $は取れないけどね

850:名無しさん@お腹いっぱい。
15/07/03 05:34:00.18 .net
どうせなら、
((aaa = bbb + ccc))
って書いた方がいい。この方が数値計算らしいね。

851:名無しさん@お腹いっぱい。
15/07/03 09:11:41.14 B0CP9/Q5n
>>848
白い白馬みたいなものでしょ
$var ${var} $((var)) $((勝手にやれや))

852:名無しさん@お腹いっぱい。
15/07/03 09:48:26.01 .net
俺は let aaa=bbb+ccc が好きだな

853:名無しさん@お腹いっぱい。
15/07/03 14:16:50.30 .net
sortせずにuniqしたいんですが、エレガントな方法ありますか?
2回目以降に出てきた重複行をカットして出力です。それ以外はsortしないで元の順のまま出力。

854:名無しさん@お腹いっぱい。
15/07/03 14:50:45.06 B0CP9/Q5n
perlやらrubyやらでさっくりと。

855:名無しさん@お腹いっぱい。
15/07/03 14:52:23.32 A2U8YBDtR
こっちで答えても質問者読んでないから
.netの方で答えてあげて

856:名無しさん@お腹いっぱい。
15/07/03 14:44:25.08 .net
>>853
URLリンク(www.linuxquestions.org)

857:名無しさん@お腹いっぱい。
15/07/03 14:55:42.55 .net
>>856
その方法しかありませんか?
頭に数値付ける方法は知ってましたがエレガントじゃないです

858:名無しさん@お腹いっぱい。
15/07/03 15:20:13.81 .net
ちょっといじれば数字なしにできるよ

859:名無しさん@お腹いっぱい。
15/07/03 18:44:31.13 .net
{
 if (count[$0] == 0) {
  print
  count[$0]++
 }
}

860:名無しさん@お腹いっぱい。
15/07/03 19:39:34.12 .net
シェルでは連想配列は使えまへん

861:名無しさん@お腹いっぱい。
15/07/03 19:41:35.86 .net
awkだろw

862:名無しさん@お腹いっぱい。
15/07/03 20:13:46.43 .net
Perlの連想配列便利
何も考えずにVBで同じようにやったらクソ遅かった

863:名無しさん@お腹いっぱい。
15/07/03 21:11:40.93 .net
bash なら連想配列使えるけど遅いので素直に awk でやるのが一番

864:名無しさん@お腹いっぱい。
15/07/04 20:45:32.11 .net
curl -L -O -J URLリンク(www.foo.com)
をやると、リダイレクト先のファイル名で保存されずにbarで保存されてしまう
リダイレクト先のファイル名で保存するにはどうすればできますか?

865:名無しさん@お腹いっぱい。
15/07/04 21:03:45.47 .net
日本語お上手ですね

866:名無しさん@お腹いっぱい。
15/07/04 22:57:10.62 .net
わからないなら黙ってればいいのに
-Iで情報取得してgrep、sed、展開で抽出

867:名無しさん@お腹いっぱい。
15/07/04 23:36:06.98 .net
すまん、これだと改行が入ってしまう
解決法はわからない

868:名無しさん@お腹いっぱい。
15/07/04 23:37:41.83 .net
>>864
curl -L -J URLリンク(www.foo.com) > foo
じゃだめなん?

869:名無しさん@お腹いっぱい。
15/07/05 00:24:31.19 .net
展開で%%と*を使えばいい
sedはめんどくさい

870:名無しさん@お腹いっぱい。
15/07/05 06:16:53.25 .net
foo.comの人って日本人なんですか?

871:名無しさん@お腹いっぱい。
15/07/05 08:51:57.76 .net
whoisでも見りゃいいだろ

872:名無しさん@お腹いっぱい。
15/07/05 09:11:05.08 .net
>>868
リダイレクト先のファイル名を取得したいのに決め打ちしてどうするw

873:名無しさん@お腹いっぱい。
15/07/05 11:13:12.10 .net
>>853
nl | sort -k 2 | uniq -f 1 | sort | cut -f 2-
>>864
URLリンク(stackoverflow.com)

何か違和感が有るが、まあいいか

874:名無しさん@お腹いっぱい。
15/07/07 01:55:38.74 .net
集団ストーカーももう時間切れかもしれないよ
予定よりも相当早いペースで突き進んでるよ
ギリシャのこと笑ってられないかもしれない
潰れる会社も出るだろうし、失業者も出るかもしれない
アウシュビッツレベルのネタだからオリンピックどころじゃないかもしれない
私の勝手な想像だけどね
でもバレテルよと何年も前から言ってるのに今日もバカの一つ覚えの電気通信で嫌がらせ
だからみんながそれが答えなのね、世界中に暴露して聞いてみろってことなのね
ということで動きが止まらない方向になっている
揉み消すとか臭いものにふたをする犯罪者の心理行動しか取れないクズは終わりかもしれない
観光客がちょっと増えたと喜んでいる場合じゃないよ、知っている人間は日本なんかに来てないよ
事実は言った人間が悪いんじゃないよ、作った人間が悪いんだよ
知ってる人間は後悔しないためにも正しい行動をしたほうがいいよ
ダメなものは世界中誰が見てもダメなんだからね

875:名無しさん@お腹いっぱい。
15/07/07 17:07:44.73 .net
>>864
barって、ディレクトリ? ファイル?

876:名無しさん@お腹いっぱい。
15/07/11 02:16:43.69 .net
メタ文字を含むパターンを変数に入れておいて
${var#pattern}
みたいな使い方はできないのですか?

877:名無しさん@お腹いっぱい。
15/07/11 05:21:37.10 .net
>>876
できるけど。
${var#$pattern}
patternに$が必要

878:名無しさん@お腹いっぱい。
15/07/12 06:30:34.52 .net
>>877
すみません、$ が抜けていました
どうやら zsh のデフォルトの仕様のせいで、
GLOB_SUBST オプションを有効にするか、${var#$~pattern} で望みどおりになりました

879:名無しさん@お腹いっぱい。
15/07/12 23:45:48.39 .net
for f inの中でsedでの置換に$fを使うには度すればいいのですか?

880:名無しさん@お腹いっぱい。
15/07/13 03:08:28.34 .net
sed -e "s/$f/fumofumo/"
とか

881:名無しさん@お腹いっぱい。
15/07/13 04:53:41.61 .net
全部ダブルクォートにせずに、必要なところだけダブルクォートにするのがお勧め。
sed '/aaa/,$s/'"$f"'/bbbb/g'

882:名無しさん@お腹いっぱい。
15/07/13 13:45:08.39 .net
count=1
for f in
do
file_name="${f##*/}"
sed -e 's/foo/foo_$f/g' /hoge/hoge.txt> ${count}_hoge.txt
mv $f ${par_dir2}/${file_name}
count=$(($count + 1))
done
これはダメ
sed -e 's/foo/foo_"$f"/g'
もだめでした
なんでだろう?

883:名無しさん@お腹いっぱい。
15/07/13 13:50:39.03 .net
>>882
クォートの対応、良く見ろよ
sed -e 's/foo/foo_"$f"/g' ←じゃなくて
sed -e 's/foo/foo_'"$f"'/g'
な。' 'を一回閉じてから" "を開き直す。スペースを空けずに。

884:名無しさん@お腹いっぱい。
15/07/13 16:07:08.78 .net
(全部ダブルクオートでいいのに・・・)

885:名無しさん@お腹いっぱい。
15/07/13 17:05:32.16 .net
クォートなんていらないのに・・・と思いかけたが$fの中身がわからないから必要なのか
というか$fだけをダブルクォートでも問題ないのかな?

886:名無しさん@お腹いっぱい。
15/07/13 20:53:18.32 .net
ファイル名を構成する文字とsedの正規表現の区切り問題は厄介だよ。

887:名無しさん@お腹いっぱい。
15/07/13 23:15:54.08 .net
>>881
全部ダブルでええやん

888:名無しさん@お腹いっぱい。
15/07/13 23:41:43.94 .net
>>881
/aaa/,$ 文字列aaaとマッチする行から行末まで次のコマンドを適用
s/"$f"/bbbb/g シェル変数$fとマッチした文字列をbbbbに置き換えるコマンド
全体をダブルクォートしたら$sがシェル変数として解釈されちゃうからいやん

889:名無しさん@お腹いっぱい。
15/07/13 23:50:57.72 .net
行末までじゃねえや最終行までね

890:名無しさん@お腹いっぱい。
15/07/14 03:14:11.34 .net
>>883
sed -e 's/foo/foo_'"$f"'/g'
でいけました。
クォートの挙動の勉強になりました。
ありとうございます。

891:名無しさん@お腹いっぱい。
15/07/18 11:58:15.66 .net
あるコマンドの出力をgrepで引っ掛けたいんだけど、できない・・・
何故でしょう。わかる方いますか
$ postmulti -i hogehoge -e destroy
postmulti: fatal: No instance named hogehoge
上のように、Noという文字列が出力されたら処理をしたいので
$ postmulti -i hogehoge -e destroy 2>&1 | grep No
$
とするが、ヒットしない。

892:名無しさん@お腹いっぱい。
15/07/18 12:10:12.95 .net
* 1,2以外に出力されている。(プログラム中で/dev/tty開けるとか)
* 何か間違えている。
前者は
$ postmulti -i hogehoge -e destroy >/dev/null
$ postmulti -i hogehoge -e destroy 2>/dev/null
で確認すれば良い。

893:名無しさん@お腹いっぱい。
15/07/18 12:21:00.88 .net
>>891 の後半、| grep No でヒットしなくて、しかも何も表示でないんだよね?
fdの1,2以外とか/dev/tty直接に出力されてるなら素通りの表示はされるはず。
なので、postmultiが出力がパイプの場合は出力を自分で抑制してるのかも。

894:名無しさん@お腹いっぱい。
15/07/18 12:29:23.71 .net
daemon系で、fork()とかsetsid()とか絡んでそうな悪寒

895:880
15/07/18 13:58:51.80 .net
>>892
>>893
$ postmulti -i hogehoge -e destroy >/dev/null
postmulti: fatal: No instance named hogehoge
$ postmulti -i hogehoge -e destroy 2>/dev/null
$
確認すると、こんな感じ
なので確実に2番ですよね
だが、ファイルに書き出しても
$ postmulti -i hogehoge -e destroy 2>output
$ cat output
なにもでない。

>>894
そうなんですか。
ちょっと調べてみます

896:名無しさん@お腹いっぱい。
15/07/18 14:55:40.11 .net
やっぱり tty か redirect/pipe か判断してるみたい
Linux で以下を実行すると output ファイルにエラーメッセージが
書き込まれている。
$ echo 'int isatty(int fd) { return 1; }' | gcc -xc -shared -o isatty.so -
$ LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH LD_PRELOAD=isatty.so postmulti -v -i hogehoge -e destroy 2>output

897:名無しさん@お腹いっぱい。
15/07/18 17:24:55.19 .net
>>896
ありがとうございます!
上のコード理解してきました。そういうことなのですね。
一応ソースも確認したけど、その通りでした
postfix-3.0.1: ./src/postmulti/postmulti.c
1684 if (isatty(STDERR_FILENO))
1685 msg_vstream_init(argv[0], VSTREAM_ERR);
1686 msg_syslog_init(argv[0], LOG_PID, LOG_FACILITY);
isatty()を外から騙せるか試行錯誤してますが、だめならそのまま
利用させていただきます!

898:名無しさん@お腹いっぱい。
15/07/18 23:59:07.25 .net
expect コマンドがあれば expect -c 'コマンド 引数 ... ; expect eof'
で実行すればいいかも。
expect -c 'spawn pstmulti -i hogehoge -e destroy ; expect eof' | grep No

899:名無しさん@お腹いっぱい。
15/07/19 00:06:30.73 .net
expect -c 'spawn コマンド 引数... ; expect eof' だた...
例文の方は正しいです。

900:880
15/07/19 11:47:38.55 .net
おおお!ありがとうございます。できました。
まことに感謝です

901:名無しさん@お腹いっぱい。
15/07/19 15:45:46.71 .net
var=$( command 1 | command 2 )
で、command 1とcommand 2のエラーレベルを取得数方法てありますか?
$?やPIPESTATUSではうまくいきませんでした。

902:名無しさん@お腹いっぱい。
15/07/19 16:44:41.05 .net
var=$( command 1 | command 2; echo ${PIPESTATUS[@]} >&amp;2 )

903:名無しさん@お腹いっぱい。
15/07/19 19:00:45.99 .net
error_evel=(${PIPESTATUS[@]})
といった具合に格納したいのですが、できそうですか?
思いつかないです

904:名無しさん@お腹いっぱい。
15/07/19 19:16:46.14 .net
command 1 | command 2 > hoge
error_evel=(${PIPESTATUS[@]})
var=$(cat hoge); rm hoge

905:名無しさん@お腹いっぱい。
15/07/19 20:37:20.22 .net
var=$(command 1 | command; echo ${PIPESTATUS[@]})
error_evel=$(echo "$var" | tail -1)
var=$(echo "$var" | sed '$d')

906:名無しさん@お腹いっぱい。
15/07/19 22:00:11.98 .net
fun () {
 echo abc
}
# 1
res = "$(fun)"
# 2
res = `fun`

質問です。#1 と #2 は両方とも関数funの返り値を受け取って変数resへ代入していますが、
両方に特別な違いはあるのでしょうか?
見た目の好みの問題でどちらを使ってもよいものでしょうか?

907:名無しさん@お腹いっぱい。
15/07/19 23:16:03.23 .net
前者は純正シェルに拘ってるキチガイに絡まれる。

908:名無しさん@お腹いっぱい。
15/07/19 23:26:38.65 .net
>>906
$() は `` だから、"$(fun)" は "`fun`" で等価
違いは ’’はネストできないけど $() はネストできる
$ echo `date -r `pwd``
date: オプションには引数が必要です -- 'r'
Try 'date --help' for more information.
pwd
※これは echo $(date -r)pwd$()になってしまう
$ echo $(date -r $(pwd))
xxxx年 x月 x日 火曜日 xx:xx:xx JST

909:名無しさん@お腹いっぱい。
15/07/20 05:43:37.07 .net
$ echo $(echo $(echo hage))
hage
$ echo `echo `echo hage``
echo hage
後者は`echo `と``の中身がコマンドとして解釈されてこれは空っぽで、残ったecho hageが単純な文字列としてechoされるのかw

910:名無しさん@お腹いっぱい。
15/07/22 16:37:21.58 .net
いつも、変数取得と\rの消去をgrepと変数展開で
hoge=$(grep foo /bar/bar2)
hoge2=${hoge%?}
としているのですけど、?だとwinで作られたテキストか確認しなければ怖いのです。
\r、\r\n、^M、^M$では消せなかったです。
sedやtr使えばいいのですが、変数展開のほうが速いので
変数展開で安心して使いたいのです。
どうすればうまくできますか?

911:名無しさん@お腹いっぱい。
15/07/22 17:20:17.87 .net
grepで複数行がマッチすることはないのかな

912:名無しさん@お腹いっぱい。
15/07/22 17:30:47.13 .net
r=$(printf '\xd')
ってやっておいて
hoge2=${hoge%$r}

913:名無しさん@お腹いっぱい。
15/07/22 17:43:05.00 .net
>>911
もちろん、やるときにはgrep -m 1やってます
>>912
パターンを作ってしまえばいいのか


914:名無しさん@お腹いっぱい。
15/07/31 19:13:47.94 .net
すみません、自分用メモです
sedを使った改行を挟んだ置換
abcd
efg

aaaefgに
sed '/abcd/N;s/abcd\n/aaa/g' hoge.txt
abcd
efg

aaa
bbbに
LF=$(printf '\\\n_'); LF=${LF%_}
sed '/abcd/N;s/abcd\nefg/aaa'"$LF"'bbb/g' hoge.txt

915:名無しさん@お腹いっぱい。
15/07/31 19:14:46.10 .net
あと、printfがわかっていないので質問させてください。
>>912のr=$(printf '\xd')は、r=$(printf '\r')や$(echo -e '\r')ではまずいのでしょうか?
\xdはどういう意味なのですか?
もし、LFをprintfで作るときには$(printf '\n')、echoで作るときには$(echo -e '\n')で大丈夫なのでしょうか?

916:名無しさん@お腹いっぱい。
15/08/02 06:43:49.16 .net
>>915
echoでやってもいいよ。ただシェルによってechoの-eオプションが要ったり要らなかったりするから、
printfならどちらでも動くと。xdは16進の0xdの意味。

917:名無しさん@お腹いっぱい。
15/08/02 13:55:04.46 .net
ありがとうございます
うちのechoのmanみたら-e使えませんでした。
でも、bashのechoを見たらつかえました。
実感できました。
LFならxaになるんですね。

918:名無しさん@お腹いっぱい。
15/08/05 12:50:25.59 .net
grep "hogehoge" | head -1

919:名無しさん@お腹いっぱい。
15/08/05 18:34:40.69 .net
>>918 は誰に何を言いたいのだろうか?
grep -m 1 知らない人?

920:名無しさん@お腹いっぱい。
15/08/05 18:42:34.72 .net
>>914をマネして
a
b
c

d
e
f
にしようと
LF=$(printf '\\\n_'); LF=${LF%_}
sed '/abc/N;s/a\nb\nc/d'"$LF"'e'"$LF"'f/g' hoge.txt
をしたけど、ダメでした。
どうしてなんですか?どうすればいいのですか?
sedの改行から解放されると思ったのに。

921:名無しさん@お腹いっぱい。
15/08/05 18:54:13.85 .net
>>919
2つのプログラムの呼び出し、メモリ増といいことが見えない
しかも上にgrep -m 1 があるのに
誤爆か、シェルの覚えたてじゃないか
直後の>>919はいい勉強になるのでは


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