シェルスクリプト総合 その24at UNIX
シェルスクリプト総合 その24 - 暇つぶし2ch300:名無しさん@お腹いっぱい。
15/02/08 15:04:24.54 .net
よく使うワンライナーなどはどうやって呼び出すものなんですか?
何か簡単に管理する方法がありませんかね?

301:名無しさん@お腹いっぱい。
15/02/08 15:06:57.37 .net
zshならzawから
vimのUnite historyの様なgrep効くから、それで呼ぶか
編集して完成させる

302:名無しさん@お腹いっぱい。
15/02/08 16:40:17.45 .net
>>301
anything.elみたいなヒストリーサーチみたいですね。
bashなのでどうしたものか。

303:名無しさん@お腹いっぱい。
15/02/09 09:34:08.43 .net
>>300
aliasじゃないの?

304:名無しさん@お腹いっぱい。
15/02/09 10:04:38.99 .net
自分で書いたスクリプトはいつでも、一見、間違いのないように見えるw

305:名無しさん@お腹いっぱい。
15/02/09 18:00:27.27 .net
まったくだ(´・ω・`)
ぼくの書いたスクリプトが動かないなんてけしからん(´・ω・`)
シェルの方を治したまえ

306:名無しさん@お腹いっぱい。
15/02/09 18:21:02.80 .net
cygwinからLinuxに移植したシェルスクリプトが,ping部分で成功しなかった

declare -A URL
URL=(
  ["Vim_part24"]="スレリンク(unix板)"
  ["vim_part5"]="スレリンク(software板)"
  )
# ping for download
ping_error=0
for i in ${!URL[@]}
do
  # ping ${URL[$i]} > /dev/null
  ping -n 1 `echo ${URL[$i]} | awk -F"/" '/http/{print $3}'` > /dev/null
  if [ "$?" -ne 0 ]; then
    echo "${i} : can not contact ${URL[$i]}"
    ping_error=1
  fi
done

307:名無しさん@お腹いっぱい。
15/02/09 18:41:13.94 .net
ping -c 1 ... にするべきじゃないの?
pingのコマンドオプションって統一されてないよなぁ

308:名無しさん@お腹いっぱい。
15/02/09 19:27:08.45 .net
配列を使うのはダサいと思うのです。
#!/bin/sh
url_list='
Vim_part24 スレリンク(unix板)
vim_part5 スレリンク(software板)
'
ping="ping -w 3 -c 1"
echo "$url_list" | while read thr url __; do
case "$url" in
https?://*)
host=`echo $url | cut -d/ -f3`
if ! $ping $host >/dev/null; then
echo "$thr: cannot contact $url"
err=1
fi
;;
esac
done
exit $err

309:名無しさん@お腹いっぱい。
15/02/09 19:28:49.19 .net
ああ、case の条件部分がおかしい。
URLリンク(*|fhttp:)">URLリンク(*|URLリンク(search.cpan.org)
てのがあった
このままじゃ使いものにならんけどね

411:名無しさん@お腹いっぱい。
15/03/12 16:01:30.66 .net
ちょっとお知恵を拝借したい
テキストファイルを検索して見つけた行数を取得したいときって
grep -nで行数出力させて取得するのが一番シンプルかな?
マッチする最終行にしたい場合はtailと組み合わせてさ
ちなみにシェル知らなかったころってreadで1行ずつ読み込んで判断してたw

412:名無しさん@お腹いっぱい。
15/03/12 16:32:34.70 .net
「一番」って難しいこと聞くね

413:名無しさん@お腹いっぱい。
15/03/12 18:00:51.55 .net
>>411
grep -c

414:名無しさん@お腹いっぱい。
15/03/12 18:40:40.82 .net
>>413
オマエいつも問題の意味取り違えて回答して点数もらえないタイプだろw

415:名無しさん@お腹いっぱい。
15/03/12 20:35:27.12 .net
>>414
ん?
質問:検索して見つけた行数を取得したい
cオプション: 検索条件にマッチした行数を表示する

416:名無しさん@お腹いっぱい。
15/03/12 20:36:26.22 .net
>>414
あ、わかった
質問は行番号のことを行数といっているのね

417:名無しさん@お腹いっぱい。
15/03/12 20:36:37.62 .net
>>415
まだわかってないのか…重症?

418:名無しさん@お腹いっぱい。
15/03/12 21:26:36.04 .net
ちょっとwc

419:名無しさん@お腹いっぱい。
15/03/12 22:07:04.23 .net
>>418
オプションなしだと複数返すコマンドだよね

420:名無しさん@お腹いっぱい。
15/03/13 00:23:15.74 .net
行数と行番号じゃ、意味が違うな。
日本語に不自由してるのぅ

421:名無しさん@お腹いっぱい。
15/03/13 01:03:30.38 .net
grep -nで出力されるのは行数ではないね

422:名無しさん@お腹いっぱい。
15/03/13 01:16:54.86 .net
なんかgrep -c言ってる人がバカにされてるけど
>grep -nで行数出力させて取得するのが一番シンプルかな?
>マッチする最終行にしたい場合はtailと組み合わせてさ
これから察するに、行数と書いてはいるが、実際は行数じゃなくて行番号のこと言ってるんじゃないの?
マッチした行数が知りたいなら最終行の話なんて出てこないだろ
つまり本当にバカなのは>>417と推測
まぁ質問主から続きがなければ有耶無耶だが

423:421
15/03/13 01:17:57.58 .net
俺何言ってんだ?
すまん眠かったってことで何も見なかったことにしてくれ……死ぬ……

424:名無しさん@お腹いっぱい。
15/03/13 04:43:04.00 .net
行数、直訳すると line number

425:名無しさん@お腹いっぱい。
15/03/13 07:28:39.51 .net
line countじゃないの?

426:名無しさん@お腹いっぱい。
15/03/13 07:40:15.74 .net
直訳、と言ってるだろ。
natural number = 自然数
complex number = 複素数
number = 数

427:名無しさん@お腹いっぱい。
15/03/13 08:04:07.16 .net
>number = 数
ちがう。

428:名無しさん@お腹いっぱい。
15/03/13 08:20:54.53 .net
違うの知ってて言ってんでしょ

429:名無しさん@お腹いっぱい。
15/03/13 11:04:35.04 .net
順序数?

430:名無しさん@お腹いっぱい。
15/03/13 13:12:27.06 .net
行番号を行数と呼ぶ人がいるとして、その人は行数を何と呼ぶのでしょうかね。行の数?

431:名無しさん@お腹いっぱい。
15/03/13 17:11:36.57 .net
行回数

432:名無しさん@お腹いっぱい。
15/03/14 01:06:12.05 .net
行数はnumber of linesだろ
Fランもたいがいにせいよ

433:名無しさん@お腹いっぱい。
15/03/14 02:26:16.92 .net
>>411
まあgrepでいいと思う
grep -n regexp FILE | tail -n1 | cut -d: -f1
awk /regexp/'{print NR}' FILE | tail -n1
sed -n /regexp/= FILE | tail -n1

434:名無しさん@お腹いっぱい。
15/03/14 04:57:44.74 .net
>>432
行数は line count (だからこそ grep -c )

435:名無しさん@お腹いっぱい。
15/03/14 05:17:25.87 .net
count number of lines じゃね
てかどーでもいいよ
行数にしろ行番号にしろ質問者が具体例を明示してる時点で誤解しようがないだろ
早がってんしたエスパースキルゼロのうっかりさんが
早漏の言い訳をぐだぐだぐだぐだぐだぐだぐだぐだぐだぐだ
くだらねー

436:名無しさん@お腹いっぱい。
15/03/14 05:44:10.73 .net
それは「行数を数えろ」だろ
中卒もたいがいにしとけ

437:名無しさん@お腹いっぱい。
15/03/14 07:03:54.77 .net
>>436
countは動詞だけじゃなく名詞にもなるんだよ、知らなかった?

438:名無しさん@お腹いっぱい。
15/03/14 08:50:28.21 .net
へー

439:名無しさん@お腹いっぱい。
15/03/14 18:41:01.09 .net
>>437
名詞が連続してるが、それはどう言い訳するんだ?

440:名無しさん@お腹いっぱい。
15/03/14 21:16:03.47 .net
URLリンク(www.gnu.org)
-c
--count
Suppress normal output; instead print a count of matching lines for each input file. With the -v (--invert-match) option, count non-matching lines. (-c is specified by POSIX.)

441:名無しさん@お腹いっぱい。
15/03/15 00:27:31.56 .net
一行の中に、
bbbbaaa124iiiiiccccaaaa456lllllddddaaa789と書いてあった場合に、
特定の文字列の後に続いている数字を、スペース空けて抜き出す書き方はないでしょうか
うえの場合だとaaaの後にあるものを抜き出すように、124 456 789のような・・
素人質問ですいませんがよろしくお願いします

442:名無しさん@お腹いっぱい。
15/03/15 01:12:54.15 .net
GNU grep が使えるなら
$ echo "bbbbaaa124iiiiiccccaaaa456lllllddddaaa789" | grep -Po '(?!aaa)[[:digit:]]+' | tr '\n' ' '

443:名無しさん@お腹いっぱい。
15/03/15 02:09:05.45 .net
>>442
できました!
使わせていただきます。ご親切にありがとうございました。

444:名無しさん@お腹いっぱい。
15/03/15 03:20:18.84 .net
追加で質問したいのですが、
上の例でbbbbaaa124iiiiicccc222aaaa456lllllddddaaa789とあった場合に、
aaaの直後でない222は省いて124 456 789だけ方法はないでしょうか
何度もすいません

445:名無しさん@お腹いっぱい。
15/03/15 03:27:09.47 .net
grep -Po '(?<=aaa)\d+'

446:名無しさん@お腹いっぱい。
15/03/15 03:50:51.90 .net
>>445
完璧にできました!
この時間に回答いただけるとは思いませんでした。
大変助かりました。ありがとうございました。

447:名無しさん@お腹いっぱい。
15/03/15 13:29:40.91 .net
何度もすいません
上の例で、bbbbaaa0.24iiiiicccc2.22aaaa456lllllddddaaa7.89 など
小数点も含む数字が混じっている場合に、同様の条件で0.24 456 7.9を抜き出す方法はないでしょうか
あまりにも聞きすぎなので最後にしようと思います。

448:名無しさん@お腹いっぱい。
15/03/15 14:11:57.45 .net
こうかなぁ…
grep -Po '(?<=aaa)\d+(\.\d+)?
でもこれだと、".01" とかにはマッチしないけどね。
それと、"1.2.3" なんて文字列があると、"1.2" にマッチしちゃう。

449:名無しさん@お腹いっぱい。
15/03/15 14:12:54.78 .net
ちったぁ自分で考えな
過去2回の答えがなぜそうなるのかを考えれば応用でいけるはずだ

450:名無しさん@お腹いっぱい。
15/03/15 14:15:07.46 .net
grep -o 'aaa[0-9\.][0-9\.]' | tr '\n' ' '

451:名無しさん@お腹いっぱい。
15/03/15 14:16:19.36 .net
ミス
grep -o 'aaa[0-9\.][0-9\.]*' | sed 's/aaa//g' | tr '\n' ' '

452:名無しさん@お腹いっぱい。
15/03/15 14:37:30.13 .net
>>448
grep -Po '(?<=aaa)\d+(\.\d+)?(?=[^\d.]|$)'

453:名無しさん@お腹いっぱい。
15/03/15 14:52:31.67 .net
>>448
>>450
>>451
再度ありがとうございました。
私のファイルのケースですと450さんのやり方で完全にできました!
大変助かりましたし、勉強になりました。ありがとうございました。

>>449
本当そうしようと思います。
それ以前にgrepやsedは簡単な文字抜き出しぐらいにしか使ったことがなかったのですが、
こんなに便利だとは驚きました。学習して次は自分で解決できるようにしたいと思います

454:448
15/03/15 14:55:28.70 .net
これは私見だが
grepの-PはPerlの正規表現として扱うためのオプションだ
Perlを知ってるなら問題ないが、知らないなら>>451のが多分勉強対象としては正しい

455:名無しさん@お腹いっぱい。
15/03/15 15:09:05.03 .net
>>452
投稿した後でレス確認しました。すいません。
こちらのやり方でもできました!ありがとうございました。
書き方の意味を勉強してみたいと思います。
>>454
ありがとうございます。perlも知らないので、
教えていただいたオプションの意味も含めて調べてみようと思います。

456:395
15/03/16 22:22:07.74 iYLKElrbV
>>401
なんとか出来ました!ありがとうございました!

sed -e 's/_[0-9][0-9]_/_%%_/' tree.txt | uniq #sortするとls -Rの構造が崩れる
awk '!a[$0]++' tree.txt #fooとbarが交互になっている行をuniq
uniq tree.txt #空行(改行?)が全部消えてまう
sed -i "/:$/i \n" tree.txt #?わからん しっぽが:の行の前に空行を挿入
sed  "/:$/i \n" tree.txt   #?
sed -e "s/^n//" tree.txt   #なんとかできた。あとは%%を数字に戻すのだけ手打ちでがんばる

457:395
15/03/16 22:22:55.63 iYLKElrbV
>>401
何とか出来ました!ありがとうございました!

sed -e 's/_[0-9][0-9]_/_%%_/' tree.txt | uniq #sortするとls -Rの構造が崩れる
awk '!a[$0]++' tree.txt #fooとbarが交互になっている行をuniq
uniq tree.txt #空行(改行?)が全部消えてまう
sed -i "/:$/i \n" tree.txt #?わからん しっぽが:の行の前に空行を挿入
sed  "/:$/i \n" tree.txt   #?
sed -e "s/^n//" tree.txt   #なんとかできた。あとは%%を数字に戻すのだけ手打ちでがんばる

458:395
15/03/16 22:24:14.07 iYLKElrbV
連投申し訳ない

459:名無しさん@お腹いっぱい。
15/03/25 06:56:05.87 .net
専用コマンド使わずに実用的な強度の暗号復号フィルタとか誰か書ける?

460:名無しさん@お腹いっぱい。
15/03/25 12:51:41.84 .net
>>459
専用コマンドってのは、gpg とか openssl みたいなのを指してるの?
python とか perl とかを使っていいのならライブラリ次第で何とでもなりそうだけど、
それも NG なのかな?

461:名無しさん@お腹いっぱい。
15/03/25 15:07:14.94 .net
rot13でよければ
tr A-Za-z N-ZA-Mn-za-m

462:名無しさん@お腹いっぱい。
15/03/25 18:11:12.12 .net
それはさすがに「実用的な強度」とは言えないのでは……

463:名無しさん@お腹いっぱい。
15/03/27 22:26:36.44 .net
会社でシェルスクリプト(awkやsed)いじる必要があるんですが
何かおすすめの本ないですか?

464:名無しさん@お腹いっぱい。
15/03/28 00:47:40.73 .net
URLリンク(www.goggle.co.jp)

465:名無しさん@お腹いっぱい。
15/03/28 11:31:55.66 .net
後ろからn文字目のみを削除する方法ってある?
1234567890
なら
123456780
12345
なら
1235
になるような。

466:名無しさん@お腹いっぱい。
15/03/28 14:11:41.06 gf0XqcquF
>>465
nawkのsubstrでできない

467:名無しさん@お腹いっぱい。
15/03/28 15:17:24.35 shU+BQtVu
>>465
rev, cut -c, head -c, tail -c などでいけるのでは?
$ echo 12345 | rev | cut -c1,3- | rev
1235
$ echo 1234567890 | rev | cut -c1,3- | rev
123456780

468:名無しさん@お腹いっぱい。
15/03/28 14:36:27.39 .net
sed -e 's/.\(.\{n-1\}\)$/\1/'
後ろから2文字目なら
echo 12345 | sed -e 's/.\(.\{1\}\)$/\1/'
1235

469:名無しさん@お腹いっぱい。
15/03/28 15:15:24.11 .net
>>460
LL言語呼び出すにしても拡張ライブラリの専用コマンドに依存するのはNGじゃない?
nkfでrot13読むのは専用コマンドとは言えない気がするけど>>462だよなあ。
バイナリ法辺りを実装すればとりあえずなんとかなるんだろうか?

470:名無しさん@お腹いっぱい。
15/03/28 15:18:54.26 .net
>>465
rev, cut -c, head -c, tail -c などでいけるのでは?
$ echo 12345 | rev | cut -c1,3- | rev
1235
$ echo 1234567890 | rev | cut -c1,3- | rev
123456780

471:名無しさん@お腹いっぱい。
15/03/29 05:16:26.01 .net
>>465
>後ろからn文字目のみを削除する方法ってある?
a=1234567890; echo "${a%??}${a#?????????}"

472:名無しさん@お腹いっぱい。
15/03/29 08:10:35.43 .net
>>471
それ、n文字目と言うのが $n 変数に入ってる場合のこと聞いてるんでは? 固定数値ならいろいろ方法あるよ。

473:名無しさん@お腹いっぱい。
15/03/29 13:30:23.41 .net
>>472
可変でも同じことはできるけど。
a=1234567890; n=4; f(){ r=$1; while [ ${#r} != $2 ]; do eval r=\${r$3?}; done; echo $r; }; echo $(f $a $((${#a} - $n)) %)$(f $a $(($n - 1)) \#);

474:名無しさん@お腹いっぱい。
15/03/29 13:51:13.01 .net
もっとエレガントな方法がいいなぁ

475:名無しさん@お腹いっぱい。
15/03/29 14:10:10.11 .net
467が他の回答に勝っている点って何があるのかなあ

476:名無しさん@お腹いっぱい。
15/03/29 14:39:04.14 .net
bash + GNU coreutils の cut コマンド限定
範囲チェックはしていない
ncut () {
declare str="$1"
declare -i idx="$2"
declare -i len=$(expr length "$str")
echo $str | cut --complement -b$((len - idx + 1))
}
$ ncut 1234567890 2
123456780
$ ncut 12345 2
ncut 12345 2

477:名無しさん@お腹いっぱい。
15/03/29 14:40:32.78 .net
>>476
おっと、s/delcare/local/ でお願い

478:名無しさん@お腹いっぱい。
15/04/06 20:37:17.61 .net
$ N=1; echo 1234567890 | rev | sed 's/\(.\{'"$((N-1))"'\}\)./\1/' | rev

479:名無しさん@お腹いっぱい。
15/04/06 23:05:32.98 .net
xyzあいうえおabc
xyzかきくけこabc
というファイルがあったときに
あいうえお
かきくけこ
と抜き出す方法にはどうすればよいでしょうか
grepなどを使うとおもったのですがうまくいきません。
よろしければご教示おねがいします

480:名無しさん@お腹いっぱい。
15/04/07 01:08:35.80 .net
ファイル名変更じゃ無くて抜き出しなら
lsのオプション弄ってパイプでsedに繋げばいい
変更ならrename使おう

481:名無しさん@お腹いっぱい。
15/04/07 01:19:37.06 .net
sed 's/xyz\(.*\)abc/\1/g'

482:名無しさん@お腹いっぱい。
15/04/07 23:44:39.59 .net
例えば、
親ディレクトリ
/小ディレクトリA/photo/
/小ディレクトリB/photo/
/小ディレクトリC/photo/
みたいなディレクトリ構造があった時photo3つをpictureに
変更するにはどうすればよいのでしょうか
for文にmv入れ込めばできると思ったのですができませんでした
初歩的な質もう申し訳ありませんがよろしくお願いします。

483:名無しさん@お腹いっぱい。
15/04/07 23:56:55.05 .net
最後にスラッシュつけなきゃできると思うが

484:名無しさん@お腹いっぱい。
15/04/08 00:23:18.58 .net
for i in *; do cd $i; mv photo picture; done
なんとか自己解決しましたそして>>483有難う

485:名無しさん@お腹いっぱい。
15/04/08 00:30:06.79 .net
って違う
for i in *; do cd $i; mv photo picture; cd ..;done
こうだ!!一つしか変わってなかったぜ

486:名無しさん@お腹いっぱい。
15/04/08 05:44:31.48 .net
cdが無駄です。
for i in *; do mv "$i"/photo "$i"/picture; done
ディレクトリ名等にスペースが含まれていてもいいように $i は "$i" としておく。

487:名無しさん@お腹いっぱい。
15/04/09 06:55:16.58 .net
サブシェルとすればいいだけじゃね?

488:名無しさん@お腹いっぱい。
15/04/09 08:37:12.98 .net
サブシェルが無駄です。

489:名無しさん@お腹いっぱい。
15/04/09 19:49:27.51 .net
効率求めてshellなんか使っていない。

490:名無しさん@お腹いっぱい。
15/04/09 22:21:14.40 .net
その返しは馬鹿っぽいと思います

491:名無しさん@お腹いっぱい。
15/04/09 23:52:38.50 .net
>>482
URLリンク(x68000.q-e-d.net)
util-linuxのrenameコマンドの場合
rename -v photo picture */photo
Debian系だと正規表現指定、できるかは不明
URLリンク(wiki.ubuntulinux.jp)
FreeBSDだとsysutils/renameで正規表現指定、できるかは不明
URLリンク(www.freshports.org)

492:名無しさん@お腹いっぱい。
15/04/15 08:31:50.31 .net
$> TIME="2015/04/15 08:25:16"
$> printf ${TIME:5:11}
04/15
$> echo ${TIME:5:11}
04/15 08:25
$> printf "${TIME:5:11}"
04/15 08:25
罠だ、はまった。。。

493:名無しさん@お腹いっぱい。
15/04/15 08:45:36.46 .net
何が罠なの?
シェル変数の展開時には " " でかこんで "${HOGE...}" にするのが基本。

494:名無しさん@お腹いっぱい。
15/04/15 08:48:00.87 .net
最初から、
date '+%m/%d %H:%M'
にした方がいいのでは?

495:名無しさん@お腹いっぱい。
15/04/15 08:48:10.66 .net
>>492
$ printf "${TIME:5:11}"
04/15 08:25
$ printf "%s %s\n" ${TIME:5:11}
04/15 08:25

496:名無しさん@お腹いっぱい。
15/04/15 09:13:38.03 uEYnIocSI
$ TIME="2015/04/15 08:25:16"
$ printf ${TIME:5:11}
04/15
$ /usr/bin/printf ${TIME:5:11}
04/15/usr/bin/printf: warning: ignoring excess arguments, starting with `08:25'
$ type printf
printf is a shell builtin

497:名無しさん@お腹いっぱい。
15/04/15 09:14:12.79 .net
$ TIME="2015/04/15 08:25:16"
$ printf ${TIME:5:11}
04/15
$ /usr/bin/printf ${TIME:5:11}
04/15/usr/bin/printf: warning: ignoring excess arguments, starting with `08:25'
$ type printf
printf is a shell builtin

498:名無しさん@お腹いっぱい。
15/04/15 13:25:09.88 .net
$ TIME="2015/04/15 13:30:16"
$ printf ${TIME:5:11}
04/15
$ IFS="wanada"
$ printf ${TIME:5:11}
04/15 13:30

499:名無しさん@お腹いっぱい。
15/04/15 13:48:45.04 .net
bash依存をやめよう
$ TIME="2015/04/15 08:25:16"
$ printf ${TIME:5:11}
sh: Bad substitution
$ IFS='/ :'
$ set $TIME
$ echo $2/$3 $4:$5
04/15 08:25

500:名無しさん@お腹いっぱい。
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
}


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