1 名前:名無しさん@お腹いっぱい。 mailto:sageteoff [2015/08/14(金) 23:42:01.51 .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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。 前スレ シェルスクリプト総合 その24 peace.2ch.net/test/read.cgi/unix/1415634843/
930 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/02/18(土) 04:37:58.77 .net] #!/bin/bash echo A > test.txt ; echo B >> test.txt ARRAY=$(cat test.txt) for item in ${ARRAY[@]}; do echo $item done としたら A B と表示されるので、$ARRAYは 2個の要素を持つ配列になったのだと思っていました。 ところが要素数を echo ${#ARRAY[@]} で表示させたら 1 が表示されます。 $ARRAYは配列になっていないのでしょうか? だとすると、なぜ for item … で表示されたのか?
931 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/02/18(土) 04:55:39.09 .net] indexも表示させればわかるよ echo A > test.txt; echo B >> test.txt ARRAY=$(cat /tmp/test.txt) for (( i=0; i<${#ARRAY[@]}; i++ )) do printf "ARRAY index:%d value:%s\n" "$i" "${ARRAY[i]}" done readarray -t ARRAY2 < <(cat /tmp/test.txt) for (( i=0; i<${#ARRAY2[@]}; i++ )) do printf "ARRAY2 index:%d value:%s\n" "$i" "${ARRAY2[i]}" done
932 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/02/18(土) 05:52:55.03 .net] >>914 readarray -t ARRAY < <(cat test.txt) で綺麗に配列として読まれますね。 これでいま作っている自作ツールが完成出来ます。 ありがとうございます
933 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/02/18(土) 09:43:20.54 .net] 最初の例のやつ、多分配列になってないんじゃないか
934 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/02/18(土) 14:18:47.86 .net] >>916 #!/bin/bash echo A > test.txt ; echo B >> test.txt ARRAY=$(cat test.txt) N=1 for item in ${ARRAY[@]}; do echo ARRAY[$N]=$item N=$(($N + 1)) done としたら ARRAY[1]=A ARRAY[2]=B と表示されて、配列になっているようです
935 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/02/18(土) 16:02:36.82 .net] >>917 それは配列になってるんじゃなくてforループで一つ目の要素がsplitされてるだけ echo A > test.txt ; echo B C >> test.txt みたいにスペースなんかが入ると対処できないからそういうコードはやめたほうがいい for item in "${ARRAY[@]}"; do ってクウォートすると結果変わるでしょ? あと”<(cat test.txt)”は比較のために書いただけでcatしなくても大丈夫 readarray -t ARRAY < test.txt while readするかreadarray(=mapfile)使うか mywiki.wooledge.org/BashFAQ/005#Loading_lines_from_a_file_or_stream
936 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/02/18(土) 17:07:28.86 .net] >>918 > それは配列になってるんじゃなくてforループで一つ目の要素がsplitされてるだけ > for item in "${ARRAY[@]}"; do ってクウォートすると結果変わるでしょ? なるほど。 配列になっていないのと、検証の方法が間違っていたことがよく理解出来ました。 > echo A > test.txt ; echo B C >> test.txt みたいにスペースなんかが入ると対処できないからそういうコードはやめたほうがいい 気を付けます。 > あと”<(cat test.txt)”は比較のために書いただけでcatしなくても大丈夫 > readarray -t ARRAY < test.txt > while readするかreadarray(=mapfile)使うか > mywiki.wooledge.org/BashFAQ/005#Loading_lines_from_a_file_or_stream ありがとうございます。 もっと勉強します
937 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/02/20(月) 13:16:49.47 .net] >>919 [user@f25 ~]$ ARRAY=$(cat test.txt) [user@f25 ~]$ declare -p ARRAY declare -- ARRAY="A B" [user@f25 ~]$ readarray -t ARRAY < test.txt [user@f25 ~]$ declare -p ARRAY declare -a ARRAY='([0]="A" [1]="B")'
938 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/02/20(月) 18:00:26.41 .net] >>920 declare -p !!! 知らなんだ
939 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/02/20(月) 18:11:16.14 .net] このスレ来ると度々便利な知識得られるからいいわ grep -oとか
940 名前:名無しさん@お腹いっぱい。 [2017/02/21(火) 05:20:06.32 .net] 配列にするなら ARRAY=( $(cat test.txt) )
941 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/02/21(火) 16:45:06.28 .net] >>923 echo A > test.txt ; echo B C >> test.txt みたいにスペースなんかが入ると…
942 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/02/21(火) 19:03:20.01 .net] IFS=$'\n' ARRAY=( $(cat test.txt) ) declare -p ARRAY とすれば空白混じりの行も1行として扱われるが、 空行(何も文字が無い行)は$ARRAYに読み込まれない readarray -t ARRAY < test.txt declare -p ARRAY だと空行も読み込んでくれる
943 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/02/28(火) 23:57:54.64 .net] echo test | grep a みたいな時に終了コードはgrepこの場合1 でかつ標準出力にはtestが出ていて欲しいのですが どうしたらいいでしょうか? 環境はbashです
944 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/01(水) 00:40:42.45 .net] echo test | tee /dev/tty | grep a でどうだろう?
945 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/01(水) 00:57:07.01 .net] 終了コード1のときにはその文字列を表示したいとかによって違う気がする。 常に入力をそのまま出力していいのだろうか。
946 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/01(水) 01:36:33.88 .net] 仕様を細かく詰めてない気がするけど とりあえず echo test | ( grep -v a; exit $(expr \( "$?" + 1 \) % 2 ))
947 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/01(水) 02:35:11.20 .net] みなさん、ありがとうございます echo の部分は常に表示、grepは結果のみ欲しいので-qで、判定につかうインプットは常に全量表示して、結果はリターンコード、標準出力は人が見るよう、リターコードはその後のシステム的な分岐につかう的な目的です(後続はbashの世界でないのでワンライナーが嬉しい)
948 名前:名無しさん@お腹いっぱい。 [2017/03/01(水) 05:09:32.29 .net] macのsipsコマンドについて質問しても大丈夫ですか? 例えば-zと-sを一緒に実行して--out でフォルダに書き出したいとして どういうルールで並べて記述すればいいでしょうか? sips -Z 200 * -s format jpeg --out Converted/ あれこれいじって、たまたまこれで動いたのですが 正しいのかわかりません。 よろしくお願いします。スレチだったらすいません。
949 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/01(水) 09:20:45.49 .net] >>930 grep にこだわらくても良くて、GNU sed を使ってもいい場合: $ echo test | sed '/a/!q1' test $ echo $? 1
950 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/01(水) 09:22:21.87 .net] >>931 正しいけどスレチ man見ろ 見られないんなら https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sips.1.html
951 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/01(水) 09:41:41.92 .net] 要求満たしつつ個人的に好きなのは>>927
952 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/01(水) 09:50:14.78 .net] 「標準出力」じゃないから要求満たしてないんじゃない?
953 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/01(水) 10:04:09.41 .net] >>931 そういえばこういうスレもあったり 【Macintosh】MacでUNIX【Terminal】 echo.2ch.net/test/read.cgi/unix/1123501408/ mac板でよかった気もするけど OS XをUnixとして使ってる人の為のスレ 18 potato.2ch.net/test/read.cgi/mac/1462475819/
954 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/01(水) 10:17:52.51 .net] >>932 あ、間違えた…こうしないと $ echo test | sed -n 'p;/a/H;${x;/./q0;q1}'
955 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/01(水) 12:19:32.48 .net] echo test | awk '/a/{x=1}//END{exit !x}'
956 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/01(水) 17:16:16.75 .net] $ echo test | awk '/a/{x=1}{print}END{exit !x}' じゃないの?
957 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/01(水) 17:36:55.41 .net] $ echo test | grep -B10000 -A10000 a
958 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/01(水) 17:38:08.89 .net] あああ、1行もマッチしないとダメだ
959 名前:名無しさん@お腹いっぱい。 [2017/03/01(水) 21:54:56.86 .net] >>933 >>936 スレチにもかかわらずありがとうございました!
960 名前:名無しさん@お腹いっぱい。 [2017/03/04(土) 09:13:31.42 .net] >>931 うちでもよく使うが、sips なんて他には無いからな for i *.jpg; do sips -Z 200 $i -s format jpeg --out Converted/$i; done ところでマカーな人はbash4入れてるんですかね。bash3なので、最近ココで出てくるreadarrayが使えない
961 名前:名無しさん@お腹いっぱい。 [2017/03/04(土) 09:17:20.48 .net] あー in が抜けてる for i in *.jpg ; do な
962 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/04(土) 10:32:40.92 .net] ImageMagickのconvertみたいなものか
963 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/04(土) 18:32:17.60 .net] >>943 >ところでマカーな人はbash4入れてるんですかね。 Homebrewで入れてそっち使うようにしてる
964 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/07(火) 19:02:41.56 .net] いつもシェルが使える環境ある? 自分は仕事ならcygwin(今は使ってない)、実機、仮想環境 プライベートならラズパイ、仮想環境かな
965 名前:名無しさん@お腹いっぱい。 [2017/03/07(火) 22:43:56.07 .net] Mac
966 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/07(火) 23:30:24.96 .net] 俺はスマホにzsh入れてるけど
967 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/08(水) 01:50:34.93 .net] >>947 SL-Zaurus(SL-C860)を今だに現役で使っているよ
968 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/09(木) 02:31:23.57 .net] そういうのって ただ書けるだけじゃなくて動かせたり 実際にその機械で便利に使えたりするのですか?
969 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/09(木) 17:50:34.83 .net] pythonの出力をシェルの変数にするにはどうやれできますか? x=$( python test.py ) はダメでした
970 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/09(木) 17:58:17.55 .net] $ cat test.py print("Hello world!") $ python test.py Hello world! $ x=$(python test.py) $ echo $x Hello world!
971 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/10(金) 09:16:11.80 .net] あれ?そうだよなと思ったら、pythonの文字コードの扱いが変でした シェルごめんよ
972 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/10(金) 13:07:41.33 .net] pythonのせいにするのもどうかと
973 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/10(金) 16:08:16.57 .net] pythonは文字コード周り落とし穴が多いすぎ pythonのせい
974 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/11(土) 22:32:29.75 .net] $@から$1を除いたものを関数に渡す方法を教えてくだしあ
975 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/11(土) 22:46:42.79 .net] shiftするしかないんじゃないかな 呼出し後に元に戻したいとするとsetかな
976 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/11(土) 23:06:24.73 .net] 呼び出し先でshiftすりゃいいじゃん
977 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/12(日) 00:12:25.14 .net] せやな!
978 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/12(日) 01:47:16.95 .net] >>957 bash なら "${@:2}" でええんちゃう
979 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/12(日) 04:14:35.39 .net] >>961 その発想もなかった パラメータとして渡すならこっちの方が分かりやすいな
980 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/12(日) 19:17:36.56 .net] ずっと、行の抜き出しはprcegrepを使ってたげど sed -n -e '/hoge1/,/hoge2/p' これでできるのを、今知って感動中。しかも、こっちの方が速い。 そのあとの置換は sed -n -e '/hoge1/,/hoge2/p' | sed -e 's/foo/bar/g' としかできなかったけど sed -n -e '/hoge1/,/hoge2/p' -e 's/foo/bar/g' で、やる方法とかであるんですか?
981 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/12(日) 20:09:10.06 .net] sed -n -e 's/foo/bar/g' -e '/hoge1/,/hoge2/p' じゃだめなの?
982 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/12(日) 20:49:35.74 .net] sed -ne '/hoge1/,/hoge2/{s/foo/bar/g;p;}' でもいけそう
983 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/13(月) 15:22:55.40 .net] sedスレあるのに忘れられてそうw
984 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/13(月) 17:19:42.05 .net] sed -e '/hoge1/,/hoge2/!d' -e 's/foo/bar/g'
985 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/13(月) 19:49:20.42 .net] ありがとうございます さらに速くなりました 一番最後の文字はコマンドというのを実感
986 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/13(月) 20:38:32.02 .net] sedは-n使ったら負け
987 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/15(水) 13:36:43.93 .net] なんで?
988 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/15(水) 13:37:42.13 .net] うるさい! 俺が負けだって言ったら負けなんだよ 大人しく言う事聞け
989 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/15(水) 13:43:38.36 .net] なんだそのダメな親みたいな言い分は
990 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/15(水) 13:45:42.22 .net] むしろジャイアンかな
991 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/15(水) 16:27:57.38 .net] pでプリントした行は元質問にもあるようにストリームを流れて行かない、 お漏らししたようなものだからね
992 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/15(水) 18:03:51.07 .net] sed だと、後方参照の時にバックスラッシュでエスケープしまくることになるのがどうにも… それで、いつの間にか perl を代わりに使うようになった。
993 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/15(水) 19:02:59.32 .net] sedでできることをperlでやるのは微妙に悔しいw
994 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/15(水) 20:28:01.98 .net] sed -e "s/微妙に/非常に/" >976
995 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/15(水) 20:45:20.13 .net] 入力なくね?
996 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/15(水) 20:58:18.06 .net] 考えすぎ
997 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/16(木) 12:44:27.48 .net] >>978 sed -e "s/微妙に/非常に/" <975 >976 ってやって空のファイルを作ってしまったあの頃...
998 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/16(木) 12:47:16.46 .net] 分からんでもない
999 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/16(木) 16:23:09.20 .net] 最初に head/tail、grep、sort 辺りを処理の都合上先にやることが多いので、 sed の入力にはパイプを使うことが多いかな。
1000 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/16(木) 22:48:37.43 .net] 日本語下手かw
1001 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/18(土) 22:25:35.75 .net] grepしてsedは素人
1002 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/18(土) 23:27:17.30 .net] なんで?
1003 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/19(日) 00:04:19.09 .net] sedだけでできるからかと
1004 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/19(日) 00:24:39.59 .net] grepである程度簡単なワードで絞ってからのほうが、複雑な置換は早そうだけど
1005 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/19(日) 00:57:36.33 .net] 実験して見せられるまで性能に関する予想は信じない
1006 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/19(日) 01:06:54.08 .net] まぁこじらせた人にてみればその手間は実に腹立つだろうな
1007 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/19(日) 10:07:51.17 .net] 「ひとつのことを上手くやる」から考えると、grep してから sed の方がマッチしてそう
1008 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/19(日) 11:41:33.99 .net] windowsのdos窓は使えるけれど、grep、sed、awk、perlなどはなし。当然他のスクリプト言語もなし。 さらに、新たなソフトのインスコはできない。 まあ、notepadでソースの編集はできる。 Eドライブには多くのフォルダがあって、中にはjpegのえろ画像が1テラ分てんこ盛り えろ画像だけを全部Dドライブにコピーしたい。 Eドライブのフォルダを見ると8階層ぐらいのフォルダもあって、とても手作業のコピペはムリ。 にゃんとか目的を達成する方法はないであろうか?! 各位のお知恵を拝借したい。
1009 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/19(日) 13:00:13.49 .net] powershell でも使えばいいんじゃないかな
1010 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/19(日) 14:12:15.82 .net] ここじゃなくてもっと他に聞くべき所があるだろうな
1011 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/19(日) 20:18:27.47 .net] その環境的な制限がありつつ、エロ画像を扱うという状況が想像できないな 仕事でエロ画像を扱ってるか上司の個人環境とかかな
1012 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/19(日) 20:31:39.22 .net] robocopyでコピーすれば良い
1013 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/19(日) 20:55:37.07 .net] >>988 GNU grep + GNU awk の場合だけど、GNU awk単独よりも早いらしいぞ papiro.hatenablog.jp/entry/2015/05/19/003432
1014 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/19(日) 22:03:55.18 .net] ドライブを別のPCからアクセス可能にしたらいいのに
1015 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/19(日) 23:09:48.69 .net] >>996 timeの使い方を知らないって事を自慢してどうしたいんだ?
1016 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/19(日) 23:10:46.82 .net] エロ画像に寛容なUNIX板
1017 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/20(月) 10:44:19.74 .net] >>994 昔社内から netnews が見れてたので perl でスクリプト組んでエロ画像落としまくってたのをふと思い出した 当時は普通にFDに移動して持ち帰ってたけど
1018 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/20(月) 12:06:05.49 .net] 俺にはもうFDってのがもうすごいわ
1019 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています