シェルスクリプト総合 その26 [無断転載禁止]©2ch.net

1名無しさん@お腹いっぱい。2017/03/20(月) 12:07:26.41
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
 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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その25
http://echo.2ch.net/test/read.cgi/unix/1439563321/

488名無しさん@お腹いっぱい。2018/01/18(木) 11:41:43.86
sedでiフラグをdフラグと一緒に使うことはできないのでしょうか。

489名無しさん@お腹いっぱい。2018/01/18(木) 11:44:10.00

490名無しさん@お腹いっぱい。2018/01/18(木) 19:40:41.47
>>489
誘導ありがとうございます。一応の解決を見ました。

491名無しさん@お腹いっぱい。2018/01/26(金) 00:50:46.41
hoge.sh <(cat hoge.txt fuga.txt piyo.txt)

### hoge.sh
#!/bin/bash
wc -l $1 # 正しい行数
wc -l $1 # なぜか0

おせーてエロいひと

492名無しさん@お腹いっぱい。2018/01/26(金) 06:57:46.46
>>491
つ cat hoge.txt fuga.txt piyo.txt | (wc -l; wc -l)

493名無しさん@お腹いっぱい。2018/02/01(木) 22:35:58.02
こういうhoge.shがあったとして
```
#!/bin/bash
set -x
for x in aa bb cc; do
echo $x
done
```
実行するとこうなる
```
$ bash hoge.sh
+ for x in aa bb cc
+ echo aa
aa
+ for x in aa bb cc
+ echo bb
bb
+ for x in aa bb cc
+ echo cc
cc
```
けどこうしたい(forやifが出力されないようにしたい)
```
$ bash hoge.sh
+ echo aa
aa
+ echo bb
bb
+ echo cc
cc
```
どうしたらいい?

494名無しさん@お腹いっぱい。2018/02/01(木) 22:38:33.65
つづき。ためしにこうしてみた
```
#!/bin/bash
for x in aa bb cc; do
set -x
echo $x
set +x
done
```
実行したら set +x も表示された(これはいらない)
```
$ bash hoge.sh
+ echo aa
aa
+ set +x
+ echo bb
bb
+ set +x
+ echo cc
cc
+ set +x
```

495名無しさん@お腹いっぱい。2018/02/01(木) 22:40:28.83
grep -vでもしたら

496名無しさん@お腹いっぱい。2018/02/01(木) 23:21:30.45
echo $x
の前に
echo + echo $x
と記述する

497名無しさん@お腹いっぱい。2018/02/01(木) 23:48:49.07
bashだからじゃね?

498名無しさん@お腹いっぱい。2018/02/02(金) 01:26:01.46
fishてどう?

499名無しさん@お腹いっぱい。2018/02/02(金) 01:47:58.90
$ cat hoge.sh
#!/bin/bash
for x in aa bb cc; do
(set -x
echo $x)
done

$ bash hoge.sh
+ echo aa
aa
+ echo bb
bb
+ echo cc
cc

なんつって

500名無しさん@お腹いっぱい。2018/02/02(金) 08:54:06.42
>>499
> (set -x
> echo $x)
この方法でできました。ありがとうございます。
もっと簡潔に書けるといいのだけど。

501名無しさん@お腹いっぱい。2018/02/08(木) 16:21:59.61
すんませんけど 今割り当て端末数からこんな感じでサブネットマスクを出すのを作ったんですけど
i=256;j=0 ; while [ ! $i -eq 1 ] ; do i=$(( $i /2 ));echo $i; j=$(($j + 1)) ; done ;echo ans:$((32 - $j))

もっとてっとり早く出すコマンドはありませんか? できれば256を入れたら8とかさっさと返してくれるような奴を
あとよくわからんけど 計算で256と2を入力したら後ろの8とかを出すコマンドはないですか?
覚えるとか調べるは嫌いなんで、なるべく手間のかからないものを教えてください
 

502名無しさん@お腹いっぱい。2018/02/08(木) 17:19:18.65
サブネットマスクぐらい暗記か手計算しろよ

503名無しさん@お腹いっぱい。2018/02/08(木) 18:06:11.03
>覚えるとか調べるは嫌いなんで、

生きてる意味あんのか、これで?

504名無しさん@お腹いっぱい。2018/02/08(木) 19:05:19.51
>>502
手間がかかるから面倒だよ
20万以上やるし

ああ これででるのね うしろに変なゴミが付いてるがどうでもいいか
:echo " l(65556)/l(2)" | bc -l
16.00044020841915062248
:echo " l(1024)/l(2)" | bc -l
10.00000000000000000010
>>503
また努力するするのが誇らしいとか思ってる馬鹿?ww
俺が考えるならこの機械とか利用価値はないよ
ゲーム開発のUNITYのスレに行けば似たような奴が沢山いるよ

まぁしばらくはマシーンを買う金がないからlinuxとイヤイヤ付き合うしかないが
ほんと手間がかかるな

505名無しさん@お腹いっぱい。2018/02/08(木) 19:20:30.57
ある意味面白いやつだな

506名無しさん@お腹いっぱい。2018/02/08(木) 20:11:48.67
>また努力するするのが誇らしいとか思ってる馬鹿?ww

こんなこと考えたこともないけど
思い込みが激しいっていうか頭腐ってるだろ
ああ死んでるんだったっけ

507名無しさん@お腹いっぱい。2018/02/08(木) 20:31:31.63
落ち着け

508名無しさん@お腹いっぱい。2018/02/08(木) 20:57:59.75
>>506
そういう手間が掛かるのはちょっと…
利用価値がないし

509名無しさん@お腹いっぱい。2018/02/08(木) 21:47:56.46
バイト雇って計算してもらいましょう

510名無しさん@お腹いっぱい。2018/02/08(木) 23:17:47.05
>>509
俺自体が無職だよ

さて間抜けからビットコインを盗まんと

511名無しさん@お腹いっぱい。2018/02/09(金) 01:51:26.42
>>510
頼むわ
間抜けは存在自体がガンだから

512名無しさん@お腹いっぱい。2018/02/09(金) 09:19:26.94
犯罪の予告と教唆かよ

513名無しさん@お腹いっぱい。2018/02/09(金) 22:09:51.06
>>512
予告と教唆じゃなくて実行中だよ
とろくさいやつだなw
http://or2.mobi/index.php?mode=image&file=193749.jpg
http://or2.mobi/index.php?mode=image&file=193750.jpg

3週間たってだいぶリナックスにも慣れてきた
ある程度稼がせてもらったらウインドウズに戻るよ
ライブは少し使いにくい

514名無しさん@お腹いっぱい。2018/02/09(金) 22:12:54.21
なんかシェルスクリプト総合とか書いてあったから来てみたけど
しょぼそうな連中しか居ないけど…

ここのひとってシステム管理とかで食ってる連中が多いの?

515名無しさん@お腹いっぱい。2018/02/09(金) 22:39:19.88
煽ったらなんかもらえるのか?

516名無しさん@お腹いっぱい。2018/02/09(金) 22:54:21.43
なんか急に変なの出てきたな
どっかにスレのアドレスでも貼られたのか

517名無しさん@お腹いっぱい。2018/02/10(土) 00:05:29.76
いや元々お前らの方がずっと変だけどw

518名無しさん@お腹いっぱい。2018/02/10(土) 05:51:23.70
変と思いながら見続けて今さあながら「変だ!変だ!」と言う人って・・・

まあ相手にされるかは別にして居たいなら居ていいと思うよ

519名無しさん@お腹いっぱい。2018/02/10(土) 11:31:48.71
>>514
面白いネタがあれば食いつくんじゃない?
つまらんネタしか無いから過疎ってる。

520名無しさん@お腹いっぱい。2018/02/10(土) 19:55:51.78
ほんとに揃いも揃っておまえらは無能な連中だよ
こんな能無し共が良いかねを取って裕福な生活をしてるのに
何で俺がしこしこビットコインを盗まんとならんのか……
よしよしw 今日はあがりはデカそうだな

521名無しさん@お腹いっぱい。2018/02/15(木) 20:16:20.69
1111
2222
3333
という内容のファイルに対して,
• 3333 が見付かれば 3333 を,
• 見付からなければ 2222 を
• ⋮
という操作を施したいです。そして,これをパイプに繋ぎたいです。
私が考えたのは↓のスクリプトですが,
for q in 3333 2222 1111; do
cat <<-'EOF' |
1111
2222
3333
EOF
grep $q && break
done
難点があります。
1. パイプでファイルを渡せない。
2. 順番に依存している (実際のファイルでは 3333 が最後にくるとは限らない)
どうか助言願います

522名無しさん@お腹いっぱい。2018/02/15(木) 20:19:41.66
あ,すいません。期待する動作は,
かりに理想のスクリプトを idea.sh として,
$ cat ./org.txt
2222
3333
1111
$ cat ./org.txt | idea.sh
3333
$ cat ./org.txt | sed -e '/3333/d' | idea.sh
2222
$ cat ./org.txt | sed -e '/3333/d' -e '/2222/d' | idea.sh
1111
という感じです。

523名無しさん@お腹いっぱい。2018/02/15(木) 21:01:11.15
標準入力を受け取れるように作ればいいんじゃないの?

idea.sh
sed -e "/$1/d" < /dev/stdin

$ cat ./org.txt | ./idea.sh ‘3333’ | ./idea.sh ‘2222’ | ./idea.sh ‘1111’

524名無しさん@お腹いっぱい。2018/02/15(木) 21:10:36.33
awk使うのが妥当。
awkが嫌なら、標準入力をファイルにコピーしてから複数回に分けて処理するしかないな。

525名無しさん@お腹いっぱい。2018/02/15(木) 21:26:45.83
やりたい事はシンプルなのに標準入力使おうとしてるせいで妙に面倒になってるな
awkかgrepでよさそうだが

526名無しさん@お腹いっぱい。2018/02/15(木) 21:36:30.68
事前にソートしたら?

527名無しさん@お腹いっぱい。2018/02/15(木) 21:38:59.09
tacは?

528名無しさん@お腹いっぱい。2018/02/15(木) 21:41:36.03
$PATHの中身って最初は空じゃないの?
$PATHをechoしてみたら,その中に
~/.bashrcや~/.bash_profileでexportされてるパス以外のモノが含まれてた
でも$PATHに初期値を設定できるならわざわざ~/.bashrcや~/.bash_profileでexportする必要なくない?
どうなってるのか教えてくれ

529名無しさん@お腹いっぱい。2018/02/15(木) 22:34:13.00
OSによるけどinit.dの中とかlogin.confとかでデフォルトを設定する。
ここ書き換えると全ユーザに影響が出るので、個別設定は.bash_profileとかに書く。
exportするのは万一PATHなしで起動されてしまったとき用。

530名無しさん@お腹いっぱい。2018/02/16(金) 02:23:59.63
>>501
> すんませんけど 今割り当て端末数からこんな感じでサブネットマスクを出すのを作ったんですけど

ipcalcコマンドで行けるんじゃね?
知ってるだけで使ったことないけど

他にもiptabとかipcountとかあるらしいな

531名無しさん@お腹いっぱい。2018/02/16(金) 08:44:35.62
>>522
最初に自身で書いてたようなんで十分じゃないの?
パイプで渡せないというのが何を嫌がってんのかによるけど
テキストなら貯めてechoしたっていいんじゃ
DATA="$(cat -)" && cat $KEYWORDFILE | while read KEYWORD ; do ( echo "$DATA" | grep "$KEYWORD" ) && break ; done

データでかいから捜査対象の方を1パスで捜査したいってことなら
シェルスクリプトでがんばるより別のことでがんばろう

532名無しさん@お腹いっぱい。2018/02/16(金) 20:37:24.42
>>530
ありがとやっと有益なレスが出たよ
他のやつは揃いも揃って無能な役立たずばっかりだから

533名無しさん@お腹いっぱい。2018/02/16(金) 20:41:32.04
ショッアーーーーーーーーー!!!
さってビットコインを盗むか

534名無しさん@お腹いっぱい。2018/02/16(金) 21:23:29.93
アホにレスした俺もアホだった。
やっぱアホはスルーに限る。

535名無しさん@お腹いっぱい。2018/02/17(土) 02:29:48.74
>>530
俺も普通は ipcalc 使ってるけど最近は sipcalc というのもあるらしい。

紹介してくれてる iptab とか ipcount 含めて今度試してみようと思う

536名無しさん@お腹いっぱい。2018/02/20(火) 18:16:48.11
シェルスクリプトの函数で扱える文字数に上限はないのでしょうか。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_05
↑ここが多分公式の文書だと思うのですが,使用可能な文字の種類に言及こそすれ,文字数については触れていないように思いますが……
ファイル名などの上限と同じく255文字でしょうか?

537名無しさん@お腹いっぱい。2018/02/22(木) 02:57:44.82
>>536
255文字かどうかは、質問するまでもなくすぐにわかると思いますよ。

538名無しさん@お腹いっぱい。2018/02/22(木) 05:46:35.30
ワロタ、試せよwそして調べろよって話だよな

新着レスの表示
レスを投稿する