シェルスクリプト総合 その25©5ch.net
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net
2015/08/14(金) 23:42:01.51□お約束
・特記なき場合は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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その24
http://peace.2ch.net/test/read.cgi/unix/1415634843/
0895名無しさん@お腹いっぱい。
2017/02/14(火) 10:11:22.080896名無しさん@お腹いっぱい。
2017/02/14(火) 10:13:38.180897名無しさん@お腹いっぱい。
2017/02/14(火) 10:35:53.640x5C を含む漢字でしょ、「表」とか
だったら read -r line で
0898名無しさん@お腹いっぱい。
2017/02/14(火) 10:44:50.39KOREDAAAAA!!!
ありがとう兄貴
ちなみに構造って感じでつまづいてた
SJIS扱うのは古いプロジェクトならよくあることよ
0899名無しさん@お腹いっぱい。
2017/02/14(火) 10:54:10.92UTF8とかだと回避出来るんかなこれは
0900名無しさん@お腹いっぱい。
2017/02/14(火) 11:54:23.78これが世代というものなんですね……
0901894
2017/02/14(火) 13:40:31.07にしても意外なほどググっても出ないな、それほどマイナーなのかこの症状
もしくは当たり前すぎるのか
0902名無しさん@お腹いっぱい。
2017/02/14(火) 15:20:01.03sjis ダメ文字でググればごろごろと
0904名無しさん@お腹いっぱい。
2017/02/14(火) 15:40:03.34もう少しやったな
0905894
2017/02/14(火) 16:05:30.25特定の漢字が文字化けってあたりの記事から推察して、SJISがなんかマズイってとこにはたどり着いたかもしれんが、多分それでもread -rには気づかなかったと思うわ
iconv -t utf8してたと思う
0906名無しさん@お腹いっぱい。
2017/02/14(火) 17:11:17.24iconv を利用するのはアリだと思うよ。
業務系のシェルスクリプトでも「SJIS データを一時的に UTF-8 にコンバートして何らかの処理をした後に SJIS に戻す」という手法で実装することがある。
0908名無しさん@お腹いっぱい。
2017/02/14(火) 20:50:41.080909名無しさん@お腹いっぱい。
2017/02/15(水) 01:22:16.710910名無しさん@お腹いっぱい。
2017/02/15(水) 01:34:33.21iconvならきっとなんとかしてくれる
0911名無しさん@お腹いっぱい。
2017/02/15(水) 04:53:01.40そう、iconvならね
0912名無しさん@お腹いっぱい。
2017/02/18(土) 04:37:58.77echo 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 … で表示されたのか?
0913名無しさん@お腹いっぱい。
2017/02/18(土) 04:55:39.09echo 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
0914名無しさん@お腹いっぱい。
2017/02/18(土) 05:52:55.03readarray -t ARRAY < <(cat test.txt)
で綺麗に配列として読まれますね。
これでいま作っている自作ツールが完成出来ます。
ありがとうございます
0915名無しさん@お腹いっぱい。
2017/02/18(土) 09:43:20.540916名無しさん@お腹いっぱい。
2017/02/18(土) 14:18:47.86#!/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
と表示されて、配列になっているようです
0917名無しさん@お腹いっぱい。
2017/02/18(土) 16:02:36.82それは配列になってるんじゃなくて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)使うか
http://mywiki.wooledge.org/BashFAQ/005#Loading_lines_from_a_file_or_stream
0918名無しさん@お腹いっぱい。
2017/02/18(土) 17:07:28.86> それは配列になってるんじゃなくて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)使うか
> http://mywiki.wooledge.org/BashFAQ/005#Loading_lines_from_a_file_or_stream
ありがとうございます。
もっと勉強します
0919名無しさん@お腹いっぱい。
2017/02/20(月) 13:16:49.47[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")'
0920名無しさん@お腹いっぱい。
2017/02/20(月) 18:00:26.41declare -p !!!
知らなんだ
0921名無しさん@お腹いっぱい。
2017/02/20(月) 18:11:16.14grep -oとか
0922名無しさん@お腹いっぱい。
2017/02/21(火) 05:20:06.32ARRAY=( $(cat test.txt) )
0923名無しさん@お腹いっぱい。
2017/02/21(火) 16:45:06.28echo A > test.txt ; echo B C >> test.txt みたいにスペースなんかが入ると…
0924名無しさん@お腹いっぱい。
2017/02/21(火) 19:03:20.01ARRAY=( $(cat test.txt) )
declare -p ARRAY
とすれば空白混じりの行も1行として扱われるが、
空行(何も文字が無い行)は$ARRAYに読み込まれない
readarray -t ARRAY < test.txt
declare -p ARRAY
だと空行も読み込んでくれる
0925名無しさん@お腹いっぱい。
2017/02/28(火) 23:57:54.64みたいな時に終了コードはgrepこの場合1
でかつ標準出力にはtestが出ていて欲しいのですが
どうしたらいいでしょうか?
環境はbashです
0926名無しさん@お腹いっぱい。
2017/03/01(水) 00:40:42.45でどうだろう?
0927名無しさん@お腹いっぱい。
2017/03/01(水) 00:57:07.01常に入力をそのまま出力していいのだろうか。
0928名無しさん@お腹いっぱい。
2017/03/01(水) 01:36:33.88echo test | ( grep -v a; exit $(expr \( "$?" + 1 \) % 2 ))
0929名無しさん@お腹いっぱい。
2017/03/01(水) 02:35:11.20echo の部分は常に表示、grepは結果のみ欲しいので-qで、判定につかうインプットは常に全量表示して、結果はリターンコード、標準出力は人が見るよう、リターコードはその後のシステム的な分岐につかう的な目的です(後続はbashの世界でないのでワンライナーが嬉しい)
0930名無しさん@お腹いっぱい。
2017/03/01(水) 05:09:32.29例えば-zと-sを一緒に実行して--out でフォルダに書き出したいとして
どういうルールで並べて記述すればいいでしょうか?
sips -Z 200 * -s format jpeg --out Converted/
あれこれいじって、たまたまこれで動いたのですが
正しいのかわかりません。
よろしくお願いします。スレチだったらすいません。
0931名無しさん@お腹いっぱい。
2017/03/01(水) 09:20:45.49grep にこだわらくても良くて、GNU sed を使ってもいい場合:
$ echo test | sed '/a/!q1'
test
$ echo $?
1
0932名無しさん@お腹いっぱい。
2017/03/01(水) 09:22:21.87正しいけどスレチ
man見ろ
見られないんなら
https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sips.1.html
0933名無しさん@お腹いっぱい。
2017/03/01(水) 09:41:41.920934名無しさん@お腹いっぱい。
2017/03/01(水) 09:50:14.780935名無しさん@お腹いっぱい。
2017/03/01(水) 10:04:09.41そういえばこういうスレもあったり
【Macintosh】MacでUNIX【Terminal】
http://echo.2ch.net/test/read.cgi/unix/1123501408/
mac板でよかった気もするけど
OS XをUnixとして使ってる人の為のスレ 18
http://potato.2ch.net/test/read.cgi/mac/1462475819/
0936名無しさん@お腹いっぱい。
2017/03/01(水) 10:17:52.51あ、間違えた…こうしないと
$ echo test | sed -n 'p;/a/H;${x;/./q0;q1}'
0937名無しさん@お腹いっぱい。
2017/03/01(水) 12:19:32.480938名無しさん@お腹いっぱい。
2017/03/01(水) 17:16:16.75じゃないの?
0939名無しさん@お腹いっぱい。
2017/03/01(水) 17:36:55.410940名無しさん@お腹いっぱい。
2017/03/01(水) 17:38:08.890942名無しさん@お腹いっぱい。
2017/03/04(土) 09:13:31.42うちでもよく使うが、sips なんて他には無いからな
for i *.jpg; do sips -Z 200 $i -s format jpeg --out Converted/$i; done
ところでマカーな人はbash4入れてるんですかね。bash3なので、最近ココで出てくるreadarrayが使えない
0943名無しさん@お腹いっぱい。
2017/03/04(土) 09:17:20.48for i in *.jpg ; do な
0944名無しさん@お腹いっぱい。
2017/03/04(土) 10:32:40.920945名無しさん@お腹いっぱい。
2017/03/04(土) 18:32:17.60>ところでマカーな人はbash4入れてるんですかね。
Homebrewで入れてそっち使うようにしてる
0946名無しさん@お腹いっぱい。
2017/03/07(火) 19:02:41.56自分は仕事ならcygwin(今は使ってない)、実機、仮想環境
プライベートならラズパイ、仮想環境かな
0947名無しさん@お腹いっぱい。
2017/03/07(火) 22:43:56.070948名無しさん@お腹いっぱい。
2017/03/07(火) 23:30:24.960949名無しさん@お腹いっぱい。
2017/03/08(水) 01:50:34.93SL-Zaurus(SL-C860)を今だに現役で使っているよ
0950名無しさん@お腹いっぱい。
2017/03/09(木) 02:31:23.57ただ書けるだけじゃなくて動かせたり
実際にその機械で便利に使えたりするのですか?
0951名無しさん@お腹いっぱい。
2017/03/09(木) 17:50:34.83x=$( python test.py )
はダメでした
0952名無しさん@お腹いっぱい。
2017/03/09(木) 17:58:17.55print("Hello world!")
$ python test.py
Hello world!
$ x=$(python test.py)
$ echo $x
Hello world!
0953名無しさん@お腹いっぱい。
2017/03/10(金) 09:16:11.80シェルごめんよ
0954名無しさん@お腹いっぱい。
2017/03/10(金) 13:07:41.330955名無しさん@お腹いっぱい。
2017/03/10(金) 16:08:16.57pythonのせい
0956名無しさん@お腹いっぱい。
2017/03/11(土) 22:32:29.750957名無しさん@お腹いっぱい。
2017/03/11(土) 22:46:42.79呼出し後に元に戻したいとするとsetかな
0958名無しさん@お腹いっぱい。
2017/03/11(土) 23:06:24.730959名無しさん@お腹いっぱい。
2017/03/12(日) 00:12:25.140960名無しさん@お腹いっぱい。
2017/03/12(日) 01:47:16.95bash なら "${@:2}" でええんちゃう
0961名無しさん@お腹いっぱい。
2017/03/12(日) 04:14:35.39その発想もなかった
パラメータとして渡すならこっちの方が分かりやすいな
0962名無しさん@お腹いっぱい。
2017/03/12(日) 19:17:36.56sed -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'
で、やる方法とかであるんですか?
0963名無しさん@お腹いっぱい。
2017/03/12(日) 20:09:10.06じゃだめなの?
0964名無しさん@お腹いっぱい。
2017/03/12(日) 20:49:35.74でもいけそう
0965名無しさん@お腹いっぱい。
2017/03/13(月) 15:22:55.400966名無しさん@お腹いっぱい。
2017/03/13(月) 17:19:42.050967名無しさん@お腹いっぱい。
2017/03/13(月) 19:49:20.42さらに速くなりました
一番最後の文字はコマンドというのを実感
0968名無しさん@お腹いっぱい。
2017/03/13(月) 20:38:32.020969名無しさん@お腹いっぱい。
2017/03/15(水) 13:36:43.930970名無しさん@お腹いっぱい。
2017/03/15(水) 13:37:42.13俺が負けだって言ったら負けなんだよ
大人しく言う事聞け
0971名無しさん@お腹いっぱい。
2017/03/15(水) 13:43:38.360972名無しさん@お腹いっぱい。
2017/03/15(水) 13:45:42.220973名無しさん@お腹いっぱい。
2017/03/15(水) 16:27:57.38お漏らししたようなものだからね
0974名無しさん@お腹いっぱい。
2017/03/15(水) 18:03:51.07それで、いつの間にか perl を代わりに使うようになった。
0975名無しさん@お腹いっぱい。
2017/03/15(水) 19:02:59.320976名無しさん@お腹いっぱい。
2017/03/15(水) 20:28:01.980977名無しさん@お腹いっぱい。
2017/03/15(水) 20:45:20.130978名無しさん@お腹いっぱい。
2017/03/15(水) 20:58:18.060979名無しさん@お腹いっぱい。
2017/03/16(木) 12:44:27.48sed -e "s/微妙に/非常に/" <975 >975
ってやって空のファイルを作ってしまったあの頃...
0980名無しさん@お腹いっぱい。
2017/03/16(木) 12:47:16.460981名無しさん@お腹いっぱい。
2017/03/16(木) 16:23:09.20sed の入力にはパイプを使うことが多いかな。
0982名無しさん@お腹いっぱい。
2017/03/16(木) 22:48:37.430983名無しさん@お腹いっぱい。
2017/03/18(土) 22:25:35.750984名無しさん@お腹いっぱい。
2017/03/18(土) 23:27:17.300985名無しさん@お腹いっぱい。
2017/03/19(日) 00:04:19.090986名無しさん@お腹いっぱい。
2017/03/19(日) 00:24:39.590987名無しさん@お腹いっぱい。
2017/03/19(日) 00:57:36.330988名無しさん@お腹いっぱい。
2017/03/19(日) 01:06:54.080989名無しさん@お腹いっぱい。
2017/03/19(日) 10:07:51.170990名無しさん@お腹いっぱい。
2017/03/19(日) 11:41:33.99さらに、新たなソフトのインスコはできない。
まあ、notepadでソースの編集はできる。
Eドライブには多くのフォルダがあって、中にはjpegのえろ画像が1テラ分てんこ盛り
えろ画像だけを全部Dドライブにコピーしたい。
Eドライブのフォルダを見ると8階層ぐらいのフォルダもあって、とても手作業のコピペはムリ。
にゃんとか目的を達成する方法はないであろうか?!
各位のお知恵を拝借したい。
0991名無しさん@お腹いっぱい。
2017/03/19(日) 13:00:13.490992名無しさん@お腹いっぱい。
2017/03/19(日) 14:12:15.820993名無しさん@お腹いっぱい。
2017/03/19(日) 20:18:27.47仕事でエロ画像を扱ってるか上司の個人環境とかかな
0994名無しさん@お腹いっぱい。
2017/03/19(日) 20:31:39.22レス数が950を超えています。1000を超えると書き込みができなくなります。