2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

Bashでプログラミング

1 :ピラフ:2015/10/04(日) 00:11:42.24 ID:KQhWWZXy.net
Bash - GNU Project - Free Software Foundation
https://www.gnu.org/software/bash/

2 :ピラフ:2015/10/04(日) 00:17:45.41 ID:KQhWWZXy.net
bashはUnixシェルです。
bashを使ったシェルスクリプティングテクニックや
プログラミングについて和気あいあいとそしてほのぼのと語り合いたいと
思ってこのスレを建てました。よろしくお願いいたします。

3 :login:Penguin:2015/10/04(日) 02:17:29.14 ID:B+hGdmlE.net
シェルスクリプトクソめんどくせぇ。
どこでも動くように作る必要があるものだから
仕方なく作ってるけど、パスにスペースが入ったらとか、
くそめんどくせぇ

4 :login:Penguin:2015/10/04(日) 03:41:56.50 ID:2ljDEtpK.net
もうスクリプトはpythonでよくね?
Bashが動くような環境ならpythonがほぼ間違いなく動くから、制限だらけのBashで書く理由が思いつかない。

5 :ピラフ:2015/10/04(日) 03:50:20.09 ID:KQhWWZXy.net
>>3
ピラフも昔はシェル間の互換性とかに気を配ってたよね。
でもある日悟ったんだよね、超めんどくせえと。
それ以来bashで動けばなんでも良いって思うようになった。
パスにスペースが入ることにも目をつぶるようになった。めでたしめでたし。

6 :ピラフ:2015/10/04(日) 03:54:46.40 ID:KQhWWZXy.net
>>4
pythonいいよねpython。
一貫性があってシンプルでわかりやすい。
黒魔術perlとは違うよね。
コマンドを実行するだけとか、他のプログラムをキックするだけとか
そういうのだったらシェルスクリプトでいいんだけど、構造化が
必要なほどのプログラムになるときつい。

7 :ピラフ:2015/10/04(日) 03:57:02.21 ID:KQhWWZXy.net
ノウハウが好きな人にはbashはたまらないと思うんだよね
垂涎ものだよ、たとえバッドでも。バッドでも!

8 :login:Penguin:2015/10/04(日) 04:03:08.09 ID:B+hGdmlE.net
パスにスペースが入ってるとパスが引数として解釈されたり、
最悪の場合、脆弱性につながりそうで怖いんだが。

9 :login:Penguin:2015/10/04(日) 04:07:46.40 ID:B+hGdmlE.net
>>7
> たとえバッドでも。バッドでも!

[ コマンドの存在が、一番のバッドだけどなw

10 :ピラフ:2015/10/04(日) 04:17:59.52 ID:KQhWWZXy.net
>>8
わかる。-とかもだよね。これオプションじゃないのよー!みたいな。
シェルを広く公開するならそういうのにも対応しといたがいいのだろうけど、
内輪で使うならまあないっしょ大丈夫っしょ問題ないっしょ!と念じて目をつぶって地蔵の
ふりをするのもありだと思うよ。

11 :ピラフ:2015/10/04(日) 04:18:35.71 ID:KQhWWZXy.net
>>9
マジで!?ピラフそのコマンド使ったことない。ちょっと調べてみる。

12 :login:Penguin:2015/10/04(日) 04:21:31.28 ID:B+hGdmlE.net
> そのコマンド使ったことない。

ナイスジョーク

13 :ピラフ:2015/10/04(日) 04:23:19.15 ID:KQhWWZXy.net
[はtestコマンドだったのか。てっきりbashのsyntaxだとばかり思ってた。

14 :ピラフ:2015/10/04(日) 04:25:01.42 ID:KQhWWZXy.net
>>12
播(゚∀゚d)ォゥィェ!!

15 :login:Penguin:2015/10/04(日) 04:28:26.27 ID:B+hGdmlE.net
[ "$var" = "test" ]

意味

コマンド名 ・・・ [
第一引数 ・・・ "$var"
第二引数 ・・・ =
第三引数 ・・・ "test"
第四引数 ・・・ ]

考えてみよう!

[ "$var" = "test"] なぜ "test" と ] の間のスペースをなくすとエラーになるのか?
[ $var = "test" ] なぜ 変数名を "" で括るのが一般的なのか?

16 :ピラフ:2015/10/04(日) 04:34:56.30 ID:KQhWWZXy.net
>>15
おもしろい、考えてみる!

17 :login:Penguin:2015/10/04(日) 04:44:01.35 ID:B+hGdmlE.net
なぜ他の言語のように

if [$var="test] then
fi

とシンプルにかけないのか?

[ コマンドを考えついた奴は、俺頭いい!って思っちゃったんだろうな。
そのせいでシェルスクリプトの構文を改善する機会がなくなった。

シェルスクリプトは変数への代入はできるが変数の参照はできない。
できるのは変数の中身の文字列展開だけ。

それがパスにスペースが有る場合の問題にまで影響してるのさ。

くっそ言語、くっそ言語、

18 :login:Penguin:2015/10/04(日) 05:08:00.09 ID:Fdr2poSK.net
しょーもないことをドヤ顔で語ってるな

19 :login:Penguin:2015/10/04(日) 05:14:24.14 ID:B+hGdmlE.net
>>18
このスレに書き込まずにはいられなかったんなら
お前も参加しろよw

20 :ピラフ:2015/10/04(日) 05:33:56.23 ID:KQhWWZXy.net
>>18
みんなでここをいいドヤ顔スレにしよう(提案(前向き(全力(社畜

21 :login:Penguin:2015/10/04(日) 11:26:14.16 ID:q4z/9k1Q.net
どうしてピラフはわざわざ、プログラム板から、
Linux板にまで出てきたのですか?


皆で、オブジェクト指向のPowerShellへ、移行しませう。
他には、VBScript, JScript もあるし

.NETの世界は、極楽ですぜw

22 :login:Penguin:2015/10/04(日) 12:27:39.97 ID:O5AlniCT.net
これがあるんだからスレ立てるじゃねえの糞が

シェルスクリプト総合 その25(c)2ch.net
http://peace.2ch.net/test/read.cgi/unix/1439563321/

23 :ピラフ:2015/10/04(日) 13:01:31.07 ID:KQhWWZXy.net
>>22
糞じゃない、ピラフだ。
UnixってFreeBSDとかそういうのじゃないの?
ピラフLinux使ってるの。だからスレ建てたの。許して。

24 :ピラフ:2015/10/04(日) 13:09:32.23 ID:KQhWWZXy.net
>>21
VBScriptはピラフが一番好きなプログラム言語だよ。
いいよねーあれ。Linuxでも使えたら良いのにって毎日思ってるよ。
Linux環境で動く.NET Coreが発表されて.NETはますます勢いを増しそうだよね。
PowerShellと.NET Coreはピラフも興味を持っています。今後ともよろしくお願いいたします。

25 :ピラフ:2015/10/04(日) 20:31:29.91 ID:KQhWWZXy.net
ピラフさあ、困ってることがあって
標準出力と標準エラー出力を同じファイルに書き出して、
かつ、標準エラー出力のみを画面に出力したいんだよね。
そのやり方がどうしてもわからなくて教えて欲しいんです。
教えてください、おねがいします。

26 :login:Penguin:2015/10/04(日) 22:30:31.51 ID:cHujBtP3.net
SNSじゃねぇんだから、>>22のスレに移動しろよ。

27 :ピラフ:2015/10/04(日) 22:47:52.26 ID:KQhWWZXy.net
>>26
>>22はUnix板だよ。
アメリカの議会で税金を話し合ってるときに
中国の税金はどうとか言うのは場違いだよね。
ピラフはUnix使ってないし。ここがSNSじゃないとも思ってないし。
>>22には移動しないし。

28 :login:Penguin:2015/10/04(日) 22:52:50.99 ID:mhzx8YQK.net
おのれは誰やねん

29 :ピラフ:2015/10/04(日) 23:11:54.27 ID:KQhWWZXy.net
>>28
お前が誰だ。なんだペンギンて。なめてんのか。

30 :login:Penguin:2015/10/04(日) 23:31:51.40 ID:jHPuSLta.net
vipq2が高ければこのスレ落とすんだけどなぁ
無念

31 :ピラフ:2015/10/04(日) 23:33:29.89 ID:KQhWWZXy.net
>>30
どうしてそんな酷いことするの?
ピラフのこと嫌いなの?

32 :login:Penguin:2015/10/05(月) 00:13:36.93 ID:krlerkMH.net
ピラフは旨い

33 :login:Penguin:2015/10/05(月) 02:41:11.48 ID:n5ifdXzm.net
>>25
tee を使えば、画面とファイルに、同時に出力できる

34 :login:Penguin:2015/10/05(月) 05:22:02.33 ID:krlerkMH.net
teeコマンドとはpeeという単語をもじって作られた単語

peeとはおしっこ(をする)という意味で
(ファイルに書きだしたものが画面に)漏れる
という所から来ている。

35 :login:Penguin:2015/10/05(月) 11:09:28.44 ID:Msv6SUAn.net
>>3
"C:\Program Files" とかくくるだけやん

>>17
変数の参照ってどういう意味だ?

>>24
VBSやPowerShellは1GBくらいの巨大なテキストのログを
調べようとしたら、1GBのオブジェクト作ってメモリ関係のエラーが出て
ワロタよ

Unixの小さいメモリで動くコマンドをパイプでつなげる方がいいわ
DOS・NTコマンドもUnix思想だから、PowerShellやVBSをあきらめて
NTコマンドをパイプでつないでなんとか解決したけどさ。

いちいちオブジェクト作るとか大げさだわ

36 :login:Penguin:2015/10/05(月) 14:53:21.42 ID:DDfYGEKk.net
>>33
やろうとしたいことちゃんと読んだ?
( echo 1; echo 2>&2; echo 3>1; echo 4>&2)
みたいなコマンドから

1
2
3
4

の出力と

1
3

の出力を分離したいって意味だと思ったんだが

37 :login:Penguin:2015/10/05(月) 20:15:00.17 ID:RFzaXW3t.net
>>36
cronで頑張るわけでも無いだろうし、管理出来ていないものを無理くりやって保守できなくなる未来しか見えない。筋が悪いのでアホでも管理できるよう、KISSがいいね。

38 :login:Penguin:2015/10/05(月) 20:21:23.73 ID:qJa6tBSz.net
bashを極めたいんだがなんかいいサイトないか?

39 :login:Penguin:2015/10/05(月) 21:09:18.28 ID:krlerkMH.net
>>38
http://www.amazon.co.jp/b?node=2221117051

40 :ピラフ:2015/10/05(月) 21:12:28.00 ID:GG5PCVx7.net
>>39
         ____
        /      \
       /  ─    ─\
     /    ⌒  ⌒  \     ハハッ超ワロス 笑い死ぬわ
     |       ,ノ(、_, )ヽ    |
      \      トェェェイ   /
       /   _ ヽニソ,  く

41 :ピラフ:2015/10/05(月) 21:13:23.82 ID:GG5PCVx7.net
>>34
変態

42 :ピラフ:2015/10/05(月) 21:15:32.04 ID:GG5PCVx7.net
>>33
teeって標準出力を受け取るじゃん。
標準エラー出力のみを画面に出力するとともに
標準出力と標準エラー出力を同じファイルに出力したい。
とても難しい。とてもわからない。とても教えてほしい。

>>36
そうなんよ。わからないんよ。教えてほしいんよ。お願いするんよ。

43 :ピラフ:2015/10/05(月) 21:16:20.27 ID:GG5PCVx7.net
>>37
ヽ(○´ε`○)ノぶちゅ

44 :ピラフ:2015/10/05(月) 21:17:45.51 ID:GG5PCVx7.net
>>35
んなアホな。VBScriptはできる子だよ。ピラフが証明してみせるよ。

45 :login:Penguin:2015/10/06(火) 00:31:46.32 ID:F1F9KS5h.net
% cat test.sh
( echo 1; echo 2 >&2; echo 3; echo 4 >&2 )

% : > log; stdbuf -oL -eL bash test.sh 2>>log | tee -a log
1
3

% cat log
2
1
3
4

stdout と stderr との同期とれてないのが、、うーん

46 :login:Penguin:2015/10/06(火) 04:37:35.92 ID:RPZPhUvj.net
標準出力はバッファリングされて、
ある程度データがたまってから出力されるが、

標準エラーは重要度が高いため、
バッファリングされずに、即画面に出力される

>>3
ファイル名には、半角英数字と「_」アンダーバーだけを、
使った方がよい。外人の作るアプリでは、
日本語などは考慮されていないことが多いから

Mac用に、PowerShellでファイル名の、
半角スペースをアンダーバーに変換する、
プログラムを書いたりした

47 :login:Penguin:2015/10/06(火) 04:44:46.72 ID:NURn7XIT.net
>>46
> 外人の作るアプリでは、
> 日本語などは考慮されていないことが多いから

えっとな、俺日本人。
今は俺(=日本人)が作るアプリの話してる。

48 :login:Penguin:2015/10/06(火) 04:47:28.04 ID:NURn7XIT.net
それからスペースは日本語じゃない。

半角英数字と「_」アンダーバーだけを使った方がよい理由が、
日本語を考慮してないからというのは、理屈がおかしい

49 :login:Penguin:2015/10/06(火) 12:44:40.38 ID:4T4D9m2w.net
>>43
簡単なものは簡単なままにしておけクソ野郎

50 :login:Penguin:2015/10/06(火) 12:55:28.62 ID:IpqxO3tA.net
bashは何日でマスターできる?

51 :login:Penguin:2015/10/07(水) 07:32:29.79 ID:GQwM5Yjq.net
UNIX シェルスクリプト・コマンドブック 第3版
山下哲典、2015

Software Design 2014/1
にも、シェルの特集が40ページ分、載っている

まあ、1〜2週間あれば、そこそこ出来る

ただ、exportを付けないシェル変数は、
同一プロセス内でのみ有効で、
下記のサブシェルのような、別のプロセスには引き継がれない

` ` または、$( ) によるコマンド置換
( ) によるグルーピング
パイプ・リダイレクト

シェル変数を、別のスクリプトでも使いたいのなら、
. または、source コマンドで、
スクリプトをカレントシェル上に呼び出すと、
同一プロセス内での実行となる

sh スクリプト名 → 別のプロセス(子プロセス)
. スクリプト名 → 同一プロセス

52 :login:Penguin:2015/10/07(水) 10:29:19.64 ID:M6NB5j5s.net
シュエルスクリプトの関数にするか、
それとも外部プログラムにするか、
どっちがいい?

53 :login:Penguin:2015/10/07(水) 12:55:15.05 ID:8ottO0ep.net
>>52
動くならどっちでもいい。直感的にわかりやすい。コードの見通しが良くなる方が望ましい。

54 :login:Penguin:2015/10/07(水) 19:58:15.15 ID:RV6ZvwXQ.net
GTK+のプログラミングマスターした人いる?
紙資料で3.5cmの厚みなんだ。
為になるよ。

55 :login:Penguin:2015/10/08(木) 09:11:47.18 ID:WEInxm9o.net
>>27
bashはOSに依存しないし、該当スレはbashなりzshなり使用するシェルをきちんと申告すれば対応してくれる
それ以上に理由がない限りスレを立てる意味がない

56 :login:Penguin:2015/10/08(木) 20:48:47.87 ID:lgr3Fqt0.net
なぜbashなのに拡張子を.shにするのか

57 :login:Penguin:2015/10/08(木) 22:09:59.71 ID:zqGOFpq7.net
拡張子は飾りです
お好きなようにどうぞ

58 :ピラフ:2015/10/08(木) 22:25:19.94 ID:HskmnVPN.net
>>55
UNIX板はUNIXに依存してるでしょうが。
女性専用の老人ホームに若くてピチピチの可愛いギャルが
入居するようなものだよ。女に変わりはないだろうけども
不適切だよね。老人じゃないし、可愛いし、ピチピチだし。
場を弁えるってそういうことだと思う。若い人が新たにコミュニティを作る
ことには意味があると思うし、ピラフは梯子(テコ)でも動かない!

59 :login:Penguin:2015/10/08(木) 23:29:11.08 ID:UuNzaExB.net
というスピリッツで単発スレ立てする人は自分が満足すると埋め立ての責任を持たず放置する傾向にあるんだよな。
ちゃんと1000まで話題を提供してくれるの?(´・ω・`)

60 :ピラフ:2015/10/08(木) 23:40:22.73 ID:HskmnVPN.net
>>59
みんなでここを良いスレにしようよ。
ピラフだけでは無理。みんなで力を合わせようよ。

61 :ピラフ:2015/10/09(金) 02:29:26.94 ID:apuZirFb.net
全員がピラフになれば、ピラフだけでもヤれる

62 :login:Penguin:2015/10/09(金) 23:04:23.52 ID:3VAz+DjZ.net
>>60
あのさ、>>45 に対して礼のひとつも言わないのは人としてまずくない?

63 :login:Penguin:2015/10/14(水) 05:54:07.87 ID:VsqQS5me.net
>>62
表示したいのはエラー出力やし人格否定するほどではないな


$ cat test.sh
#!/bin/sh
echo 1; echo 2 >&2; echo 3; echo 4 >&2

$ ( ./test.sh >> log ) 2>&1 | tee -a log
2
4

$ cat log
1
2
3
4

保証はせーへんけどな

64 :login:Penguin:2015/10/14(水) 06:28:04.34 ID:v4uCjH3b.net
>>62
> あのさ、>>45 に対して礼のひとつも言わないのは人としてまずくない?

ですよね。お礼は三行。常識です。

65 :login:Penguin:2015/10/17(土) 11:28:33.01 ID:tB03pcpd.net
もう>>59が言ってる状態に入りかけてる

66 :login:Penguin:2015/10/22(木) 23:02:24.35 ID:hLzbOUmG.net
☆ 日本の核武装は早急に必須ですわ。☆
総務省の『憲法改正国民投票法』、でググってみてください。
日本国民の皆様方、2016年7月の『第24回 参議院選挙』で、日本人の悲願である
改憲の成就が決まります。皆様方、必ず投票に自ら足を運んでください。お願い致します。

67 :login:Penguin:2015/11/05(木) 02:04:29.11 ID:70mAwyHg.net
bashで30ファイル、計1500行ぐらいの
大作ツール作ったぜw

68 :login:Penguin:2015/11/05(木) 07:56:52.03 ID:y6/bEwWc.net
解説付きうpplz

69 :login:Penguin:2015/11/07(土) 02:29:03.19 ID:M5pvVJO6.net
pythonなら1桁落ちるわけですね?

70 :login:Penguin:2015/11/07(土) 09:27:51.85 ID:XsE55U3y.net
ないわーw

71 :ピラフ ◆9Jro6YFwm650 :2015/11/09(月) 00:31:06.30 ID:uu5Sv9eW.net
>>65
ピラフもうネタ切れだからさ、なんか話題あったら書き込んで。
遠慮しなくていいから。みんなでここをいいスレにしようよ!

72 :ピラフ ◆9Jro6YFwm650 :2015/11/09(月) 00:39:20.01 ID:uu5Sv9eW.net
変数の宣言について
たとえば、こういうプログラムを書いたとき
pilafは9回表示されるかと思いきや3回しか表示されない。
fun_testでfun_mainのiを読み書きしてしまうから。
だから、変数はローカル変数で宣言する必要がある。

#!/bin/bash

fun_test() {
 i=1
 while (( i <= 3 )); do
  echo pilaf
  (( i++ ))
 done
}

fun_main() {
 i=1
 while (( i <= 3 )); do
  fun_test
  (( i++ ))
 done
}

fun_main

73 :login:Penguin:2015/11/09(月) 02:21:06.81 ID:vvdpTyUy.net
以下のコードは何も表示されない。

#!/bin/bash

echo "hello" | while read msg; do
 var=$msg
done

echo $var

74 :login:Penguin:2015/11/09(月) 03:17:18.36 ID:glvAAiJJ.net
パイプを使っているから、
その部分がサブシェル(子プロセス)になっていて、

そこで宣言した変数varが、
カレントシェル(親プロセス)に持ち出せない

どういう解決策があったっけ?
export を付ければよいのか?

>>51
に書いておいた

75 :login:Penguin:2015/11/09(月) 03:34:11.12 ID:sW5M/AJB.net
echo -ne "hello\nworld" | while read msg; do echo $msg ;done

うっかりしてると最後の行を処理し損ねる

76 :login:Penguin:2015/11/09(月) 03:41:31.11 ID:vvdpTyUy.net
こう書き換えるだけでいいよ

while read msg; do
 var=$msg
done < <(echo "hello")

77 :76:2015/11/09(月) 11:14:31.70 ID:9zOZIa4h.net
さて、ではこれはどう表示されるでしょうか?

#!/bin/bash

i=0

while read msg; do
echo "A $msg"
((i+=3))
done < <(while read msg; do
echo "B $msg"
((i+=2))
done < <(echo "hello"))

echo $i

78 :login:Penguin:2015/11/10(火) 09:33:01.23 ID:DpgyD2JB.net
http://pero2.cocolog-nifty.com/

79 :ピラフ ◆9Jro6YFwm650 :2015/11/17(火) 23:05:38.66 ID:cJiBRV26.net
変数の宣言と同時に値を代入を行うと
コマンド置換を使うときにリターンコードを取得できない

fun_getValue() {
 return 1
}

fun_main() {
 declare value=$(fun_getValue)
 echo $?
}

fun_main

上のプログラムは0を出力する

declare value
value=$(fun_getValue)

必然的にこういう形を取ることになる
VBScriptみたい

80 :login:Penguin:2015/11/19(木) 09:42:08.42 ID:Jjkt5i+K.net
間接参照はこうすればいいみたいだけどさ、

var=123
ref="var"
echo "${!ref}" # 123

間接代入はどうすればいいの?
一応evalつかってできたけど、これしかない?

eval "$ref"=456

81 :login:Penguin:2015/11/19(木) 22:36:45.54 ID:3iQoIwnP.net
だまってPHPとかC言語とか使えや。
反論不要。だまって使え。
所詮bashはシェルだよ。
プログラミング言語として使おうとしなくていい。

82 :login:Penguin:2015/11/20(金) 06:03:03.13 ID:oqxoCWjH.net
(まともな)コーディング規約ってないかな?

83 :login:Penguin:2015/11/20(金) 17:45:24.35 ID:UgnIOuo6.net
[[ $a = $b ]]

$a はただの文字列として扱われるが、$b はパターンマッチング処理されることに注意

単なる文字列比較をしたい場合は
[[ $a = "$b" ]] または [[ "$a" = "$b" ]]


なお、[ ] と違って [[ ]] は $a を "" で囲む必要はない。

84 :ピラフ ◆9Jro6YFwm650 :2015/11/23(月) 11:07:28.01 ID:e6CiHMu0.net
>>83
echoもそうだよね。
いい感じのエラーログを出力しようとしたらファイル丸出し。

a="*** ERROR ***"
echo $a

85 :login:Penguin:2015/11/23(月) 12:24:20.91 ID:rfqyRG3i.net
echo には -e という文字列を出力できないという問題があるので
完ぺきを求めるなら、printf "%s\n" "$text" とした方がいい。

なお、echo も printf も それぞれ /bin/echo、/usr/bin/printf という
バイナリがあるが、bash も sh も zsh もシェルビルトイン関数である。

86 :ピラフ ◆9Jro6YFwm650 :2015/11/23(月) 14:03:10.18 ID:e6CiHMu0.net
>>85
マジか!?マジでか!!
echo難儀なコマンドだね

87 :login:Penguin:2015/11/23(月) 17:17:23.97 ID:HMW3Nv9o.net
echo -e \\0055e

88 :login:Penguin:2015/11/23(月) 17:25:37.43 ID:m+EccjTy.net
あー、うん、せやね。

-eだけじゃなくて-nもだめだし-eneもだめ
さて$aに任意の文字が入っている時、それをechoで問題なく出力するにはどうするか?

もちろん、$aに \e[33m のような文字列が入っていることがあるが、
printf "%s\n" $a と同じようにそのまま出力するというのが条件。

とまで書かないといかんよね。

89 :login:Penguin:2015/11/24(火) 10:07:24.30 ID:xf2Nfg3B.net
bashでは知らないけどzshでは
echo e- |rev
とすると表示できたよ。

90 :login:Penguin:2015/11/24(火) 14:55:58.31 ID:jlJmLfSH.net
a="-e"
echo "$a" |rev

zshでも表示されねーじゃねーかwww

91 :login:Penguin:2015/11/24(火) 15:25:38.09 ID:xf2Nfg3B.net
echo $'\0'$a

92 :login:Penguin:2015/11/24(火) 15:35:52.95 ID:xf2Nfg3B.net
いや、その条件ならa='e-'にしてrevするべきだろ。

93 :login:Penguin:2015/11/24(火) 15:38:52.15 ID:jlJmLfSH.net
条件は $a に -e が入っている場合なんですが?

もちろん $a には-e だけじゃなくて、-n や -ene や
e-が入っていることもあります。

94 :login:Penguin:2015/11/24(火) 15:44:01.15 ID:jlJmLfSH.net
>>91

a="ab"

$ echo -n $a | wc -c
2

$ echo -n $'\0'$a | wc -c
3


1文字増えちゃってますよ?

95 :login:Penguin:2015/11/24(火) 15:46:08.87 ID:xf2Nfg3B.net
そんな偉そうに言われてもな。89にたいする90の解答って..

96 :login:Penguin:2015/11/24(火) 15:46:57.54 ID:xf2Nfg3B.net
そりゃ増えるよ。見たまんま増やしてるのだから。

97 :login:Penguin:2015/11/24(火) 16:11:17.98 ID:jlJmLfSH.net
? ネタ回答はいらんって話だよ。

98 :login:Penguin:2015/11/24(火) 23:41:07.34 ID:zPMHS13p.net
Bashでツールを作ったんですけど、ここで紹介するのありですか?
ソースコードはかなりまじめに書いています。
ドキュメントと仕上げでもう少しだけ時間が掛かりそうですけど。

99 :ピラフ ◆9Jro6YFwm650 :2015/11/24(火) 23:51:49.15 ID:uXBTKSJE.net
>>98
      ┓┏
     (^ω^) アリだっ!
   ┌.ゝ .ノ┐
    ┌'、_丿┐
    ┛   ┗

100 :login:Penguin:2015/11/25(水) 00:23:32.51 ID:ndEs85Cz.net
つ 穴を塞ぐ

101 :login:Penguin:2015/11/25(水) 00:43:00.55 ID:cNzVYyHb.net
>>99
じゃあ、終わったら連絡しますね。

102 :login:Penguin:2015/11/25(水) 15:14:14.21 ID:zaXwxH/w.net
>>72
> while (( i <= 3 )); do
>  echo pilaf
>  (( i++ ))
> done

((i++)) 【let i=++】と
((i+=1)) 【let i=i+1】と
i=$((i+1)) は
厳密には違う。

i=0; ((i++)); echo $? => 1
i=0; ((i+=1)); echo $? => 0
i=0; i=$((i+1)); echo $? => 0

i=-1; ((i++)); echo $? => 0
i=-1; ((i+=1)); echo $? => 1
i=-1; i=$((i+1)); echo $? => 0

set -e をしていると、その場で終了してしまうことになる。
計算のみの用途として、安心して使えるのは i=$((i+1)) だ

103 :login:Penguin:2015/11/25(水) 15:20:15.61 ID:zaXwxH/w.net
よく見たらこの例はiが1から始まってるから大丈夫か。

104 :ピラフ ◆9Jro6YFwm650 :2015/11/25(水) 23:57:59.28 ID:qKKURXkV.net
>>102
((φ(・Д´・ *)ホォホォ 勉強になります!!

105 :ピラフ ◆9Jro6YFwm650 :2016/01/01(金) 01:37:32.67 ID:OSOvSqc1.net
       ○
 /⌒\ (__)
 \●/(__)/⌒\
   ∩ (・∀・ )\●/  あけおめ
   Y  ̄ ||y||  ̄`''φ
    Lノ /ニ|| ! ソ >
    乂/ノ ハ ヽー´
    `ー-、__|

106 :ピラフ ◆9Jro6YFwm650 :2016/01/01(金) 01:42:34.66 ID:OSOvSqc1.net
曜日の定数を自動生成しちゃう

for i in $(seq 0 6); do
 date -d "$i days" "+%A %w"
done | sort -k 2 | sed -e "s/ /=/" | sed -e "s/^/readonly /"

107 :ピラフ ◆9Jro6YFwm650 :2016/01/01(金) 01:43:48.83 ID:OSOvSqc1.net
>>106
結果がこれ
readonly Sunday=0
readonly Monday=1
readonly Tuesday=2
readonly Wednesday=3
readonly Thursday=4
readonly Friday=5
readonly Saturday=6

108 :login:Penguin:2016/01/05(火) 14:14:58.50 ID:tOHAFEvw.net
>>107

可読性はタイプ数よりも大切だってことが
よく分かるねw

109 :login:Penguin:2016/01/05(火) 19:46:11.96 ID:btsG67QP.net
bash使うなら曜日名は配列に格納しておいて入ってくる引数を添字として使えばいいんでないの?

110 :login:Penguin:2016/02/06(土) 12:04:35.15 ID:yPG1W7x/.net
PATH の中に空の : があると、カレントディレクトリがコマンドサーチパスに含まれてしまいますが、
環境変数が空であった等の理由により、空の : (ex /usr/local/sbin::/usr/local/bin など)が
パスに含まれてしまうことはよくあります。
カレントディレクトリがコマンドサーチパスに含まれるのはセキュリティーホールになりかねないので、
PATHに空の : が含まれないようにしたいのですが、よい方法はないでしょうか?

111 :login:Penguin:2016/02/06(土) 15:12:52.27 ID:OQYFu5/W.net
よくあるなんてことはない

112 :login:Penguin:2016/02/06(土) 15:34:21.77 ID:ToE+zhkT.net
変数が空なら何も入れないようにすればいいじゃないですか?

113 :login:Penguin:2016/02/06(土) 15:37:43.31 ID:ToE+zhkT.net
そもそもPATHに使われる環境変数が空であることはありえないはずなんだがね。
普通PATHに使われる変数には、定数として決め打ちのパスが代入されているはず。

なぜならば、空が入る可能性があるということは、
空以外の任意の文字列が入るということだろう?
であれば、環境変数に "./" が入ることがあるかもしれないし
"/malware/" という値が入るかもしれない。

カレントディレクトリだけを不正だって意味は無い。

114 :login:Penguin:2016/02/06(土) 17:53:03.07 ID:yPG1W7x/.net
>空であることはありえないはずなんだがね。

そうなんですか、現在の環境じゃインストール後、マニュアル操作で PATH をいじっていないので、
そういうもんだと思っていたのですが、何か問題があるようですね。
どこでそうなってるいるか調べてみます。

115 :110,114:2016/02/06(土) 20:27:21.72 ID:yPG1W7x/.net
わかりました。

<アプリ名>_HOME=<アプリのインストールパス> # この <アプリ名>_HOME は関連ツールから参照される
PATH=$PATH:<アプリ名>_HOME/bin

みたいな記述で、最初の 「<アプリ名>_HOME」 のスペルが間違っていました。
このアプリをすぐ使っていれば気づいたはずですが、インストールした後ほかが忙しくて
ほったらかしにしていたので気づかなかったというオチです。
どうもお騒がせしました。

116 :login:Penguin:2016/02/09(火) 22:51:43.16 ID:1eA4ku59.net
配列の代入(複製)というのはどうやればできるのでしょうか。

117 :login:Penguin:2016/03/08(火) 14:41:04.49 ID:ZfpEki75.net
x='123'
y=`date +%m | sed 's/^0//' `
z= expr $y "*" 1000 + $x
cat k-m | sed 's/PPP/$z/'
で ファイル k-mのPPP値を3123に変えたいのですが
$zではだめです。
どうしたらいいでしょう。

118 :login:Penguin:2016/03/08(火) 14:48:48.74 ID:B0X8XFR+.net
>>117
読むのだるいからさ?
問題ない所までは省いて
問題があるところだけ書けよ

119 :login:Penguin:2016/03/08(火) 15:49:59.75 ID:ZfpEki75.net
すまん

echo 'port=PPP' > test
cat test
x=2
sed 's/PPP/'"$x"'/' test
は問題ない。

長いファイルではダメなのかな?

120 :login:Penguin:2016/03/08(火) 17:54:50.78 ID:B0X8XFR+.net
cat test の意味は?
必要最小限にしないからわからんのよ。
testの中身の文字もさ、限界ギリギリまで減らしてみて

121 :login:Penguin:2016/03/08(火) 17:55:43.82 ID:B0X8XFR+.net
修正

限界ギリギリまで減らした状態での
動く場合 と 動かない場合 の
2つのパターンを書いてみて

122 :login:Penguin:2016/03/10(木) 09:06:25.61 ID:gEv7eiQN.net
k1の内容が
media_dir=/home/foge/Downloads/
network_interface=eth0
port=PPP
serial=6810
で 、シェルクリプトが 
z=55555
sed 's/PPP/'

123 :login:Penguin:2016/03/10(木) 09:49:42.62 ID:gEv7eiQN.net
あれ 尻切れとんぼ
z=5555
sed 's/PPP/'"$z"'/' k1  の時はOK。
x='123'
y=`date +%m | sed 's/^0//' `
z= expr $y "*" 1000 + $x
echo $z
sed 's/PPP/'"$z"'/' k1 はだめ

124 :login:Penguin:2016/03/10(木) 09:57:45.77 ID:1kGddc4A.net
だからね。

動くやつはそれでいいよ。

動かない方、どこまで想定通りに動いているのか?
想定通りに動いているところは省略して、
想定通りに動いていない所だけ書いてって話をしてるんだよ。

125 :login:Penguin:2016/03/10(木) 10:56:36.03 ID:gEv7eiQN.net
了解
echo $z
で確かに$zには想定とおりの値がでてくる。
しかし sed 's/PPP/'"$z"'/' k1 はだめ。
'"$z"' がいけないと思う。 だが 分からない。

126 :login:Penguin:2016/03/10(木) 11:24:11.01 ID:gEv7eiQN.net
きたならしく 一応できた。   ./s4 `./s5` で。
k1 は既出。 minisldaのポートを安全改善のため毎月変えようと思って
cat s4
awk '{sub("PPP", "'$1'" ); print $0;}' k1

cat s5
x='10000'
y=`date +%m | sed 's/^0//' `
z= expr $y "*" 10 + $x
echo $z

127 :login:Penguin:2016/03/10(木) 11:56:18.43 ID:NdYWsqwM.net
それは echo ではなく expr が出力している。

z=`expr $y "*" 1000 + $x`
sed "s/PPP/$z/" k1

でいいんじゃないの? これでちゃんと動いたよ。

128 :login:Penguin:2016/03/10(木) 12:28:00.31 ID:gEv7eiQN.net
shellが違うんでしょうね、うちでは 下ではエラー expr: syntax error
z=`expr $y "*" 1000 + $x`
echo $z
使ってるのは OS :armbian で シェルは わからない

129 :login:Penguin:2016/03/10(木) 22:00:45.11 ID:NdYWsqwM.net
多分、勘違いしているのはここ。

z= expr $y "*" 10 + $x

これは一時的に環境を変更した上でコマンドを起動するための構文。
bash の man の 2520 行目辺りに書かれている。
この場合は環境変数 z に空文字列をセットして expr を起動する。
そして、それが終わったらもう z は存在しない。
だから echo では何も出力されない。

130 :login:Penguin:2016/03/25(金) 11:08:22.48 ID:BrsvjcQb.net
環境変数 $BASH_COMMAND で最後に実行したコマンドが取得できますが
ほんとに最後に実行したコマンドなので
ls | cat
みたいにしたときに当然ながら cat しか取れません

最後に実行したときのコマンドラインに打った文字列
を取得するにはどうしたらよいでしょうか

131 :login:Penguin:2016/03/25(金) 11:21:48.13 ID:Wj6xxs6s.net
historyあたりで頑張るとか

132 :login:Penguin:2016/03/25(金) 11:33:33.72 ID:BrsvjcQb.net
>>131
ありがとう
historyあたりで頑張ります

133 :login:Penguin:2016/03/31(木) 08:26:58.05 ID:gSxvuyP1.net
Windows10搭載ってまじかよ

134 :login:Penguin:2016/03/31(木) 12:19:44.47 ID:lhT3jASv.net
http://unix.oskp.net/sua

XPとかなbashとかコンパイルしたら
動いたけど、バイナリ互換はすごいな

135 :login:Penguin:2016/04/01(金) 10:00:39.79 ID:+PxKnYGY.net
curlでAPI叩いてるんだけど返事帰ってくるまでCreating..........みたいに....を増やしたい
どういうふうに書けばいい?

136 :login:Penguin:2016/04/01(金) 10:23:48.01 ID:2l1U0Mzg.net
>>135
別プロセスで実行して、そのプロセスが生きている間
. を増やし続ければいい

137 :login:Penguin:2016/04/01(金) 10:48:52.54 ID:+PxKnYGY.net
1秒ごとにチェックして生きてたら....を出力死んでたらそのままみたいなことか
やってみるわ

138 :login:Penguin:2016/04/01(金) 16:24:42.97 ID:YrmxN89w.net
windowsでbaプロできるようになるみたいですね(´・ω・`)

139 :login:Penguin:2016/04/01(金) 19:49:29.08 ID:opN9G6gR.net
HOGEDIR="${HOME}/path/to/directory" のように既存のディレクトリへのpathを変数に入れたら下記のような感じで実在チェックした方がいいんでしょうか?
自分は転ばぬ先の杖だと思って(事実、何度かtypoしてます)書くようにしていますが……

if test ! -d "$HOGEDIR"; then
    echo '$HOGEDIR is *NOT* a Directory!' 1>&2
    exit 1
fi

140 :login:Penguin:2016/04/01(金) 20:48:16.55 ID:pqGjBE9F.net
変数に入れるかどうかは実在チェックの必要性に変化を与えるものではない

141 :login:Penguin:2016/04/01(金) 21:01:52.69 ID:FfS85Ldg.net
だがその実在性が極めて疑わしい性的な穴隙に変化を与えられた私はそれに入れる事を夢想し夢精するものである

142 :login:Penguin:2016/04/02(土) 12:51:53.29 ID:2K6xkzqa.net
セキュリティにも穴はあるんだよな・・・

143 :login:Penguin:2016/05/09(月) 14:51:55.56 ID:tGlvk2AC.net
exec 3>$1
みたいにファイルディスクリプタを指定するとき
すでに使われるディスクリプタ番号を避けたいんだけど
どうしたらいいの?

144 :login:Penguin:2016/05/09(月) 15:18:10.05 ID:1X5m9uCK.net
Bash詳説みたいな本ないかな?
やっぱオライリーか…

145 :login:Penguin:2016/05/10(火) 04:31:28.39 ID:D4kfzW96.net
open とか、複製する dup でも、未使用のファイルディスクリプタを使う

146 :login:Penguin:2016/05/22(日) 16:49:48.48 ID:q7UTLg4q.net
SoftwareDesign 6月号、1,220円 + 税

特集、Bash 再入門・MySQL

147 :login:Penguin:2016/05/22(日) 17:04:20.44 ID:uBlhVZDB.net
>>145
どうやって?

148 :login:Penguin:2016/05/23(月) 08:00:46.64 ID:MmvCX7kr.net
最近の言語に慣れると
コマンドラインベースの言語って理解しにくいね
コマンドを文字型変数として理解しようとしてハマる

149 :login:Penguin:2016/05/25(水) 19:15:04.18 ID:A0i8LpMi.net
debianとかubuntuにはwhiptailなんてのがデフォルトであるらしい
今まで選択候補をcat -b >&2してからread REPLY </dev/ttyしていたのをさっそく書き換えてみた
けっこうすっきり書けて個人的には大満足

150 :login:Penguin:2016/07/19(火) 14:21:22.35 ID:W6/OJD/n.net
コンソールにできたバイナリを16進で出力するにはどうしたら良いですかね

151 :login:Penguin:2016/07/19(火) 15:29:25.71 ID:yBnV/0hR.net
>>150
hexdumpやodで出力すればいいんじゃないですかね

152 :login:Penguin:2016/09/07(水) 13:04:02.24 ID:Zv6pU7x4.net
背景色を一気に変更したい

153 :login:Penguin:2016/09/08(木) 01:20:29.54 ID:4a9rtSBz.net
「linux 端末 色」で検索!

154 :login:Penguin:2017/11/07(火) 14:00:12.38 ID:3IDunlyg.net
関数を定義したshファイルを実行したあと、その関数を使いたいんだけど
どうしたらいいの?

155 :login:Penguin:2017/11/07(火) 14:24:33.56 ID:As8jAu29.net
>>154
汎用的に使う関数なら ~/.bashrc に書いて
あとは普通に関数名で実行すればいいだけ
function foo {
}

ならfooで呼び出し。

156 :login:Penguin:2017/11/08(水) 06:57:36.00 ID:N8l/Vn75.net
>>154
.

157 :login:Penguin:2017/12/29(金) 13:13:26.87 ID:S/CsVkMC.net
誰でも簡単にパソコン1台で稼げる方法など
参考までに、
⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。

グーグル検索⇒『宮本のゴウリエセレレ』

2UMY6SSHSE

158 :login:Penguin:2018/02/15(木) 07:37:05.23 ID:m3isa15O.net
☆ 私たち日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆

159 :login:Penguin:2018/05/22(火) 11:10:50.11 ID:Czl6p0FW.net
僕の知り合いの知り合いができた副業情報ドットコム
関心がある人だけ見てください。
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

FOJ8E

160 :login:Penguin:2018/08/15(水) 15:18:59.23 ID:dfDlag4t.net
てst

161 :login:Penguin:2018/08/15(水) 15:20:23.48 ID:dfDlag4t.net
html form で書き込み送信URLエンコードされた文字列をURLデコードした後
変数Aに格納したあと  改行コードを html改行コードに変換したいのですが 改行コードがバイナリコードで格納されているため
変換がうまくできません bash でうまく変換するコードってなにかないですか?

162 :login:Penguin:2018/08/15(水) 15:21:00.64 ID:dfDlag4t.net
html form で書き込み送信URLエンコードされた文字列をURLデコードした後
変数Aに格納したあと  改行コードを < b r >に変換したいのですが 改行コードがバイナリコードで格納されているため
変換がうまくできません bash でうまく変換するコードってなにかないですか?

163 :login:Penguin:2018/08/15(水) 17:04:04.34 ID:dfDlag4t.net
解決しました

なぜか sed のパイプで変換できなかった

trのパイプで変換してなんとかなりました


なぜだろう?

164 :login:Penguin:2018/08/16(木) 19:43:27.04 ID:I7VrLkNo.net
>163
sedで改行をどうこうするのは意外とハイレベルな知識が要るからかな
単に改行を置換したいだけならtr使うほうが筋がいいと思う

165 :login:Penguin:2018/08/17(金) 21:35:15.57 ID:jq4Ra/PN.net
>>164
urlエンコードから飛んできた文字列をURLデコードした後の文字列はecho
なんかで出力しても隠れてみえない \n が見えない
アスキーコードで書かれた文字列はsedじゃ無理?のようなきがする

166 :login:Penguin:2018/08/17(金) 21:45:02.38 ID:x+SQYw9w.net
POSIXのコマンドも今の人達が再設計すれば
もっと良いものが作れるんだろうな

167 :login:Penguin:2018/08/18(土) 00:38:01.74 ID:hWfi1+lO.net
素直にUnix2dos、dos2unix使おう、な?

168 :login:Penguin:2019/05/21(火) 23:09:17.57 ID:oXRLq/xt.net
eval使って文字列内で実行するコマンドの返却値も標準出力も取りたいんですがどうしたらいいですか?

evalに渡すのはcurlでhttp取得なんですがurlが変わるのでそこを変数から実行したいんですが$?はevalの結果でcurlのものが取れないんです

169 :login:Penguin:2020/01/02(木) 23:47:15.29 ID:Vb52hemx.net
mysqlで特定の接頭辞がつくテーブルを検索し一括で削除したいのですが、クォーテション処理でうまく動作してくれません

grepで特定の接頭辞を検索してxargsで引数を渡してるのですが、xargs以降のエスケープしたりシングル・ダブルクォートと入れ替えたり
してるのですがうまくいきません。(-pで実行コマンドも確認しました。)
どなたかうまい書き方が分かる方いませんか?

mysql -u ユーザー名 -p -e 'SHOW TABLES FROM テーブル名' |grep 接頭辞_* |xargs -pI '{}' mysql -u ユーザー名 -p -e 'DROP TABLE テーブル名.\'{}\''

170 :login:Penguin:2020/01/04(土) 17:21:02.76 ID:E3O62f92.net
実際に使って知ってる人が助けてくれるんじゃないかと思って見てたけど来ないね。
まあ、「うまくいきません」だけじゃ無理か。
同様なことを SQLite でやるとしたらこんな感じかな。

dbname='test.db'
prefix='a'
echo .table | sqlite3 "$dbname" | tr -s ' ' '\012' |
sed -e "/^$prefix/!d" -e 's/^/drop table / ; s/$/;/ ;' |
sqlite3 "$dbname"

一般的な話として、引数で渡すためにはシェルの文法に従う必要があるから
それを大変だと思うならパイプを使えばいいと思うよ。
そういう使い方ができる場合はね。
3 日近く経ってるし、もう自分で解決してるよね。

171 :login:Penguin:2020/01/05(日) 20:01:18.77 ID:IPuUazgK.net
そもそも何が問題なのかわからんしなぁ
xargs使う理由もわからんし。俺ならそんな使い方しない。
たくさんのDROP TABLE文で埋め尽くされたSQLファイルを作ってを実行するとかさぁ
いやテーブル名羅列するだけでいいのか

grepでテーブル名引っ張るとかあり得んし。
SHOW TABLES FROMはこの場合に適切なんだっけ?
ああ、思い出したINFORMATION SCHEMA.TABLESとかあったなぁ

ともかくシェルスクリプトでやることじゃないよね
なんのために問い合わせが得意なRDBMS使ってるのさ?

172 :login:Penguin:2020/01/06(月) 00:00:10.35 ID:FtTPVMr3.net
「LIKE」句を使って、テーブル名で絞り込む。
最後に「meta」で終わるテーブルだけを表示したい

mysql> SHOW TABLES FORM wordpress LIKE "%meta";

「mysql show tables」で検索!

173 :login:Penguin:2020/01/08(水) 21:40:32.43 ID:l1od5Fw+.net
>>170, 171, 172
レスが遅くなって申し訳ありません。

CMSのインストール・削除のトライアンドエラーを
繰り返しているうちにテーブルが増えてきてしまった次第です。

やりたいことは、たくさんあるテーブルの中から
特定の接頭辞が付くテーブルだけを検索し削除したいです。

`drop table from 〇〇`でググるとかなりの割合の方が
bashでmysqlのコマンドを書いて力技で削除しているようでした。
当方もそれに習って色々試したのですが、
うまく動作せずに困っておりました。

こういった場合の無駄なくシンプルに削除するに
適切なコマンドはどうしたらよいのでしょうか?

174 :login:Penguin:2020/01/08(水) 22:01:09.19 ID:i7Ggys1A.net
なんでわざわざ手間がかかることするかね?自動化したいんじゃないだろ?
>>172みたいに該当するテーブル一覧でもだして、テキストエディタでも使って

drop table from table1
drop table from table2
drop table from table3

とかいうSQL作って、それを実行すりゃいいやん

シンプルにしたいんだろ?なんでわざわざxargsとか使って複雑なものを作ろうとしてるんだ

自動化したいなら↑の内容を一つづつ自動化しろ。いっぺんにやろうとすんなよ。

1. テーブル一覧を、drop table from ○○にしやすいようにテーブル名のみの出力にしろ
2. テーブル名のリストをdrop table from ○○のリストに変換するスクリプトを作れ
3. そのスクリプトの出力をmysqlコマンドに流せ

これだけだろ

> ググるとかなりの割合の方が
ググるとかなりの割合の方が馬鹿なだけ

175 :login:Penguin:2020/01/09(木) 15:44:04.89 ID:2gXyzp52.net
>>174
詳しいアドバイスありがとうございます!
本当に目から鱗です。

レスを見て2分で解決しました。
bashで力技で何時間も悪戦苦闘していたのが
悲しくなるくらい呆気なさでした。

本当に的確なアドバイスありがとうございます!

176 :login:Penguin:2020/02/09(日) 12:27:07 ID:TdA6OoR0.net
やってることが複雑になったと感じたら、最初に戻って考え直すことだ。

177 :login:Penguin:2020/09/12(土) 14:17:52.81 ID:uRW97DpA.net
バッシュの教科書って本買おうとしたけど、どこでも売り切れてて人気みたい

178 :login:Penguin:2020/09/12(土) 15:05:18.55 ID:f1Nswvqc.net
売れなかったから廃盤になるんやで

179 :login:Penguin:2021/05/27(木) 01:02:31.31 ID:m06R9ufF.net
こういったケースの空白文字がある場合のワンライナーはどう書けばいいですか??

・特定のディレクトリの中にある大量のファイル
・ファイルは全て同じ拡張子(.mp3)
・拡張子の直前にランダムのID何文字か付いている(例 -48antiO81n5Dq)
・全てのIDを取り除きリネームしたい
自分で作成したのですが最後のmvで躓いています。。
空白文字があるとそこでファイル名を分割されてうまく動作しません。
```bash
find . -type f -name "*.mp3"|grep "\-[a-zA-Z0-9-]*.mp3$"|sed "s/\-[a-zA-Z0-9-]*.mp3$/.mp3/"|xargs -n2 mv
```

180 :login:Penguin:2021/05/27(木) 12:15:42.12 ID:+SArHOBh.net
慣れてる人ならともかくリネームとかいう取り返しのつかない作業を
findとxargsでやりたくないな
俺ならリスト生成してmvするわ

mv "aaa aaa-48antiO81n5Dq.mp3" "aaa aaa.mp3"
mv "bbb bbb-48antiO81n5Dq.mp3" "bbb bbb.mp3"
mv "ccc ccc-48antiO81n5Dq.mp3" "ccc ccc.mp3"

みたいなシェルスクリプトを生成して実行する
実行前に目視で確認できるし、場合によっては手動で修正すればいいし

181 :login:Penguin:2021/05/27(木) 13:40:55.77 ID:EyeK5jGy.net
そもそもファイル名に空白が入ってなければ正しく動くのか?

aaa-48antiO81n5Dq.mp3
bbb-48antiO81n5Dq.mp3

というファイルがあったら sed の出力は

aaa.mp3
bbb.mp3

となるように思うのだが。いろいろつっこみたいが、とりあえず
find . -type f | xargs -d '\n' rename 's/-[a-zA-Z0-9-]*\.mp3$/.mp3/'
とするのが手っ取り早いと思う。
でもいきなりこんなことはしたくないね。
少なくともファイル名の衝突くらいはチェックしないと。

182 :login:Penguin:2021/05/28(金) 15:39:24.70 ID:RtkQ3VQL.net
どこに空白が入っているの?

例示して

183 :login:Penguin:2021/06/04(金) 21:38:34.04 ID:i0A1vKtk.net
空白入るなら、ダブルクォートをエスケープして入れてやればいい、と。

そもそもxargs使わんといけんの?
ふつうにこんなんじゃだめか?
find . -type f -name "*.mp3"|grep "\-[a-zA-Z0-9-]*.mp3$" \
| while read i;do \
echo mv -v \"$i\" \"`echo $i|sed '"s/\-[a-zA-Z0-9-]*.mp3$/.mp3/'`\"; \
done

で、そもそもfind使うなら、-nameじゃなくて-regex使った方がよくない?
grepはそのためだよな?(ってまあ、俺もgrep使うような気がするけどw)
で、さらにfind使うなら、xargsよりは-execの方がベターだ。
で、そうすっとこれが多分模範回答
find . -type f -regex "\./\-[a-zA-Z0-9-]*.mp3$" \
-exec echo mv -v \"{}\" \"`echo {}|sed 's/\-[a-zA-Z0-9-]*.mp3$/.mp3/'`\" \;

で、いずれもmvの前にechoを入れてるので、よさげだったら、echoを削って祈ってw

184 :login:Penguin:2021/11/11(木) 18:26:58.40 ID:wR3FRIZb.net
(´-`).。oO(>>1 は、いなくなったか…)

185 :login:Penguin:2022/01/11(火) 19:24:30.28 ID:JlzCBGqO.net
if文で文字列を正規表現にマッチしたら抽出、という処理を作りたいのですが、
マッチしたら一つ目の文字列は抽出出来ましたが、二つ目以降マッチしたものが抽出できません
どうコードを書けば良いのでしょうか

186 :login:Penguin:2022/01/12(水) 22:51:42.05 ID:uKLEW53q.net
[[ foo-bar =~ (foo)-(bar) ]] && echo ${BASH_REMATCH[2]}
的な?
0にマッチ全体、カッコでグループ化すればn番目の部分マッチが1以降に入る
barが出るはず

187 :login:Penguin:2022/01/12(水) 23:04:58.17 ID:uKLEW53q.net
推測だけど、一つ目のマッチだけ見えているんじゃなく、全体のマッチだけ見えてるんじゃないか?
配列変数を添字なしで参照すると0番目の要素が返る、よくある罠

$BASH_REMATCH
= ${BASH_REMATCH[0]}
= foo-bar

違ったらすまん

188 :login:Penguin:2022/06/20(月) 21:01:15.77 ID:y2PJqfx1.net
nnn=111;mmm=0;echo $nnn | read mmm;echo $mmm
0
なんで?

189 :login:Penguin:2022/06/29(水) 00:20:30.34 ID:X2h/MJK6.net
昔からあるバグです

190 :login:Penguin:2024/02/24(土) 13:44:13.05 ID:NO8gqPUT.net
UIDとEUID を食い違いさせる方法って どんなのがありますか?

191 :login:Penguin:2024/02/27(火) 19:48:24.39 ID:IBP33Gpn.net
>>190
chmod +s

50 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :

read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★