[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 04/11 08:58 / Filesize : 268 KB / Number-of Response : 1033
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/20(月) 12:07:26.41 .net]
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
  src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
  heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
 (理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その25
echo.2ch.net/test/read.cgi/unix/1439563321/

349 名前:340 mailto:age [2017/09/21(木) 02:42:16.10 .net]
すいません。age ます。

350 名前:名無しさん@お腹いっぱい。 mailto:age [2017/09/21(木) 02:44:04.33 .net]
$ showraw 'ls */*'
ls -F -A a/a a/b a/c b/a c/a c/b
エイリアスも解釈されるのでこんなかんじですね。

351 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/21(木) 05:13:34.59 .net]
コマンドの方はtype ls 引数の方はecho */* で良くね
取り敢えずshとbashで確認

352 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/21(木) 06:12:05.17 .net]
$ ls */*
と入力したところで ESC \C-e をタイプするとエイリアスが展開され
\C-x* をタイプするとワイルトカードが展開される

353 名前:名無しさん@お腹いっぱい。 mailto:344 [2017/09/21(木) 06:21:42.53 .net]
すまん、bash限定

354 名前:名無しさん@お腹いっぱい。 [2017/09/21(木) 07:24:19.18 .net]
>>343

$ set -x
$ ls */* >/dev/null

355 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/21(木) 08:38:01.77 .net]
>>346 -- >>348
ありがとうございます。しかしできればエイリアスごと展開したいのです。

>>349
おわ!まさにこんな感じです。多分コマンドプロンプト関連の命令群も一緒に出力されますが,これはまあ awk か何かで頑張って切り取ります。一応 zsh,bash,dash で確認できました。

356 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/26(火) 02:43:18.09 .net]
>>333
set -u 便利ですね
~/.bashrcに書こうかしら
とくに弊害ないですよね?

357 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/28(木) 10:22:22.57 .net]
すいません。わかるかたいたら教えてください。

基本的にカンマ区切りの行なのですが、1列目が""で囲まれ、"aaa,bbb,ccc"のように
なることがあります。
1列目のみに発生します。
この1列目のケースだけ、カンマをスペース等に置換したいと思っています。

イメージはこうです。

"aaa,bbb,ccc",AAAA,BBBB,CCCC
aaa,AAAA,DDDD,EEEE

"aaa bbb ccc",AAAA,BBBB,CCCC
aaa,AAAA,DDDD,EEEE

理由はエクセルに取り込むときにずれてしまうためです。

awkで出来た気がするのですが、うまく出来ません。
どなたか心当たりないでしょうか。



358 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/28(木) 10:41:01.84 .net]
Excelならダブルクオートちゃんと扱うはずだよ
勘違いか、変な文字入ってない?

359 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/28(木) 11:09:26.14 .net]
テキストをコピーして貼り付ける時にカンマ区切りでバラすように貼り付けると囲んでてても関係なくバラさなかったっけ?

360 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/28(木) 11:10:20.00 .net]
そんなことなかったわ

361 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/28(木) 11:41:08.89 .net]
もっとうまく書けそうな気がするものの
perl -pe 'if (/^"/) { @f = split/"/, $_, 3; $f[1] =~ s/,/ /g; $_ = join "\"", @f }'

362 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/28(木) 12:17:55.02 .net]
awkとBEGINで昔出来た記憶があるのですが。上手くいかず。

>>353
あれ、確かにEXCELには想定ではれました、すいませんさっきも同じにようにはったつもりで、ばらされたのですが。

>>356
一行Perlの文法の意味はわかりませんが、確かに出来ました!

363 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/28(木) 22:34:38.91 .net]
区切り文字を"にして配列に取り込んで,を に置換えた後、最初と最後に"を追加する
perl -F\" -anle '$F[1] =~ s/,/ /g; $F[1] =~ s/(.+)/\"$1\"/; print @F'

awkでは
awk 'BEGIN {FS="\""; OFS="\""} {gsub(","," ",$2); print $0}'

でいいような、なんか自信ないけど

364 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/28(木) 22:48:57.65 .net]
GNU awk の FPAT を使ってこんな感じで

gawk -vFPAT='(".+?"|[^,]*)' -vOFS=, '{gsub(/,/," ",$1);print}' data.csv

365 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/29(金) 04:05:27.30 .net]
perl -pe 's/^("[^"]*")/$1=~s|,| |gr/e'

366 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/29(金) 16:42:39.76 .net]
perl -pe 's/,(?=.*\")/ /g'

367 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/29(金) 17:03:38.90 .net]
suge-



368 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/09/30(土) 13:09:25.90 .net]
>>352
#!/bin/sh
IFS=\"
while read X Y Z ; do
  if [ "$X" = "" ] ; then
    echo -n \"$Y\" | sed 's/,/ /g'
    echo $Z
  else
    echo $X
  fi
done

369 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/02(月) 11:37:31.18 .net]
sed '/^"[^"]*"/{H;s///;x;s/\n//;s/^\("[^"]*"\).*/\1/;s/,/ /g;G;s/\n//;}'

370 名前:名無しさん [2017/10/12(木) 11:03:43.53 .net]
bashで変数展開するときに、名前末尾にハイフン付けるのはどういう意味なんでしょうか?

${abc-}

371 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/12(木) 13:43:34.47 .net]
>>365
https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBB

372 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/12(木) 14:06:07.63 .net]
今まさにそのページ読んでたけど、:いるよな
ナシの使い方なんてあったっけか

373 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/12(木) 16:13:02.77 .net]
> コロンを省略した場合には設定されているかどうかのみを調べます。

374 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/12(木) 16:37:37.56 .net]
何度か読み返してようやく理解した
unsetされてるか空値が入ってるかの違いに対応出来るのか

375 名前:名無しさん@お腹いっぱい。 [2017/10/13(金) 18:57:11.77 .net]
ログイン時に読み込まれる ~/.profile ファイルは,「誰が」読み込んでいるのでしょうか。
普通 sh もしくはその代替シェルかなと思うのですが,実際はどうなのか気になります。
というのも,私が普段使っている Debian GNU/Linux ではデフォルトシェルは bash に指定しているのですが,~/.profile の中に bash っぽい変数 (${HOGE} という書き方) があったので。

376 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/13(金) 19:08:59.70 .net]
>>366読んでみたらいいじゃない
起動のところ

377 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/13(金) 19:12:36.61 .net]
${HOGE}はbashに限らないよ



378 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/14(土) 00:33:15.35 .net]
>>372
誰へのレス?

379 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/14(土) 00:33:50.98 .net]
>>370
Linuxの質問はLinux板で

380 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/14(土) 00:37:55.44 .net]
>>370

くだらねえ質問はここに書き込め!Part 229
mao.5ch.net/test/read.cgi/linux/1505217859/

初心者の質問相談にやさしく答えるスレ Part9
mao.5ch.net/test/read.cgi/linux/1504269873/

381 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/14(土) 00:56:47.50 .net]
>>370
もしかしてこの人?
https://mao.5ch.net/test/read.cgi/linux/1504269873/343

382 名前:370 mailto:sage [2017/10/14(土) 00:58:01.90 .net]
あぁ、すまん
>>371へのレスか
たしかに${HOGE}記法はたいていのshで使えるね

383 名前:370 mailto:sage [2017/10/14(土) 00:58:50.55 .net]
>>371じゃなくて>>370か、、、

384 名前:名無しさん@お腹いっぱい。 [2017/10/20(金) 11:02:46.23 .net]
>>377
何を言ってるのがわからん。bshが元祖なのに。

385 名前:370 mailto:sage [2017/10/20(金) 17:00:36.31 .net]
余計なレスだったんでわからんならわからんでいいよ

386 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 01:22:29.89 .net]
スレチ気味だけど,ある種の Shell って,
$ cd ///////
みたいなことをするとルートディレクトリだと認識するんだな。
個人的に ~ がすごく打ちにくい位置にあるので // を ~ だと解釈させようと試行錯誤してるときに発見した。
これはルートディレクトリが特別って訳じゃなく,
$ ls /usr////bin///////
みたいなことでも問題ない。ということは // == ~ にすることは Shell のソース弄るくらいしか方法がないということになる。
俺みたいな無駄な努力をしないために残す

387 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 01:32:07.61 .net]
それシェルの機能じゃなくね?



388 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 01:36:03.89 .net]
こういうのも開けるし
https://mevius.5ch.net///test////read.cgi/////unix//////1489979246///////l50

389 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 08:08:40.09 .net]
もしかして RFC とかで実装が統一されてんのか。

390 名前:370 mailto:sage [2017/10/21(土) 14:49:37.55 .net]
>>381
cdについてはPOSIXで決まっている
pubs.opengroup.org/onlinepubs/9699919799/utilities/cd.html
の8のc

>>382
シェル一部であるcdコマンドの機能

>>383
それはまた別の話

391 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 14:51:29.58 .net]
$ /bin/echo /usr////bin///////
/usr////bin///////
$

となるので、lsについてはシェルが解釈してるわけではなくlsが解釈していると思われる

392 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 14:55:41.90 .net]
まあ//を~にしたいならシェルのキーバインド使えばいいんじゃないですかね

393 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 15:01:35.03 .net]
ちなみにこんなんなったりする
シェルの種類によって挙動は違うかも

$ cd //
$ pwd
//
$

理由は
www.unixguide.net/unix/bash/E10.shtml

394 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 15:03:36.25 .net]
キーバインドいじっちゃうと
「http://」を打とうとして「http:~」になったりして困らないか

395 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/10/22(日) 16:52:10.67 .net]
>>385
「An implementation may」だから必ずではないのでは

396 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/22(日) 21:04:49.39 .net]
必ずって言ったっけ

397 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/22(日) 21:24:08.21 .net]
bashはパス中の複数の/を一つにするはず



398 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/22(日) 22:40:16.51 .net]
>>392
>>388

399 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 13:24:16.45 .net]
ファイルをリネームしてコピーし続けるスクリプトなんですが
コマンドが見つからないと出てよくわかりません

#/bin/sh

PATH='/var/log/'
PATH2='dnsmasq.log'
DOT='.'

for i in 6 5 4 3 2 1
do
PATH3=$PATH$PATH2$DOT$i
PATH4=`expr $i - 1`
PATH5=$PATH$PATH2$DOT$PATH4
mv $PATH5 $PATH3
done

PATH6=0

mv $PATH$PATH2 $PATH$PATH2$PATH6

exit 0

400 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 13:29:36.84 .net]
>>394
for VAR in ARGS; do
command;
done

401 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 13:30:47.44 .net]
sh -xで実行してみると以下の通り出力されました
+ PATH=/var/log/
+ PATH2=dnsmasq.log
+ DOT=.
+ PATH3=/var/log/dnsmasq.log.6
+ expr 6 - 1
./splitLog.sh: 1: ./splitLog.sh: expr: not found
+ PATH4=
+ PATH5=/var/log/dnsmasq.log.
+ mv /var/log/dnsmasq.log. /var/log/dnsmasq.log.6
./splitLog.sh: 12: ./splitLog.sh: mv: not found
(省略)
+ PATH3=/var/log/dnsmasq.log.1
+ expr 1 - 1
./splitLog.sh: 1: ./splitLog.sh: expr: not found
+ PATH4=
+ PATH5=/var/log/dnsmasq.log.
+ mv /var/log/dnsmasq.log. /var/log/dnsmasq.log.1
./splitLog.sh: 12: ./splitLog.sh: mv: not found
+ PATH6=0
+ mv /var/log/dnsmasq.log /var/log/dnsmasq.log0
./splitLog.sh: 17: ./splitLog.sh: mv: not found
+ exit 0

402 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 13:46:18.65 .net]
とりあえず何がしたいかを書け
そんな汚いもん見せられても何がしたいのか分かりにくい

403 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 13:51:57.00 .net]
PATH潰すんなら外部コマンドはフルパスで書かんと

404 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 14:02:38.34 .net]
フルパスで書かないといけなかったんですね…


405 名前:修正してみたらできました、ありがとうございます! []
[ここ壊れてます]

406 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 14:11:58.47 .net]
ようわからんがsavelogコマンドみたいなことがしたいのか

407 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 14:27:19.72 .net]
PATHがきしょい



408 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 15:33:20.43 .net]
>>399
「フルパスで書かなきゃいけない」のではない
$PATHを上書きするのがマズい

409 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 15:35:16.21 .net]
これ1〜6までファイル全部消えるんじゃね?

410 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 15:35:32.78 .net]
1から6まで

411 名前:400 mailto:sage [2017/10/26(木) 15:37:15.23 .net]
あ、すまん勘違い
逆だった

412 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 16:21:22.80 .net]
5を6にリネーム~0を1にリネーム
そのあと最新のログを0にリネームじゃないかな
どっちにしろゴリ押し感半端ないが

413 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 16:30:18.25 .net]
>>402
$PATHって環境変数ですよね…
何故気づかなかったんだろう
お恥ずかしい限りです

414 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 16:37:04.75 .net]
あーそういうことか、403のお陰でやりたいことは分かった

415 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 18:34:54.50 .net]
こうすればわかりやすいですかね

#!/bin/sh

DIR=/var/log/
FILE=dnsmasq.log;
START=0

for i in `seq 1 6`
do
DEC=`expr $i - 1`
cd $DIR
mv "${FILE}.${DEC}" "${FILE}.${i}"
done

cd $DIR
mv $FILE "${FILE}.${START}"

exit 0

416 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 18:56:39.92 .net]
毎回cdするのは無駄やろ

417 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 19:01:29.48 .net]
個人的にexpr嫌いなのもあって$(())使っちゃうな
mv "${FILE}.$((i-1))" "${FILE}.$i"
あとseq間違ってね?
seq 6 1 -1



418 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 19:25:35.16 .net]
これだと全部ログ.0になっちゃいますね
ありがとうございます!

419 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/28(土) 17:54:16.26 .net]
logrotateの真似したいのかな

420 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/28(土) 19:36:18.05 .net]
素直にそっち使った方が楽に出来るよね

421 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/28(土) 22:25:53.38 .net]
そっちを使うほうが楽、ということを学習するにはまずは自分で書いてみて、大変だぜてことを理解しないと

422 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/31(火) 13:10:26.11 .net]
昔solarisで見たlogrotateはshell scriptだった
どこかで見れれば参考になるかも

423 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/31(火) 13:39:18.79 .net]
あれはあんまりきれいじゃないから参考にしない方がいい

424 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/31(火) 13:48:20.70 .net]
この /usr/lib/newsyslog ね
www.tcp-ip.or.jp/~ikken/intra/check.txt

425 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/31(火) 15:47:40.56 .net]
シェルスクリプト
https://www.apt-browse.org/browse/ubuntu/trusty/main/i386/debianutils/4.4/file/usr/bin/savelog
マニュアルページ
https://manpages.debian.org/jessie/debianutils/savelog.8.ja.html

426 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/02(木) 04:12:26.82 .net]
これ?
https://goo.gl/En6m3D
www.bityet.us/s7b47si.jpg

427 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/03(金) 04:26:36.66 .net]
X Windows System で,どの IMF が用いられているか判別する方法を考えている。
思い付いたのは $XMODIFIERS 環境変数を用いた
case $XMODIFIERS in
  *ibus)
    local _imf=ibus
    ;;
  *fcitx)
    local _imf=fcitx
    ;;
  *uim)
    local _imf=uim
    ;;
  *SCIM)
    local _imf=scim
    ;;
esac
なんだけど,$XMODIFIERS が必ず設定されているとは限らないし,なんか漏らしてる気がしてならん……。



428 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/03(金) 04:29:53.86 .net]
ツールで投稿したら空白がエラいことになった。すまん。

429 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/03(金) 07:20:14.85 .net]
Shell Scriptのコメントアウトに
# @(#) Foo is foo.
みたいな文字を書いておいて
$ what ./foo.sh
とやると
Foo is foo
という表示がでるというようなwhatコマンドがあるらしいのですが
手元のFedora26に見付かりません。($ dnf search what, $ dnf provides what)
どこかにありますでしょうか。

430 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/03(金) 08:32:21.55 .net]
Linuxの質問はLinux板で

431 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/03(金) 10:09:39.61 .net]
>>423
whatはかつて使われていたSCCSというソースコード管理システムに入っていたコマンド
現在はGNU CSSCがSCCSと同等の機能を提供している
なのでcsscというパッケージを探す
なければhttps://www.gnu.org/software/cssc/へGO!

432 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/20(月) 15:39:18.57 .net]
case文で

$1がhogeで、$2がhageの場合のみ処理Aを実行する

みたいなのできないでしょうか?

433 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/20(月) 15:49:53.05 .net]
入れ子にすりゃいい

434 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/20(月) 15:56:36.27 .net]
$1にも$2にも含まれ得ない文字を区切りにして連結

435 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/20(月) 16:00:08.82 .net]
>>425
ありがとうございます。依存地獄に嵌ってしまいあきらめました,教えてもらったのにすいません。
また,御礼がおそくなってもうしわけないです。

436 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/20(月) 16:22:06.48 .net]
caseで実装するなら入れ子かね
しかしここでも髪の話するのか

437 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/20(月) 17:07:40.56 .net]
>>427
>>428
>>430

入れ子にできることを全然知らず
こんな感じかなでやってみたらいけました
皆さん短時間にありがとうございます

>>430
他意はありませんw



438 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/20(月) 18:39:46.60 .net]
>>430
気にし過ぎだろ
さっさと剃れよ

439 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/02(土) 09:15:00.24 .net]
すみません、bashでタブ区切りのファイルを配列に取り込む際、空の列が詰めて格納されてしまいます
そうならない方法はあるのでしょうか

exec < file.tsv
while read LINE
do
ARRAY=(${LINE})
done

440 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/02(土) 10:11:05.91 .net]
>>433
変数の参照部分を引用符で囲むとか。
#!/bin/sh -

exec < file.tsv
while read LINE; do
ARRAY=("$LINE")
done
echo "$ARRAY"
IFS の値を空にするとか。
#!/bin/sh -

IFS=
exec < file.tsv
while read LINE; do
ARRAY=($LINE)
done
echo $ARRAY

441 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/02(土) 10:16:16.70 .net]
あ,5ch ってコード貼るのまずいんだっけ。しくったな。
まあこんなくだらないコードに著作権云々関係ないかw

442 名前:名無しさん@お腹いっぱい。 [2017/12/02(土) 10:37:47.62 .net]
>>433
bash なら mapfile がある(別名 readarray)
-t オプションで各行末尾の改行を取除く

mapfile -t ARRAY <file.tsv

443 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/03(日) 07:15:44.68 .net]
早速検証してみます、ありがとうございます!

444 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/05(火) 08:37:43.17 .net]
検証した結果、IFSを改行のみにして読み込み、その文字列をCutで抜くで達成できました
こうしないと空文字の列が詰まってしまいました

IFS_BAK=IFS
IFS=$'&#165;n'
exec < file.tsv
while read LINE
do
echo "${LINE}" | cut -f1 >> tmp1.txt
echo "${LINE}" | cut -f2 >> tmp2.txt
done
IFS=IFS_BAK

445 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/05(火) 09:20:20.37 .net]
>>438
重箱の隅を突くようで悪いが,その書き方をするならシェバンは #!/usr/bin/bash
にしておけ。
$'string' は Bash の独自拡張だった気がする。

446 名前:433 [2017/12/06(水) 10:04:48.53 .net]
>>433
今ごろ勘違いに気づいた
mapfileじゃ全然見当外れじゃないか…なんかごめん

たとえば
IFS=$'\t'
line="${IFS}b"
このとき
a=(${line})

a=("" "b")
となるのを期待しているのだけど、実際にはクオートしていないので
a=( b)
と同じことになって、先頭の「空の列」は残らない
かといってクオートしたら
a=("${line}")
これはタブ区切りで分割されることなく行全体がそのままになるので意味がない…

ということだよね
>>438のようにファイルに書き出すだけなら、そう

447 名前:やってcutでやるのが扱いやすそうだけど

もしどうしても配列にする必要があるときは、こんな感じでどうだろう
https://ideone.com/uPfCwc
空だと消えてしまうなら空にならないよう何か入れとけばいいじゃない(配列にしてから取り除く)
という案
[]
[ここ壊れてます]



448 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/11(月) 05:34:31.40 .net]
>>440
回答が遅れてすみませんでした

なるほど…その手はいけるんですね
ありがとうございます、活用させていただきます
自分は今回縛りがあってbashだけでやっているのですが、可能なら他のスクリプトに任すべきかな…(´・ω・`)

449 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/14(木) 00:31:41.37 .net]
そこは「他のシェルに」じゃないか






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<268KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef