TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
【ウホッ!】twmを語ろう!!【いいWM】
彼女をCVSで管理したい
KDEやGnomeを使ってる香具師って・・・
私は感動した!!ありがとうUNIXの皆さん!2006夏〜
FreeBSDを語れ Part50
どうしてあなたは寝ないのですか?
☆☆minix☆☆
yacc & lex
bashで補完スレ
CPUの周波数の上げ方

シェルスクリプト総合 その28


1 :2018/08/02 〜 最終レス :2020/04/26
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)もしくはPOSIX準拠の互換シェルがデフォルトです。
 bash/zsh/ksh/ash/dash/yash/poshなどの専用機能に依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
・POSIXについてのリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています
 最新の仕様はこちらへ http://pubs.opengroup.org/onlinepubs/9699919799/
 (左上の「Shell & Utilities」 から参照することができます。)
・v7 shに一番近くて、現役(?)のshは、OpenSolaris由来のheirloom sh。
  http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
  http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
 (理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
 質問に対して問題が間違ってるといちゃもんをつけるのもやめましょう
シェルスクリプト総合 その27
https://mevius.2ch.sc/test/read.cgi/unix/1525337663/

2 :
その28は以下に移動しました。

シェルスクリプト総合 その28
http://mevius.2ch.sc/test/read.cgi/tech/1532397676/

3 :
FAQ

Q. 秘密結社シェルショッカーってなんですか?
A. しらん。どっかの変態団体やろ。近寄らんほうが良い。

Q. USP友の会ってなんですか?
A. しらん。どっかの変態団体やろ。近寄らんほうが良い。

Q. シェル芸ってなんですか?
A. しらん。ヲタ芸みたいなもんやろ。恥ずべきものや。

Q. ユニケージ開発手法ってなんですか?
A. しらん。所でアプリの開発には普通のプログラム言語使ったほうが良いぞ

4 :
シェルスクリプトの総合スレです。
初心者、学生、アマチュア、プロ、シェルの種類や OS を問いません。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずはテンプレートをご覧下さい。

★A. お約束
1. 特記なき場合は #!/bin/sh がデフォルトです。この場合可搬性に注意し、
 Traditional Bourne Shell もしくは、POSIX 相当のスクリプトでお願いします。
 bash / zsh / ksh / ash / dash や OS 等に依存する場合は、明示しましょう。
 良く分からない方は、使用している OS を書いておけば OK です。是非ご参加下さい。
2. 質問する前に、まず自分で調べましょう。ただし、
 「聞くは一時の恥、聞かぬは一生の恥」です。積極的に参加しましょう。
3. 相手を侮辱する発言、失礼な発言は差し控え、知的な議論を楽しみましょう。
4. 他者には様々な環境や事情、目的が有る事に留意し、無下に扱う様な発言は
 控えましょう。

★B. お約束の補足
1. macOS では、/bin/sh の実体は bash です。また、一般的に BSD 系 や
 GNU/Linux の方は、/bin/sh がシンボリックリンクですので、注意して下さい。
 ls (ハイフン)l /bin/sh や readlink -e /bin/sh で確かめて下さい。
2. 可搬性については、下記 F.1 を参照して下さい。
3. POSIX については、man 7 standards や下記 F.2 ( の特に Shell & Utilities )
 を参照して下さい。
4. Traditional Bourne Shell とは、UNIX Version 7 から SVR4.2 の /bin/sh を元に
 小さなの改変を加え主に商用 UNIX で残されているものです。( 下記 F.3 参照 )
5. Traditional Bourne Shell で入手しやすい sh は、後期 SVR4.0 から派生し、
 SunOS 5 / OpenSolaris を経た、Heirloom Bourne Shell です。
 SVR4 / SVID3 相当です。同様の Unix utilities も扱っています。
 ( 下記 F.3 参照 )

5 :
★C. 初心者へのアドバイス
1. シェルスクリプトのことをシェルってゆーな
2. 知らないコマンドが出てきたら man コマンドで調べましょう。
3. UNIX には、シェルスクリプトに便利な小さなコマンドが色々あります。
 apropos ないしは man -k でそれらしい単語による簡単な検索もできます。
4. シェルの構文や内部コマンドは man sh で。英語は LANG=C man shで。
5. 思い通りに動かないときは、まずは #!/bin/sh -x でトレースしましょう。
6. 適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awk / perl / javascript / ruby / python 等、他の (スクリプト) 言語の方が
 適した処理にはそちらを使いましょう。
7. シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題は正規表現スレへ
8. csh / tcsh のシェルスクリプトは推奨されません。理由は下記を参照
 http://www.speech-lab.org/~hiroki/csh-whynot.euc
9. cat file|すんなハゲ
 a. 詳細は "Useless Use of Cat" UUOC で検索して下さい
 b. 有用な場合も有ります Useful use of cat(1) 英文
  http://www.in-ulm.de/~mascheck/various/uuoc/

★D. シェルスクリプトでよく使うコマンド
1. 制御・条件判定系: [, test, expr, true, false, yes, getopts
2. テキスト処理系: cat, awk, sed, tr, sort, uniq, grep, wc, head, tail, cut,
 paste, comm, join
3. ファイル検索系: find ( スペースなどを含むファイル名を正しく処理するため、
 find は -exec command {} + を推奨。
 他に -print0、xargs は -0 オプションという方法もあるが Solaris 非対応 )
4. ディレクトリ系: basename, dirname
5. 出力系: echo, printf
6. 対話コマンド制御系: expect
7. http / ftp の処理自動化: wget, curl

6 :
★E. 学習用テキスト
1. Bourne Shell自習テキスト ( 1993年 ) pdf お薦め
 http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/sh-text/sh/
 (↑サイト消滅かも)
 http://ayapin.film.s.dendai.ac.jp/~matuda/Lecture/PDF/sh-two.pdf
2. UNIX FAQ LIST
 http://www.nurs.or.jp/~asada/FAQ/UNIX/UNIX.FAQ.html
(3. シェルを使おう - 導入からプログラミングまで - ( 2002年 )
 http://www.netfort.gr.jp/~tomokuni/lms/shell/ (リンク切れ))

★F. 参考リンク
1. 可搬性関連
 a. autoconf マニュアル 移植性のあるシェルプログラム
  http://www.gnu.org/software/autoconf/manual/autoconf.html#Portable-Shell
  http://www.geocities.jp/fut_nis/html/autoconf-ja/Portable-Shell.html
 b. Portability talk [Bash Hackers Wiki] 英文
  Obsolete and deprecated syntax も見る価値有り
  http://wiki.bash-hackers.org/scripting/nonportable
 c. How to make bash scripts work in dash 英文
  http://mywiki.wooledge.org/Bashism
 d. DashAsBinSh 英文
  https://wiki.ubuntu.com/DashAsBinSh
 e. Portable Shell Programming 英文
  http://www.in-ulm.de/~mascheck/various/portability/

7 :
2. POSIX
 The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition 英文
 http://pubs.opengroup.org/onlinepubs/9699919799/
3. Traditional Bourne Shell 関連
 a. The Traditional Bourne Shell Family History and Development 英文
  http://www.in-ulm.de/~mascheck/bourne/
 b. BourneShell / Where does the Bourne shell live? 英文
  http://mywiki.wooledge.org/BourneShell
 c. The Heirloom Bourne Shell 英文
  http://heirloom.sourceforge.net/
4. マニュアル
 a. The Base Specifications Issue 7, 2013 Edition 英文
  http://pubs.opengroup.org/onlinepubs/9699919799/nfindex.html
 b. FreeBSD 日本語マニュアル検索
  http://www.jp.freebsd.org/man-jp/search.html
 c. JM Project (Japanese)
  http://linuxjm.sourceforge.jp/
5. FAQ 等
 a. UNIXの部屋 ( 2011年 )
  http://x68000.q-e-d.net/~68user/unix/
 b. Linux JF (Japanese FAQ) Project
  http://linuxjf.osdn.jp/
 c. Advanced Bash-Scripting Guide 英文
  http://www.tldp.org/LDP/abs/html/
 d. Unix Programming FAQ 日本語訳 ( 2000年 )
  http://www.race.u-tokyo.ac.jp/~moro/unix-programmer/

8 :
6. ツール
 a. web tool です。Vim syntastic や Emacs の Flycheck でも使えます
  ShellCheck
  http://www.shellcheck.net/about.html
 b. vim 用 syntastic
  https://github.com/scrooloose/syntastic
 c. checkbashisms も使用してチェック duggan/shlint GitHub
  https://github.com/duggan/shlint

★G. 前スレ
1. ☆シェルスクリプトを勉強するにあたって☆
 http://hibari.2ch.sc/test/read.cgi/unix/989659936/
2. 便利なシェルスクリプト見せろ
 http://pc.2ch.sc/test/read.cgi/unix/996949546/
3. シェルスクリプト総合 その1
 http://pc5.2ch.sc/test/read.cgi/unix/1101820646/
後略。検索して下さい

9 :
★H. 関連スレ(UNIX板/プログラム板)
1. sed
 http://mevius.2ch.sc/test/read.cgi/unix/1085730992/
2. 正規表現
 http://mevius.2ch.sc/test/read.cgi/unix/1039165754/
3. Regular Expression(正規表現) Part14
 http://mevius.2ch.sc/test/read.cgi/tech/1489511075/
4. 【モダン推奨】Perlについての質問箱 50箱目
 http://mevius.2ch.sc/test/read.cgi/tech/1327110999/
5. ECMAScript デス 6
 http://mevius.2ch.sc/test/read.cgi/tech/1483332914/
6. Ruby 初心者スレッド Part 63
 http://mevius.2ch.sc/test/read.cgi/tech/1523954817/
7. Pythonのお勉強 Part57
 http://mevius.2ch.sc/test/read.cgi/tech/1529888279/
8. 【node.js】サーバサイドjavascript 5【Nashorn】
 http://mevius.2ch.sc/test/read.cgi/tech/1518528093/

★I. 現在評価待ち: X.n は予定した追加先。主にスレ立て人の判断保留用。

10 :
このスレは手違いで作成されたものです。

前スレ
http://mevius.2ch.sc/test/read.cgi/unix/1525337663/941-
の流れを読むとわかる通り、
ワッチョイをつけられる板に移動しようという話になり、
特に反対も出ず
http://mevius.2ch.sc/test/read.cgi/tech/1532397676/
への移動が決まりました。

このスレは利用せず、
http://mevius.2ch.sc/test/read.cgi/tech/1532397676/
への移動をお願いします。

11 :
移りたい奴はさっさと移れよ
もうここ来んな

12 :
移りたくない理由って、前スレで自演荒らししてたからってのしか思いつかない。
このスレを使いたい人間ってのが荒らしだとしたら、このスレを捨てるのが適切では?

13 :
お前が今やってることが荒らしだろ
さっさと移れよ

14 :
>>13
移りたくないのであれば、前スレで反論する機会があったのに、
一言も反論せずにいきなりこのスレを建てたんだから、
どう考えてもあなたがスレ荒らしでしょう。

15 :
シェルスクリプト総合 その28
http://mevius.2ch.sc/test/read.cgi/tech/1532397676/
に移動してください

16 :
移りたかった奴らがいつまでも見てんなよ
ここを荒らすな

17 :
ここのことは忘れて移った先で楽しく過ごしてください
もう構わないでね

18 :
>>17
荒らしスレであることを知らずに迷いこむといけませんから、
知らずに書き込んだ可能性がある場合には、重複スレである旨の
注意書きを今後も投稿するつもりです。

荒らしスレであることを承知の上で書き込んでいるケースについては、
私は今後このスレに書きこみません。
他の人がどうするかは私には分かりませんが。

19 :
向こうのスレで、こっちにしつこく誘導しようとしてるなら非難されて仕方ないけど、そんなことしてる奴いないんだろ?
見てないから知らんが

もうここは構ってくれなくていいって
余計なお世話だわ
どんだけ暇人だよ

20 :
fishをログインシェルとして使ってます

zshの場合bindkey "\e[A" history-beginning-search-backward-end
で数文字入力して上矢印キーを押すと直近の履歴から保管されますが
fishでこれをしたい場合どうすればいいのでしょうか?

fishだとデフォルトで右矢印キーがこの動作になるようですが
これを上矢印キーにしたいところです。

21 :
~ > bind|grep search-back
bind \e\eOA history-token-search-backward
bind \e\e\[A history-token-search-backward
bind \eO3A history-token-search-backward
bind \e\[3A history-token-search-backward
bind \e\[1\;3A history-token-search-backward
bind \e\[1\;9A history-token-search-backward
bind \e. history-token-search-backward
bind \eo history-token-search-backward

22 :
wgetを使ってシェルスクリプトでダウンロードツールを作ったんだけど
ナロー回線だから出来るだけ無駄を省きたくて
-cオプションで既存ダウンロード分に追記する形にしてる
でも当然ならがコマンドが2重に発行されたらぐちゃぐちゃになるから
psコマンドでwgetを2重発行しないようにしてるけどちょっと不安
実際一部の文字がpsコマンドで「?」表示されてgrepに掛からなかったことがあり
ファイルが壊れたことがあった
ぶっちゃけダウンロードしてるのはニコニコの動画であり
(動画なんで視聴しないと壊れてるのかわからず厄介)
ID_タイトル.mp4とかの形式で保存してるんだけど
問題はマルチバイト文字のタイトルだから
「grep "${id}.*${extention}"」として回避
実際はもうちょっとコマンドの詳細まで見てるけど

こんな場合のベストってダウンロード先のファイル名に
プロセスID(wgetを実行するシェルスクリプトのプロセスID)を含めるようにして
状況に応じてファイル名を変えながらwgetするくらいしかないのかな?
既存ダウンロード分のmvに成功したらwgetするとかで
ファイルをロックする相当の処理を実現するイメージなんだけど

ちなみにナローじゃない回線を使うことがあったり
ダウンロード中に止まることがあるため
複数の動画を同時並行でダウンロードするつくりにしているため
この問題はぜひとも回避したいです

23 :
>>22
>複数の動画を同時並行でダウンロードするつくり
なんでlockファイルで二重起動を防止しないのだろうと思ったら、
同時並列でwgetを実行したいけど、
1つの動画については多重実行されないようにしたい、ということか。

ニコニコのことはよく知らないけど、半角英数のIDが存在するなら、
wgetのダウンロード開始時に動画のIDのみを参照ファイルに書き込んで、
終了したらそのIDを消すようにして、IDが参照ファイルに書かれている間は、
そのファイルをダウンロードしないという仕組みにすればどうだろう。

でもそもそも
> 実際一部の文字がpsコマンドで「?」表示されてgrepに掛からなかったことがあり
これが分からん。idのみでgrepしたら文字化けしていてもヒットすると思うけど。

24 :
>>22
ファイルがオープンされているかを調べれば良いと思う

どうやるのかな
lsof が使えるなら

lsof -a -c '/^wget$/' "${filename}"

25 :
> ニコニコのことはよく知らないけど、半角英数のIDが存在するなら、
> wgetのダウンロード開始時に動画のIDのみを参照ファイルに書き込んで、
> 終了したらそのIDを消すようにして、IDが参照ファイルに書かれている間は、
> そのファイルをダウンロードしないという仕組みにすればどうだろう。

参照ファイルを参照してIDが無いことを確認してID書き込むまでの間に
同じ処理が走ったらチェック抜けてしまうなというのが懸案としてあります

なのでダウンロードしているファイルそのものをロックファイルにして
しかもmvコマンドの成否によって判断したらよいのではと午前中に思いました

> でもそもそも
> > 実際一部の文字がpsコマンドで「?」表示されてgrepに掛からなかったことがあり
> これが分からん。idのみでgrepしたら文字化けしていてもヒットすると思うけど。

今はIDと拡張子でgrep掛けてるので問題ないのです
(直近だと「禁書目録」がpsコマンドで「禁??録」になりプロセスチェックをスルーしていました)
でも先の参照ファイルと同じで
同じ動画に対してほぼ同時にダウンロード処理が走った場合
psコマンドを実行してから実際にwgetコマンドを実行するまでの間に
チェックを抜けてしまうことが考えられるのでどうにかしたいなと思ってます

ちょっと後出しになって申し訳ないですが
ダウンロードの処理はさまざまな状況で実行されることがあり
これからダウンロードするぞってターミナルからコマンドを打つこともありますが
cron登録していて自動でダウンロードが走るようにもしているため
そういう適当な運用でも回避できればと考えています

26 :
>>24
ありがとうございます
試してみたいと思いますが
lsof でチェックしてオープンされていないと判断して継続のwgetがオープンする間に
並行して実行された処理でwgetがオープンしてしまう可能性があるので・・・

シェルでやるには難しい処理でしょうか?

27 :
>>22
>>1-15 あたりをご覧になると分かりとおり、
このスレは荒らしが立てて維持しています。
特段の理由がなければ本スレ
http://mevius.2ch.sc/test/read.cgi/tech/1532397676/
の利用をお勧めします。

28 :
サーバーのサービスではなく、
ユーザは自分1人だよね。cronも動いているけど。
それなら、ミリ秒単位で処理開始がぶつかることなんて想定しなくてもよいのでは。
人命がかかっているような処理なら別だけど。

29 :
>>28
確かにそうですが方法が確立し実装してしまえば
動画を視聴してチェックと言う作業からほぼ解放されるので
もうちょっとやってみます

>>27
実装を試して相談したいことがあった場合検討してみます

30 :
ずっと楽をするために今努力して作りこむってのは間違っていない

まあ出来ないと思うときは妥協は必要だが

31 :
>>26
ファイルに対応する「ロックファイル」を作って、その存在確認をするのが定石だったみたい
既にロックファイルが存在していたら、別のプロセスがファイルを使っていると見做す
その際ロックファイルの存在確認と作成を「同時」(アトミック)に行うのが大事だそうで

そのファイル、安全にロックできていますか?(アトミックなファイル操作:後編)
https://heartbeats.jp/hbblog/2013/10/atomic03.html

こんな感じかな

lockfile="${outputfile}".lock
if ln -s -- $$ "${lockfile}" 2>/dev/null; then
(
unlock() { rm -- "${lockfile}"; }
trap "unlock" EXIT HUP INT QUIT SEGV TERM

wget -c -O "${outputfile}" "${url}"
) &
fi

32 :
$ yotei.py 201808290900
って感じでスクリプトの引数に今日の年月日0900(date +%Y%m%d0900)を入れて実行したいです。
cronで実行したいのですが、date +%Y%m%d0900の出力をyotei.pyの引数に入れるには、1行でどうやって書いたらいいですか?

33 :
$ yotei.py namae 201808290900
だったので、2番目の引数にdate +%Y%m%d0900の出力を入れたいです。

34 :
すぐ思いついたのはシェルスクリプトを1個増やして以下のようにする

export ymd0900=`date +%Y%m%d0900`
yotei.py namae $ymd0900

それをcronから呼ぶ

35 :
>>33
https://ja.wikipedia.org/wiki/Crontab
よくあるミス でそのもののようなのあるけど

36 :
>>34
>>35
どうもありがとうございます!
ファイルを増やしたくなかったので1行でやりたかったんですが、ウィキペディアのその項目のとおり、エスケープ\を入れる事で1行で出来ました!

yotei.py 名前 $(date +\%Y\%m\%d0900)

37 :
サマータイム導入に気をつけろよ
ローカルタイム使ってると同じ日時が
2回でてくることになるぜ

38 :
EUじゃサマータイムは廃止だっていうのにマジで日本はこれから導入するのか?
趣味でプログラム作ってるだけなのに余計な処理増えるのはホント困る…。

39 :
>>22
youtube-dlならニコニコにも対応してるしタイトルとIDそのままで保存できるよ
但しここ数年の動画はDL速度が極端に遅い上に途中で必ず落ちる
[download] 5.6% of 202.83MiB at 98.22KiB/s ETA 33:15[download] Got server HTTP error: Downloaded 12014750 bytes, expected 212678720 bytes. Retrying (attempt 1 of 10)...
ERROR: unable to download video data: HTTP Error 403: Forbidden
永続リトライ設定でもこうなるししmpvでも再生中断するからな
昔のflvなんかは高速だけど年代で仕様が違う辺りエロサイトより酷い

40 :
東京オリンピックまでにサマータイム導入
てのはどう考えても物理的に不可能だから
話は立ち消えになるだろうけど、将来、
導入されないとも限らない
ローカルタイムを出力するときは必ず
timezoneを付けておいたほうがいい

41 :
>>40
YAGNI。必要になってから対応するよw

42 :
あっちのスレめっちゃ荒れてるじゃん

43 :
>>40
どうやって対応したらよい?

44 :
>>42
このスレ立てた奴が荒らしに行ってるからな。
あっちの板に嫌がらせで重複スレまで立てるという性格の悪さ。

そういう悪人の立てたこのスレ使ってると、悪人の一味みたいな立ち位置に属することになるぜ。

45 :
>>43
要件による。どうしたらいいかは客にでも聞いてこい

46 :
ゴリホーモの嫌がらせ陰湿やなあ

47 :
なんのためにプログラム板に移動したんんだっけ?
人を増やすため?

48 :
>>47
前スレで荒らしが出たからIDやワッチョイをつけたかったんだけど、
UNIX板ではつけられなかったから。

で、荒らしはIDつくのが嫌で新スレが立った後からこのスレを立て(>>10-15)、
さらには新スレを荒らしに行ってるってのが現状。

49 :
でもIDつくのが嫌だったんでしょう?
IDつくのが嫌じゃなくなったってこと?

50 :
>>49
IDつくと自分が荒らしてることが分かるから嫌だったけど、
向こうのスレについてはスレ自体を敵視しているから、
自分が荒らしてることがバレバレであっても、スレを使いづらくしたい
ってことじゃないかな。

51 :
でもこのスレも使いづらくしてたんでしょう?

52 :
>>51
ム板の本スレは意図的に荒らしてて(だからバレてもOK)、
前スレは天然で荒らしてる面がある(だからバレたくない)
って程度の違いはありそうだね。

53 :
>>52
いやいや、単に荒らしは最初から隠すつもりもなく、
バレようがバレまいが関係ないんだよ。

荒らしにとってはは最初から隠してるわけでもないが、
でもこのスレの住民がその荒らしのIDを見たくて移動したんでしょ?
それでんで、見て何がしたかったのか不明だけどなw

IDが出ていれば荒らされないとでも思った?

54 :
>>53
荒らしさん、こんにちはー

55 :
>>54
はい、こんにちは。
やっと気づいた?w

56 :
IDを何に使うかなんて自明でしょ。
まさか分からないってことはないよな?

57 :
荒らしをNGIDにして見えなくするため、という説がある

確かにNGIDにすると見えなくなるが、
荒らしの書き込みを止めることはできない

荒らしはどんどん自分の意見を書き込むが
それに対しての反論はできない。
なぜなら荒らしの書き込みが見えないから

荒らしとNGIDに入れてない人とのやり取りでスレは埋まっていく
はたから見れば、話についてこれず時々レスするが
荒らしに論破され何も言い返せない構図のできあがり
それ全体の荒らしの濃度が高まる

そしてIDは変わるから毎日の登録作業が増える。
忘れるとついレスをしてしまう

58 :
というわけで、以下のどっちかの運用にするのがよくあるパターンだな。
・このIDは昔から粘着してる奴だから無視するぜってコメントを時々入れつつ無視する
・奇特な人物がいちいち反論するので、スレにいる他のメンバーは、連鎖アボーン設定して安心してその議論全体を無視する

IDがないとこういう回避ができないから、ひたすら我慢することになる。

59 :
連鎖あぼーんって荒らしが誰だれかれ構わずレスしたら
みんな消えちゃうの?

60 :
それを荒らしにわざわざ教えてやる理由はないな。

61 :
お前が荒らしだろ

62 :
バレたかw

63 :
まあ回線切ってIPアドレスを変えればいいだけだしな

64 :
>>59
やってみればいいんじゃね?

65 :
つまりIDやIPアドレスを変えてNG避けする意志のある荒らしってことだから、
IPアドレスも表示させるようにして、
IPアドレスの範囲を使ってNG登録するのもやむなしってことだな。

今でも2つのプロバイダーを使い分けて自演してるって
自分でバラしてたから、NG登録する範囲も2通りは必要だと。

66 :
特定文字列の除外リストを元に除外処理をしたいんだけど
リストとかあきらめてgrepをフィルタファイルとして別するのが一番楽?
やりたいのは以下のようなことなんだけど
シェルスクリプトなのにプログラミング的なことやって
grepのフィルタを組み立てることに違和感を感じてる(面倒とはっきり言えって?)

echo ${DATA_REC} | grep -e AAA -e BBB -e CCC

if [ $? -eq 0 ]
then
continue
fi

# 継続処理

67 :
> grepをフィルタファイルとして別するのが一番楽?

ってのはファイルにgrepのコマンドを書いてreadで読んで
echo ${DATA_REC} ${grep_cmd}
とかにするってことね
grepコマンドが書かれてたら適用
書かれてなかったらスルーって感じ

68 :
ああパイプがうまくいかないから若干判定が必要か・・・

pi@melchior /tmp $ export grep_cmd=" | grep -e AA -e BB"
pi@melchior /tmp $ echo AAA $grep_cmd
AAA | grep -e AA -e BB
pi@melchior /tmp $ echo AAA | $grep_cmd
-bash: |: command not found
pi@melchior /tmp $ export grep_cmd=" grep -e AA -e BB"
pi@melchior /tmp $ echo AAA | $grep_cmd
AAA
pi@melchior /tmp $

69 :
もうベタで書いてしまった・・・
でも順調!すげーよく動いてる!

この件は今後の課題にしよう

70 :
除外する文字列をファイルに入れて
grep -f か grep -v -f でいいような気がする

71 :
>>66
> シェルスクリプトなのにプログラミング的なことやって

シェル芸じゃなくてスクリプトなんだから
プログラミングで当たり前だよw

72 :
>>67
少し考えてみたが、俺もgrepの-fオプションを利用するのが一番楽だと思うな
ただ昔、除外リストの否定とかやりたかったんで書いたことはあるが

73 :
grep -f 使えばいいから不要だが
お手軽に>>66のようなことをするのならこうかな
リストにスペースなどが入っていたらうまくいかんがw
文字列の組み立ての参考として

echo ${DATA_REC} | grep $(printf ' -e %s' $(cat list))

74 :
シェルスクリプトじゃなくてシェルの基礎を訊いてアレだけど
bashの$()と``って使い分けた方がいいの?
端末ではバッククォート多用してるけども

75 :
``は古い書き方。ネストができないという欠点が有る
bashに限らず、$()を使ったほうが良い。欠点は文字が一文字多くなるだけ

76 :
きっちりエスケープすればネストはできるよ。もちろん推奨はせんが

77 :
>>74
http://mywiki.wooledge.org/BashFAQ/082

78 :
https://imgur.com/FAF05na.jpg

79 :
test $(date +%w) -eq 5

今日が金曜日なら5が出るんですが、-eq というのはコマンドなのかtestコマンドのオプションなのか、これは何ですか?

80 :
自己レス
-eq はtestコマンドのオプションで、==の事みたいですね

81 :
test コマンドのオプションです。

ところで今日は金曜日ですが5は出ませんよね。
戻り値は0となりますが……何か勘違いしている気がします。

82 :
すみません

test $(date +%w) -eq 5 && echo "今日は金曜日!"

これだと、金曜日だとechoが実行されました

83 :
>>82
自己レス
金曜日かどうか調べて金曜日なら戻り値は0、
で、戻り値が0の場合echoが実行されるって事ですね

84 :
毎月第2月曜日と毎月第2週の月曜日とでは、指す日にちってもしかして異なります?

0 17 8-14 * test $(date +%w) -eq 5 && command
こんな風にcronで毎月第2金曜日とか指定したいんですが、

例えば今月の5日で言うと、5日は1回目の月曜日だけど、月の2週目にあるので疑問に思いました。

0 17 8-14 * test $(date +%w) -eq 1 && command
これだと今週の月曜日には実行するされないですよね?

85 :
読みづらい。testなんて使うな

[ $(date +%w) -eq 5 ] && echo "今日は金曜日!"

86 :
>>85
[ ]ってなんですか?
ググろうにも記号なのでググれないです

87 :
man [

88 :
bash(バージョン 4.4.12(1)-release)でスクリプト書いててちょっと謎が

$ a=1; b=2; [[ ${a}<=${b} ]]; echo $?
こうするとちゃんと終了コードの0が返ってきますが

$ a=1; b=2; [[ ${a} <= ${b} ]]; echo $?
比較演算子の前後にスペースを入れると「条件式に構文エラーがあります」「`${b}' 周辺に構文エラーがあります」と怒られます

$ a=1; b=2; [[ ${a} < ${b} ]]; echo $?
比較演算子をleでなくltにするとまた0が返ります

これって何故なんでしょう?

89 :
>>88
[[ ... ]] で使える演算子に <= は存在しない

それは数の比較ではなく
[[ "1" < "=2" ]]
という文字列の比較になっている

なので <= の右に空白を置くと
[[ "1" < "=" "2" ]]
となりエラー

条件式
https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBW

90 :
>>89
さっそくありがとうございます
そうか、イコールをつけない不等号で上手く動いてるように見えるのは、文字列として辞書順で比較してるからなんですね
どうやら私の頭の中では、二重丸括弧での算術式展開とゴッチャになってたみたいです
何時間も唸ってたのが一撃でスッキリしました。ありがとうございました

91 :
記号のコマンドってドットと[以外にもあるんか?

92 :
>>91
:

93 :
>>87
もしかしてtestと[]はだいたい同じですか?
testを使わない方がいいのはなぜなんでしょうか?

94 :
http://r2.upup.be/wV2qsULdHm

95 :
>>87
それで出てくるのは /usr/bin[ の方のmanじゃないだろうか

96 :
bash の場合。

$ type [
[ is a shell builtin

$ help [
[: [ arg... ]
Evaluate conditional expression.

This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.

97 :
sedで\1を変数名としていっぺんに異なる部分を異なる変数の内容で変換できませんか?

sed -e "s/<\(.*\)>/${\1}/g"
こんなかんじの

98 :
#!/bin/bash
# 変数URL, ETAGには既に適切な値が入ってるとする
OPT=('--header' "'If-None-Match: ${ETAG}'")
curl "${OPT[@]}" "${URL}"

こんなスクリプトを書いたけど、curlと鯖のやりとりを覗くと、リクエストヘッダのIf-None-Matchの行にシングルクォーテーションが付いて

'If-None-Match: (ETAGの値)'

と送られてしまう。で、試しにcurlの行を

echo "curl ${OPT[@]} ${URL}" > /tmp/tempfile
. /tmp/tempfile

と書き換えて実行すると、ちゃんと正常に動く。man bashを読んだりbashの引用符の扱われ方をググってみたりしても、何が何だかさっぱり分からない。
どなたか助けてくれませんか。

99 :
自己レス
curlだからとか関係ないな。変数にシングルクォートで囲ったものが入ってて、それをダブルクォートで囲った配列展開してるんだから、そのパラメーターはそのままシングルクォートつきになって当然。
しかし、ETAGはダブルクオートを含むしhttpリクエストヘッダはスペースを含むから、全体をシングルクォートで囲まなきゃならんのだよな。
やっぱどのタイミングでどのクォートがどう展開されるのか、一段階ずつ追いかけてみるしかないのかな

100 :
なんか混乱しとるなw
まあ、ダブルクォートは、他言語を使っている人からすれば
直感に反する機能だってことに、俺も最近気づいたんだけどな
ただどこがどう違うかを言葉で説明したことがわけじゃない。やってるみるか?

・シェルスクリプトは文字列として展開されて実行されているようでそうではない
・ダブルクォートは文字列を囲う機能ではなく、変数展開の挙動を変えるエスケープの一種
この二つに集約されるかなぁ

> しかし、ETAGはダブルクオートを含むし
これ関係ないんだわ

OPT=('--header' "If-None-Match: ${ETAG}")
だと
OPT=('--header' "If-None-Match: "686897696a7c876b7e"")
こうなってしまい
OPT=('--header'   "If-None-Match: "  686897696a7c876b7e  "")
のように解釈されると思ってしまうが違う。
別に文字列展開されてから、動くわけじゃない

ダブルクォートは「 If-None-Match: ${ETAG} 」の部分を一つの引数として
扱いますよー(ただし中の変数は展開されますよ)という意味。
変数の中にダブルクォートが入っていようが改行が入っていようが関係ない

またダブルクォートはそれだけの機能ではなく $@ が入っている場合に異なる挙動をする
"$@" が入っている場合、一つの引数ではなく複数の引数として扱われる
例えば引数$1〜$5が存在する場合、"$@" は "$1" "$2" "$3" "$4" "$5" と等価
また"foo$@bar" となっていた場合、 "foo$1" "$2" "$3" "$4" "$5bar" と等価
引数が一つなら "foo$1bar" だし、引数がゼロの場合は、書かなかったのと同じとなる("" 空文字にはならない)

このように文字列として囲う機能じゃなくて、中に入ってる文字や変数の解釈の仕方に影響を与える機能

101 :
ちなみに "$@" を複数の引数に展開されたくなければ "$*" を使う

102 :
>>100-101
ありがとう。おかげで、サクッと片付きました。素直に

OPT=('--header' "If-None-Match: ${ETAG}")
curl "${OPT[@]}" "${URL}"

で何の問題もなく動作しました。最初にcurlについて調べてたときにETAGを使う例でシングルクォートが使われてたのに、ずっと脳味噌が引っ張られてたようです。
上の行で変数に入れる時点で、スペースを含む一つの文字列として扱われてるんだから、あとはその中身がなんであるかに関係なく、"$[@]"で展開すればいいわけですね。

ありがとうございました。

103 :
bashでログ出力処理を一括でやるにはどうすれば良いですか?

powesshellだと、Start-Transcript に対応するコマンドを教えてください

104 :
>>103
何がしたいのかよくわからないが
シェルスクリプト内の標準出力と標準エラー出力をファイルに出力するなら
#!/bin/bash
exec >script.log 2>&amp;1
...

105 :
>>104
何したいかよくわからんって、
パワーシェルでいうStart-Transcriptをやりたいの
bashで一行ずつリダイレクトつけないとダメとかダサすぎる

106 :
回答ちゃんと読め

107 :
PowerShellなんぞ興味が無いから知らんという人が多かろう
標準出力と標準エラー出力をファイルとコンソールの両方に出したいと言えばいい

知ってるがお前の態度が気に入らない(AA略)

108 :
生意気だな

109 :
ドザはどこ行ってもあれだな

110 :
ドザがー ドザがー 

111 :
やっつけ
$ {
> echo foo
> ECHO bar
> } 2>&1 | tee result.txt
foo
ECHO: コマンドが見つかりません

112 :
FreeBSD の /usr/bin/man で、
  if { sizes=$($STTY size 0>&3 2>/dev/null); } 3>&1; then
という記述があるんですが、これって何をしているんでしょう。
・標準エラー出力を捨てている
・3 を 標準入力の指す先 (tty) に設定?
・0 を ↑の3に設定?

3>&1 して 1>&3 なら退避目的かなと思うんですが、これは違うので、
意図がわからないです。

ソースはここです。
https://github.com/freebsd/freebsd/blob/master/usr.bin/man/man.sh#L646

113 :
・MANWIDTH=ttyのときはmanの標準出力1の横幅を取得したい。
・sttyの操作対象端末は標準入力0で、出力先は標準出力1。
・a>&b は dup2(b,a) のことで、左を使うと実体は右になる。
・標準エラー出力2は捨てる。
という前提で、
sizes=$($STTY size 0>&1 2>/dev/null) と書くと、
sttyの標準出力1は$()に取られてるから、manの標準出力1とは別物になって、
正しい端末をsttyできない。
{ sizes=$($STTY size 0>&3 2>/dev/null); } 3>&1 は、1が取られ
てるなら3を中継すれば安全じゃねと書いたものと推測される。
{ sizes=$($STTY size 2>/dev/null); } 0>&1 と書けば十分なはず。

114 :
findした結果を1行づつ配列に代入したい場合にはどうすればよいでしょうか?
当方が書いたshellだと、検索したい文字列に空白があるケースだと
そこで要素が別れてしまいます。

array=$(find ${HOME}/animal -type d -iname "*検索したい文字列*")

115 :
IFSを改行のみにする

116 :
>>113
ありがとうございます!
リダイレクトにstdin/stdoutの差し替え的な使い方があるとか、sttyはstdinを見るとか、sttyがstdinを見てもstdoutを見てもそれが端末を指しているなら同じこととか、数枚目からうろこが落ちました。

しかしそもそもsttyはデフォルトのstdin見ておけばいいんじゃね、とも思ったり。command |man 的な使い方ってあったっけなぁ。

117 :
少々スレ違いですがお許しください

OS 組み込みの tcsh をバージョンアップしたいのですが、
シェルスクリプトの挙動が変わってしまうのが怖くて、なるべく
コンパイル時オプション(configure オプション)を揃えたいのですが

バイナリしかない場合に、コンパイル時オプションを調べる方法ってないですかね?
## 例えば ISC BIND の -V オプションみたいな

118 :
少々じゃないくらい違うなあ

119 :
しかもマルチかよ

120 :
find -print0した結果を1項目ずつ配列に代入したい場合にはどうすればよいでしょうか?
IFSを\0にしようとしても駄目みたいです。

121 :
ログインシェルでfishを使う時、
https://gist.github.com/mitukiii/4954559
できたらやり方教えてください

$ myCommand
タブキー押すと
$ myCommand
foo -- do foo
bar -- do bar
unk -- do toilet
って候補と1行説明表示されて
$ myCommand f
でタブーキー押すと
$ myCommand foo
と補完される
方法を知りたいです
これできたら重いzshから魚に乗り換えられる

122 :
ここはシェルスクリプトのスレです。
シェルの使い方のスレではありません。
スクリプトの話をしてください

123 :
具体的に何を語ったらいいの

124 :
シェルスクリプトだけで実装した一番高速なFizzBuzzはどんなものかとか

125 :
yash使てる?

126 :
使えてないという報告は一つもない

127 :
「使てる(つこてる)?」は「使っていますか?」という意味の質問であって、使用可能かどうかを聞いてる訳では無いのでは

128 :
真面目君か

129 :
ほにゃらら
ほんじゃらら
かきく
0 あいう
かきく
1 あいう
かきく
2 あいう
かきく
3 あいう
かきく
4 あいう
かきく
5 あいう
さしすせそ

と書かれたテキストファイルを作りたいです

echo -e ほにゃらら"\n"ほんじゃらら > index.txt
seq -f "%g あいう" 0 5 > index.txt

ここまではわかったんですが、seqで連番を書き出す時に番号と番号の間の行に「かきく」を入れて最後の行に「さしすせそ」を加えるやり方教えてほしいです

130 :
awkとかじゃいかんの

131 :
>>130
ありがとうございます
調べてみました

cat > index.txt << "EOF"
ほにゃらら
ほんじゃらら
あいう
EOF

seq 0 5 | awk -v 'ORS= あいう\nかきく\n' '{print $1}' >> index.txt

echo さしす >> index.txt

132 :
こうやると

ほにゃらら
ほんじゃらら
あいう
0 あいう
かきく
1 あいう
かきく
2 あいう
かきく
3 あいう
かきく
4 あいう
かきく
5 あいう
かきく
さしす

と出力されました
最後から2行目の「かきく」を出さないやり方が分からないです

133 :
ブレース展開

134 :
一応これでうまくいきました

cat > index.txt << "EOF"
ほにゃらら
ほんじゃらら
かきく
EOF

seq 0 5 | awk -v 'ORS= あいう\nかきく\n' '{print $1}' >> index.txt
sed -i -e '$d' index.txt
echo さしす >> index.txt

135 :
>>133
自分のやり方はなだったらしそうなのでそのキーワード調べてみます

136 :
えー、難しい...
>>130はこんなもんしか考えてなかったけど

awk 'BEGIN{print"ほにゃらら\nほんじゃらら";for(i=0;i<6;i++){printf"かきく\n%d あいう\n",i};print"さしすせそ"}'

137 :
>>129
cat <<END >index.txt
ほにゃらら
ほんじゃらら
$(printf 'かきく\n%s あいう\n' $(seq 0 5))
さしすせそ
END

138 :
あ、バックスラッシュが円記号になってしまった...

139 :
cat > index.txt << "EOF"
ほにゃらら
ほんじゃらら
EOF

printf "かきく\n%s\n" {0..5}あいう >> index.txt

これだと大分短くて出来たけど、数字と「あいう」の間にスペースが入れられない

140 :
被ってしまった
みなさんありがとうございます
質問ぬしの自分は>>139です
135と136のやり方調べてみます

141 :
>>137
catで書き出すファイルの中でprintfをやって、そのrintfの中でseqで連番作るんでね
これだとファイルへの書き込みは1回ですみますね

>>136
これも> index.txtで終えれば1回ですみますね
だけどawk難しいです
がんばって135のやり方理解できるようにします

142 :
>>141
> これだとファイルへの書き込みは1回ですみますね

どんな方法で作るにせよ { } で括れば一回にまとめられるよ

{
printf '%s\n' 'ほにゃらら'
printf '%s\n' 'ほんじゃらら'
printf 'かきく\n%s あいう\n' $(seq 0 5)
printf '%s\n' 'さしすせそ'
} >index.txt

143 :
>>142
こんな方法もあるんですね
ありがとうございます

curlの標準出力の6行目を変数に入れて他の文字列と組み合わせて標準出力に出力したいです。
URL="hoge"
ROKU="curl -sS $URL | sed -n '6p'"
echo "あいうえお"$ROKU"さしすせそ"

しかし結果はこうなりました
あいうえおcurl -sS hoge | sed -n '6p'さしすせそ

144 :
>>143
続き
>>142
さんで教わった{}を使えばよさそうな気がするですがエラーになりました

145 :
printf "あいうえお"
$ROKU #chomp のように\nを消すパイプ必要だと思う
printf "さしすせそ"

146 :
>>145
echoじゃなくてprintfなら改行されないからあいうえおに続けて書けますね
だけど、このままだとROKUのところで改行されてしまうからさしすせそは2行目に来ちゃいますね

147 :
>>129
> と書かれたテキストファイルを作りたいです

こうすれば良いのでは?

cat<<HERE > index.txt
ほにゃらら
ほんじゃらら
かきく
0 あいう
かきく
1 あいう
かきく
2 あいう
かきく
3 あいう
かきく
4 あいう
かきく
5 あいう
さしすせそ
HERE

148 :
>>143
コマンドの標準出力を変数に設定したりコマンドの引数にしたりするには
「コマンド置換」 $(…) を使います

あと、「6行目」以外の部分も取り出したくなったときに curl を何度も実行したくはないので
curl と sed は分けておきたいところ

するとこんな感じ

PAGE=$(curl -sS "$URL")
ROKU=$(printf '%s\n' "$PAGE" | sed -n '6p')
NANA=$(printf '%s\n' "$PAGE" | sed -n '7p')
printf 'あいうえお%sさしすせそ\n' "$ROKU"
printf 'かきくけこ%sたちつてと\n' "$NANA"

149 :
>>147
複数行書く方法ありがとうございます

>>148
うまくいきました
ありがとうございます

150 :
$ bash -c 'unset a b;echo 10|read a;let b=a+10;echo $b'
10

この動作ってPOSIX的にはどうなの?

151 :
読みづれーなw

bash -c '
unset a b
echo 10 | read a
# echo $a = 空
let b=a+10
echo $b
'

letはPOSIXにない
readはサブシェルなんだからaは空に決まってる
ごく普通の正しい動作

152 :
正しいコード

bash -c '
unset a b
echo 10 | {
read a
let b=a+10
echo $b
}
'

153 :
letまで考えて無かったすまん
まあ説明の為なのでそこは目をつぶってくれたまい

opensuzeなんだけども

$ ksh -c 'unset a b;echo 10|read a;let b=a+10;echo $b'
20
$

この動作ってPOSIX的にはどうなの?

154 :
バグ

155 :
curlのやり方教えてください
ブラウザのフォームにjsonを書いてポストボタンを押すとokが出るけどターミナルからcurlでやろうとすると、ボディが空だとなり送信出来ません
書き方間違えていますか?

https://i.imgur.com/Nvm7CMj.jpg

156 :
ブラウザの開発ツールからcURLでコピーした方が早そうだぞ

157 :
>>156
どうもありがとうございます
-H 'Content-Type: application/json'
を付けたら動きました

158 :
アプリの起動判定をしたいんですが
ps -alxw | grep アプリ名
2行より多ければアプリが起動してるんだと思いますけど確実な方法ありますか?

159 :
killall -0 アプリ名
とか?

160 :
>>159
どうもありがとうございます
そのコマンドで何も変えらなかったら起動中という事であってますか?

161 :
起動してないとわかっても、その直後に起動することも有るから
ロックを掛けないと確実にはならないけどな

162 :
pgrepでええやん、と思ったけど環境依存か

163 :
>>161
どの環境でも使えるロックの機構ってなにかある?

164 :
>>163
set -C もしくは mkdir

165 :
怒らないで教えて欲しいんだけど何でお前らPowerShell使わないの?
今やPowerShellの方が勉強会でドヤれるしちょまどなんかもPowerShellだってよ

166 :
>>165
なんでそんなに無意味な宣伝するの?

167 :
>>165
Dockerのalpine、debianなど、ほぼすべてのイメージでことごとく動かないから。
shで十分なのに、PowerShellなんて使いませんよw

168 :
>>165
linux のコマンド群が使えないから

169 :
ソースコードをダウンロードしてビルドしようとしたら…
ERROR: You must either be root or be able to use sudo
ビルドするのに root になれって? この時点で話にならないよ。

170 :
>>169
それってパワーシェルの話?

171 :
そのメッセージでググっても、インストール時のメッセージしか見つからないね
https://www.google.com/search?q=%22ERROR%3A+You+must+either+be+root+or+be+able+to+use+sudo%22

ビルドしようとしたら出たって言うから、
別の話か、嘘つきでは?w

172 :
>>169
エラーメッセージには「sudo を使え」と書いてあるが

173 :
とりあえず適当なことを言ってPowerShellを
貶めたかったんだろ?バレて逆効果になってるがw

174 :
grep 等の外部コマンド?を使わずに任意の文字列の最初に見つかる3桁の数字を得る方法があれば教えて下さい
(例えば、abc_4_de_99_fgh_ijklm_no_567_2_123_pqrst_uvwx_yz だと567)

175 :
bashなら=~と、$BASH_REMATCH使えばできるんじゃね

176 :
>>174
おまえは俺かw
似たようなことをやったよ。grepで(笑)
外部コマンドを使わないなら、こうなるから面倒くさいんだよな。
できるけど面倒くさい。だから遅いけどgrepにした。
v=abc_4_de_99_fgh_ijklm_no_567_2_123_pqrst_uvwx_yz
v=${v#"${v%%[0-9][0-9][0-9]*}"}
v=${v%"${v#[0-9][0-9][0-9]}"}

177 :
シェルスクリプトだと(bash依存は知らん)
マッチした部分を含めて削除はできるけど
マッチした部分を残したその他を削除が簡単にできないんだよね。
だから「マッチした部分を含めて削除」したら残りが
「マッチしなかった部分」になるのを利用して、
改めて全体から「マッチしなかった部分」を取り除くというのを前後でやればできる。

178 :
ありがとうございます
面倒でも前後から不要部分を取り除くしかないのですね

179 :
「マッチした部分を含めて削除」ってどうやるの?

180 :
>>179
${v%%[0-9][0-9][0-9]*} ってかいてあるやん

abc_4_de_99_fgh_ijklm_no_567_2_123_pqrst_uvwx_yz ・・・(1)

↓ ${v%%[0-9][0-9][0-9]*}

abc_4_de_99_fgh_ijklm_no_ ・・・(2)

↓ (1)ー(2)

567_2_123_pqrst_uvwx_yz ・・・(A)

↓ ${v%"${v#[0-9][0-9][0-9]}"}

_2_123_pqrst_uvwx_yz ・・・(B)

↓ (A)ー(B)

567

181 :
>>180
丁寧にありがとう!

182 :
今更だが>>180

× ${v%"${v#[0-9][0-9][0-9]}"}
○ ${v#[0-9][0-9][0-9]}"

だな

183 :
それらをPowerShellで書くとどうなるか?
一度でも考えてみたことはありますか?

184 :
PowerShellで書くとLinuxで動かすのが大変になります。

185 :
5年くらいするとセキュリティパッチが出なくなって使用禁止になるから
また作り直しになるんだろうどうせ。

186 :
例えば中身が
3,soba,inarizusi,hishimoti,ushioziru ...
のcsvファイルなら最初の数字が3なので以下の文字列の3番目をつないで soBa inArizusi hiShimoti usHioziru ... でbash ... というように
csvファイルの最初の値で以降の処理が変わる場合はどうすればいいでしょうか?
一度ファイルを最後まで空読みすれば簡単なのですが、読み込みは1度で終わらせたいです。

187 :
宿題は自分でやりなよ

188 :
>>186
なんでそんな分かりづらい説明するんだ?

189 :
全く意味がわからん。
誰か翻訳してくれ

190 :
>>186
引数で単語と数字nを受け取ってn文字目の単語を返す関数を書けばいいだけ

191 :
>>190
日本語ではなくてbashでお願いします!!

192 :
>>189
結果だけ見たら
入力テキストをカンマで区切って
最初の数値を取得 ⇒ nとする
残りの文字列のn番目の文字をアッパーケースに変換して空白区切りで連結する
かな
俺ならテキストが小さいならBashで一気に読んで処理すればいいと思うしでかいならPythonとかで処理する

193 :
> 俺ならテキストが小さいならBashで一気に読んで処理すればいいと思うしでかいならPythonとかで処理する
これはなんで? 小さいとかの境目はどれくらい?

194 :
そんなこと聞いてくるようではセンスがないよ
センスがない奴にいくら説明しても無駄

195 :
pythonだと単語のn文字目を取り出すなんて朝飯前だしな
関数書く手間が一つ省ける

196 :
疑問になった点は「テキストが小さいなら」です。
その他の話は聞いてません。

197 :
> pythonだと単語のn文字目を取り出すなんて朝飯前だしな
単語の3文字目(オフセット2から1文字)を取り出す
echo "${str:2:1}"
Pythonだとどう朝飯前なんですか?

198 :
早く答えのスクリプトを書いてください!!
遅いですよ!!

199 :
>>196
個人的には今どきなら1MB以下なら小さい1GB以上ならでかい
その間ならケースバイケース
PCの性能やメモリ容量とかと相談

200 :
>>186
> 一度ファイルを最後まで空読みすれば
これはどういうスクリプトなの?

201 :
>>199
1MBってことは、1行256バイトとして4096行以下なら小さいってことですね。
10MBで約4万行、100MBで約40万行、1GBで400万行
昔のExcelの制限が1シート65000行だったことを考えると
エクセルで扱えるデータなら問題なさそうですね

202 :
アスペかよw
アスペならちゃんと改行コードも数えるんだぞ?

203 :
>>202
お前なんのためにレスしたの?
>>201が言ってることは正しいし、お前の主張は何も含まれていない。
ただ、レスしただけ

204 :
185です。説明不足ですみません。
やりたいことは1行目を読み取り、2行目以降はそのままwhileループで最後まで読みたいのです。
ただそのためだけにフラグを使うのもなんだかなぁと。

205 :
わざわざ空読みする理由が分かんねえ
今出来てる状態のスクリプト貼って何がうまく行かないのか説明してみ

206 :
#!/bin/sh
お願いします

207 :
>>206
そこまでは上手く書けてる
その調子で頑張れ

208 :
>>191
今日一番ワロタ
キミもbashで質問しなよ

209 :
bash は重複しない4文字である。つまり2bitのデータと考えられる
日本語を1文字16bitのデータと考えると、
1文字をbashの4文字×8組=32個のデータで表現できる
つまりbashで質問すると32倍のデータが必要になる
1レスに2048バイト、1024文字を書き込めるから32文字の質問であれば
bashで質問することは可能

210 :
向いてないんだろ
こういうの

211 :
>>209
> 1文字をbashの4文字×8組=32個のデータで表現できる

この行から間違えてるだろ

212 :
>>200
こいうんじゃね?

というのを期待してた?残念w

213 :
>>212
while IFS=, read は思いつくけど
最後まで空読みってどんな処理なのか気になっただけ

214 :
>>197
>>> str = "foobarbaz"
>>> print(str[3])
b
python3は重いかわりに色々便利なのが定義されてる

215 :
未経験から半年でフリーエンジニアになれる人の特徴
https://www.youtube.com/watch?v=YCxu0jn52Qw
フリーランスか会社員かどっちが簡単かについての最終回答
https://www.youtube.com/watch?v=JA4JNSmIdxI
【エンジニア】正社員/派遣社員/フリーランスのメリット・デメリットについて
https://www.youtube.com/watch?v=fTG-eMpwhCg
月収1000万円オンラインサロンオーナーの日常【飲み過ぎ】
https://www.youtube.com/watch?v=lPfWZLatYus&t=107s
借金400万円から人生逆転するまでの軌跡
https://www.youtube.com/watch?v=fXdHlFFUjGY
エンジニアはお金を追求してはいけないという年寄りを論破してみた
https://www.youtube.com/watch?v=qJHCmxFv718
プログラミングスクールを否定する老害どもについて
https://www.youtube.com/watch?v=K2SN-Rr0PgY&t=506s
新人叩きしてる古参勢がすぐ儲からなくなる理由
https://www.youtube.com/watch?v=Ch9Ir8O-iqU&t=332s

216 :
タブで字下げされてるテキストファイルの中にある
_TAG("S.T.A.R.T") が含まれる行と
_TAG("E.N.D") が含まれる行との間にある行数を数えるにはどうすればいいでしょうか

217 :
...... | sed -n '/_TAG("S.T.A.R.T")/,/_TAG("E.N.D")/p' | wc -l
こんな感じ

218 :
さんくす
sedやwcなどの外部コマンド?を使わない方法はありますか?

219 :
宿題は自分でやろう

220 :
>>218
そういうことするなら
perl5に行きなよ
普通はそれも最初から入ってて、文字処理に強い言語だから
---
そんな処理だと、その処理の前に
タグがネストしてたり、正しく対になっているのか調べれた方が安全
おみあげに類似したコードあげる
https://ideone.com/XCz8Ou
対が壊れてたら -1 を
壊れてないならネストの最大の深さを返す

221 :
>>220
ダクネスが居たように見えた

222 :
>>216
問題の意図が明確
その _TAG("S.T.A.R.T") とかは字下げされているのかどうなのか
_TAG("S.T.A.R.T") が含まれてると言うが、
一行 は _TAG("S.T.A.R.T") だけではないのか?
echo ' _TAG("S.T.A.R.T")' なんかも考慮する必要あるのか?
俺だったら一行まるまる、_TAG("S.T.A.R.T") だけにするがな
その方がパースしやすいので

223 :
あと _TAG("S.T.A.R.T") は複数あるのか?という質問も追加
ネストされている場合は考慮するのか?とか

224 :
まあいずれにしろテキストファイルは read で読み込めるんだから
こんな感じになるだろうが
while IFS= read -r line; do
 case $line in
  '_TAG("S.T.A.R.T")') なんとか ;;
  '_TAG("E.N.D")') かんとか ;;
 esac
 if 条件; then
  count=$((count + 1))
 fi
done < テキストファイル

225 :
>>220みたいにそういう場合だったら Perl にとかいうやつがいるけど
シェルスクリプトで同等のコードを書いても大差ないんだけどなw

226 :
sedやwc使うなとかいう制約も謎だわ
言語やツールが何であれ結局裏で似たようなライブラリの関数呼び出すのに

227 :
理由がわからないなら普通に聞けばいいだけなのに。
自分が知らないだけなのに、なんでそんなことありえない、
あってたまるかみたいな書き込みをするんだろうねw

228 :
理由がわからないんじゃなくて、そんなことを言い出す人間が理解できないって話だよ
こだわりがあるならこんなところで人に聞くんじゃないよって話で

229 :
自分とは違う方針の質問は受け付けない
そんなレスはこてんぱんにしてやる。ですか?

230 :
自分の期待とは違う方針の回答は受け付けない
そんなスレはこてんぱんにしてやる。じゃないの?

231 :
>>229
スレの流れ見たけど受け付けられてるじゃん
宿題を済ませたいのか知らないが
人に聞くくらいなら針路変更したらどう?
知り合いにコンピューターの勉強してた人居るけど
大学で課題をすべて友人からパクってたそうだ
今その人バイトで食いつないでる
ITの仕事できたら低くても年収400万は行ったろうにね

232 :
>>231
知り合いの人は大学をやめて会社を起こして金持ちになったよ。
お前が何をいいたいのか知らんが

233 :
>>230
さんくすとお礼を言った上に、条件をつけ忘れてたから
補足しただけでしょ
たったそれだけで、はぁ?理解できない。謎だわ。なんでそんな事するの?バカなの?
みたいに言うのはなんで?

234 :
>>232
知り合いは宝くじ当たったよ
中卒、高卒、大卒の平均年収見てみ

235 :
問題を解決できないやつは
学歴がなんでも大成しないな

236 :
2chは口が悪いやつが多いけど
ここ見てると分かるように無償で相手してくれるやつがいるんだな
現実はどうだろう
そんなことないよ
社会に出れば分かるがフリーライダーは受け入れられない
街角でスケッチブックに助けてくださいって掲げるのか?
そんなの通報されて終わるよ
SNSなら答えてくれるって?
フォロワーも居ない人の相手なんて誰もしない
要するに2chしか質問する先がないんだ

237 :
>>233
何で逆切れするの?
仕事は自分でしましょう

238 :
>>233
>>229があなたの書き込みなら
あなたが煽っただけでしょう
そして>>229があなたではないなら
なぜそんな反応するのか分からない

239 :
課題か仕事か知らんが問題を片付けてくれたのになぜ素直になれないんだろうか
仕事だったら出来上がらないから検収されずに報酬もらえないぞ

240 :
JavaHouseってのがあって明らかに仕事に関係するであろう質問してた輩に
運営者の人がそれ幾らなのって聞いてたな
聞いた本人は無料ですってなんか意味の分からんこと言ってたが

241 :
>>234
宝くじワロタ

242 :
>>232
それは単にその人が優秀だっただけ

243 :
課題をこなせず大学をやめて成功したって丸投げ派遣会社でも設立したんか

244 :
>>242
人の話がシェルスクリプトと何の関係があるのという話だ
人の話をし始めたやつにいえな

245 :
宿題は自分でやりましょうってことだけじゃ

246 :
>>245
全ての質問に対してそういう回答をしてるなら何も言わんよ

247 :
>>232
まあ今どきの日本人はだいたいビル・ゲイツは知り合いだからなw

248 :
>>246
でたでたw
なぞの平等理論w
あいつだけずるいとかいう妬みで周りが見えなくなってるんだろうなあ

249 :
自分なら質問者が
「今こうやってるけどもっと効率のいい方法ない?」
とか聞いてきたら答えてあげたくなる
一度答えてそーじゃねーよとか言われたら・・・w

250 :
一度答えてそーじゃねーよと言われたら?
↓これみて「そーじゃねーよ」言われたと思っちゃったの?

215 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2020/04/11(土) 11:20:47.30
...... | sed -n '/_TAG("S.T.A.R.T")/,/_TAG("E.N.D")/p' | wc -l
こんな感じ

216 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2020/04/12(日) 07:36:15.54
さんくす
sedやwcなどの外部コマンド?を使わない方法はありますか?

251 :
沸点が低いんだろうなぁ。
少しでもなにか言われたら、親を侮辱されたかのように感じるんだろうな

252 :
なんとなく答える前に
sedやwcなどの外部コマンド?を使わない方法はありますか?
と書いても、同じようにキレていそうな気がするなw

253 :
3連投かよw
そんなに悔しかったのかよw

254 :
レスしただけでこの反応w 矛先をずらしているのもありがちだなぁw

255 :
>>222-223
その _TAG("S.T.A.R.T") とかも字下げされてます
echo ' _TAG("S.T.A.R.T")' なんかも考慮する必要はありません
_TAG("S.T.A.R.T") は複数ありません
ネストもありません

>>224
可能ならman bashで出る内容だけで解決したいです。

_TAG("S.T.A.R.T")や_TAG("E.N.D")の前後にも行はあるので、わかりやすく
_TAG("S.T.A.R.T")なんとか
  count=$((count + 1))
_TAG("E.N.D")かんとか
ならベストなのですが。

256 :
>>255
while文で1行ずつ読んでSTART見つけたところからカウントしていってENDが見つかったら終了すりゃいいだけじゃないの
自分でどこまで作ったの?

257 :
>>256
もういいから早くスクリプト作れって言ってんだよ

258 :
>>257
なら今からman bash読むわ
ちょっと量が多いから1週間待ってな
忘れるといかんからまたその頃に催促してくれ

259 :
>>257
おまえ志賀だろ
あわしろさんに謝れ

260 :
>>255の後半からはawkのセンスありと見た

261 :
自分で man 読んで自分で出来るようになる方が自分にとって有益だと思うんだが…

262 :
awkでやればできるよ!・・・全部BEGIN
これ萎えるw

263 :
フレッシュなニンニクジュースを飲めばコロナの菌が死滅する

264 :
この板の住民なら生ニンニクで腸内細菌死滅して病院送りになるのは知ってそう

265 :
言うほどUNIXやシェルスクリプトってコロナ菌に関係あるか?

266 :
[ と [[ の違いなんかも理解できてないままflgやcontinueを使って書いてみました。
_TAG("S.T.A.R.T")の後でもループの度にflgをチェックするのが無駄なので
_TAG("S.T.A.R.T")を探すループと_TAG("E.N.D")まで行数を数えるループを完全に分けてflgを無くしスッキリ出来たらいいのですが。
declare -i i=0
declare -i flg=0
for f in `cat $INPUT_FILE`
do
if [ $flg == 0 ]; then
if [[ "$f" =~ \t*'_TAG("S.T.A.R.T")' ]]; then
flg=1
else
continue
fi
else
if [[ "$f" =~ \t*'_TAG("E.N.D")' ]]; then
echo 行数は $i
exit 0
else
i=$i+1
fi
fi
done

267 :
>>266
> ループを完全に分けてflgを無くしスッキリ出来たらいいのですが。

まず for f in `cat $INPUT_FILE`を使うのはやめよう
シェルスクリプトでテキストファイルを読むならwhile + read を使う
そしてread は read してから read すると次の行を read する(当たり前だw)

268 :
一応それらしいのを書いてみました。
exitがあるのと、whileループの前と中にreadがあるのがちょっと不満です。
後チェックができるように do; read; while という使い方ができればいいのですが。

declare -i i=0
while : ; do
read f <- 不要かも

while [[ !("$f" =~ \t*'_TAG("S.T.A.R.T")') ]]; do
read f
done

read f
while [[ !("$f" =~ \t*'_TAG("E.N.D")') ]]; do
i=$i+1
read f
done
echo 行数は $i
exit
done < $INPUT_FILE

269 :
そもそも done < $INPUT_FILE とか書く必要ない
script.sh < $INPUT_FILE とやればいいんだよ
その方が柔軟性が高くなる
そうすりゃスクリプトは中身だけで良くなる。endはいらない。
そして while read do にも置き換えられるやろ?
read f <- 不要かも
while [[ !("$f" =~ \t*'_TAG("S.T.A.R.T")') ]]; do
 read f
done
read f
while [[ !("$f" =~ \t*'_TAG("E.N.D")') ]]; do
i=$i+1
read f
done
echo 行数は $i

270 :
× endはいらない。
○ exitはいらない。

271 :
後出しっぽくてすみません。
$INPUT_FILE は_TAG("S.T.A.R.T")や_TAG("E.N.D")と同じく固定名なので汎用性は不要なんです。
それにこの部分はscriptの一部で本体には引数があるため毎回script.sh 引数 < $INPUT_FILE とやるのはちょっと...
といって、このためだけに分割するのも...

272 :2020/04/26
じゃあ
{
なかみ
} < "$INPUT_FILE"
とかすればいい

machはマッハって読んだほうがカッコイイだろ!
BeckyをUNIXに移植しろ!mail,mewはゴミ以下
☆ 古いPCを復活させよう
無職・煙草・UNIX
IRIX 教えてスレッドその 1
☆☆minix☆☆
zsh その7
統合監視ツールどうよ?
Putty その3 【パティ】
【Debian】 Nexenta OS 【OpenSolaris】
--------------------
【sage】tvk第2577開放区【マターリ】
【名古屋】東海地方のバイク乗り82【愛知岐阜三重】
【完全】〜ジオン独立戦争記〜【攻略】 15
【京アニ放火】青葉真司容疑者(41)「もう失うものはねぇから!」
【いつだって】田中光太郎【帽子は愛用】
無地のキューがいい
【悲報】宮本佳林ちゃんさんソロライブZeppなんば大阪がオールスタンディングではなく椅子出しだった件
au SH001 by SHARP Part6
【ST】第17回言語聴覚士国家試験
【プシュー】 コンプレッサー総合スレ9 【ボン!】
【バーチャルYoutuber】にじさんじ有ンチスレ11376【れなおばのスカトロプレイ】
最強の組み合わせ
有線LANの匠6 〜配線方法の工夫〜
「Windows 8」が iPad を完全にパクり大勝利な件
☆☆☆☆ 手作りパスタ ☆☆☆☆
くるみめもり 2
【M.M.C 三本コーヒー】
電動リール 11
実況 ◆ テレビ朝日 59306 春のうがい手洗い励行まつり
長野県の文房具店
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼