シェルスクリプト総合 その24©5ch.net
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net
2014/11/11(火) 00:54:03.43□お約束
・特記なき場合は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.opensolaris.org/source/xref/onnv/onnv-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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その23
http://peace.2ch.net/test/read.cgi/unix/1404204950/
0872名無しさん@お腹いっぱい。
2015/07/13(月) 13:50:39.03クォートの対応、良く見ろよ
sed -e 's/foo/foo_"$f"/g' ←じゃなくて
sed -e 's/foo/foo_'"$f"'/g'
な。' 'を一回閉じてから" "を開き直す。スペースを空けずに。
0873名無しさん@お腹いっぱい。
2015/07/13(月) 16:07:08.780874名無しさん@お腹いっぱい。
2015/07/13(月) 17:05:32.16というか$fだけをダブルクォートでも問題ないのかな?
0875名無しさん@お腹いっぱい。
2015/07/13(月) 20:53:18.320876名無しさん@お腹いっぱい。
2015/07/13(月) 23:15:54.08全部ダブルでええやん
0877名無しさん@お腹いっぱい。
2015/07/13(月) 23:41:43.94/aaa/,$ 文字列aaaとマッチする行から行末まで次のコマンドを適用
s/"$f"/bbbb/g シェル変数$fとマッチした文字列をbbbbに置き換えるコマンド
全体をダブルクォートしたら$sがシェル変数として解釈されちゃうからいやん
0878名無しさん@お腹いっぱい。
2015/07/13(月) 23:50:57.720879名無しさん@お腹いっぱい。
2015/07/14(火) 03:14:11.34sed -e 's/foo/foo_'"$f"'/g'
でいけました。
クォートの挙動の勉強になりました。
ありとうございます。
0880名無しさん@お腹いっぱい。
2015/07/18(土) 11:58:15.66何故でしょう。わかる方いますか
$ postmulti -i hogehoge -e destroy
postmulti: fatal: No instance named hogehoge
上のように、Noという文字列が出力されたら処理をしたいので
$ postmulti -i hogehoge -e destroy 2>&1 | grep No
$
とするが、ヒットしない。
0881名無しさん@お腹いっぱい。
2015/07/18(土) 12:10:12.95* 何か間違えている。
前者は
$ postmulti -i hogehoge -e destroy >/dev/null
$ postmulti -i hogehoge -e destroy 2>/dev/null
で確認すれば良い。
0882名無しさん@お腹いっぱい。
2015/07/18(土) 12:21:00.88fdの1,2以外とか/dev/tty直接に出力されてるなら素通りの表示はされるはず。
なので、postmultiが出力がパイプの場合は出力を自分で抑制してるのかも。
0883名無しさん@お腹いっぱい。
2015/07/18(土) 12:29:23.710884880
2015/07/18(土) 13:58:51.80>>882
$ postmulti -i hogehoge -e destroy >/dev/null
postmulti: fatal: No instance named hogehoge
$ postmulti -i hogehoge -e destroy 2>/dev/null
$
確認すると、こんな感じ
なので確実に2番ですよね
だが、ファイルに書き出しても
$ postmulti -i hogehoge -e destroy 2>output
$ cat output
なにもでない。
>>883
そうなんですか。
ちょっと調べてみます
0885名無しさん@お腹いっぱい。
2015/07/18(土) 14:55:40.11Linux で以下を実行すると output ファイルにエラーメッセージが
書き込まれている。
$ echo 'int isatty(int fd) { return 1; }' | gcc -xc -shared -o isatty.so -
$ LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH LD_PRELOAD=isatty.so postmulti -v -i hogehoge -e destroy 2>output
0886名無しさん@お腹いっぱい。
2015/07/18(土) 17:24:55.19ありがとうございます!
上のコード理解してきました。そういうことなのですね。
一応ソースも確認したけど、その通りでした
postfix-3.0.1: ./src/postmulti/postmulti.c
1684 if (isatty(STDERR_FILENO))
1685 msg_vstream_init(argv[0], VSTREAM_ERR);
1686 msg_syslog_init(argv[0], LOG_PID, LOG_FACILITY);
isatty()を外から騙せるか試行錯誤してますが、だめならそのまま
利用させていただきます!
0887名無しさん@お腹いっぱい。
2015/07/18(土) 23:59:07.25で実行すればいいかも。
expect -c 'spawn pstmulti -i hogehoge -e destroy ; expect eof' | grep No
0888名無しさん@お腹いっぱい。
2015/07/19(日) 00:06:30.73例文の方は正しいです。
0889880
2015/07/19(日) 11:47:38.55まことに感謝です
0890名無しさん@お腹いっぱい。
2015/07/19(日) 15:45:46.71で、command 1とcommand 2のエラーレベルを取得数方法てありますか?
$?やPIPESTATUSではうまくいきませんでした。
0891名無しさん@お腹いっぱい。
2015/07/19(日) 16:44:41.050892名無しさん@お腹いっぱい。
2015/07/19(日) 19:00:45.99といった具合に格納したいのですが、できそうですか?
思いつかないです
0893名無しさん@お腹いっぱい。
2015/07/19(日) 19:16:46.14error_evel=(${PIPESTATUS[@]})
var=$(cat hoge); rm hoge
0894名無しさん@お腹いっぱい。
2015/07/19(日) 20:37:20.22error_evel=$(echo "$var" | tail -1)
var=$(echo "$var" | sed '$d')
0895名無しさん@お腹いっぱい。
2015/07/19(日) 22:00:11.98echo abc
}
# 1
res = "$(fun)"
# 2
res = `fun`
質問です。#1 と #2 は両方とも関数funの返り値を受け取って変数resへ代入していますが、
両方に特別な違いはあるのでしょうか?
見た目の好みの問題でどちらを使ってもよいものでしょうか?
0896名無しさん@お腹いっぱい。
2015/07/19(日) 23:16:03.230897名無しさん@お腹いっぱい。
2015/07/19(日) 23:26:38.65$() は `` だから、"$(fun)" は "`fun`" で等価
違いは ’’はネストできないけど $() はネストできる
$ echo `date -r `pwd``
date: オプションには引数が必要です -- 'r'
Try 'date --help' for more information.
pwd
※これは echo $(date -r)pwd$()になってしまう
$ echo $(date -r $(pwd))
xxxx年 x月 x日 火曜日 xx:xx:xx JST
0898名無しさん@お腹いっぱい。
2015/07/20(月) 05:43:37.07hage
$ echo `echo `echo hage``
echo hage
後者は`echo `と``の中身がコマンドとして解釈されてこれは空っぽで、残ったecho hageが単純な文字列としてechoされるのかw
0899名無しさん@お腹いっぱい。
2015/07/22(水) 16:37:21.58hoge=$(grep foo /bar/bar2)
hoge2=${hoge%?}
としているのですけど、?だとwinで作られたテキストか確認しなければ怖いのです。
\r、\r\n、^M、^M$では消せなかったです。
sedやtr使えばいいのですが、変数展開のほうが速いので
変数展開で安心して使いたいのです。
どうすればうまくできますか?
0900名無しさん@お腹いっぱい。
2015/07/22(水) 17:20:17.870901名無しさん@お腹いっぱい。
2015/07/22(水) 17:30:47.13ってやっておいて
hoge2=${hoge%$r}
0902名無しさん@お腹いっぱい。
2015/07/22(水) 17:43:05.00もちろん、やるときにはgrep -m 1やってます
>>901
パターンを作ってしまえばいいのか
d
0903名無しさん@お腹いっぱい。
2015/07/31(金) 19:13:47.94sedを使った改行を挟んだ置換
abcd
efg
を
aaaefgに
sed '/abcd/N;s/abcd\n/aaa/g' hoge.txt
abcd
efg
を
aaa
bbbに
LF=$(printf '\\\n_'); LF=${LF%_}
sed '/abcd/N;s/abcd\nefg/aaa'"$LF"'bbb/g' hoge.txt
0904名無しさん@お腹いっぱい。
2015/07/31(金) 19:14:46.10>>901のr=$(printf '\xd')は、r=$(printf '\r')や$(echo -e '\r')ではまずいのでしょうか?
\xdはどういう意味なのですか?
もし、LFをprintfで作るときには$(printf '\n')、echoで作るときには$(echo -e '\n')で大丈夫なのでしょうか?
0905名無しさん@お腹いっぱい。
2015/08/02(日) 06:43:49.16echoでやってもいいよ。ただシェルによってechoの-eオプションが要ったり要らなかったりするから、
printfならどちらでも動くと。xdは16進の0xdの意味。
0906名無しさん@お腹いっぱい。
2015/08/02(日) 13:55:04.46うちのechoのmanみたら-e使えませんでした。
でも、bashのechoを見たらつかえました。
実感できました。
LFならxaになるんですね。
0907名無しさん@お腹いっぱい。
2015/08/05(水) 12:50:25.590908名無しさん@お腹いっぱい。
2015/08/05(水) 18:34:40.69grep -m 1 知らない人?
0909名無しさん@お腹いっぱい。
2015/08/05(水) 18:42:34.72a
b
c
を
d
e
f
にしようと
LF=$(printf '\\\n_'); LF=${LF%_}
sed '/abc/N;s/a\nb\nc/d'"$LF"'e'"$LF"'f/g' hoge.txt
をしたけど、ダメでした。
どうしてなんですか?どうすればいいのですか?
sedの改行から解放されると思ったのに。
0910名無しさん@お腹いっぱい。
2015/08/05(水) 18:54:13.852つのプログラムの呼び出し、メモリ増といいことが見えない
しかも上にgrep -m 1 があるのに
誤爆か、シェルの覚えたてじゃないか
直後の>>908はいい勉強になるのでは
0911名無しさん@お腹いっぱい。
2015/08/05(水) 19:18:30.92脳メモリの節約
0912名無しさん@お腹いっぱい。
2015/08/06(木) 03:47:34.20賢いオプティマイザ誰か作ってくれないかな?
0913名無しさん@お腹いっぱい。
2015/08/06(木) 09:43:47.440914名無しさん@お腹いっぱい。
2015/08/06(木) 13:25:47.04正しくは
head -n 1
新規作成スクリプトでは head -1 形式で記述してはいけない
0915名無しさん@お腹いっぱい。
2015/08/06(木) 13:48:36.710916名無しさん@お腹いっぱい。
2015/08/06(木) 14:02:13.450917名無しさん@お腹いっぱい。
2015/08/06(木) 14:08:49.620918名無しさん@お腹いっぱい。
2015/08/06(木) 14:57:15.89実装を変えないと
0919名無しさん@お腹いっぱい。
2015/08/06(木) 15:33:08.880920名無しさん@お腹いっぱい。
2015/08/06(木) 16:03:54.910921名無しさん@お腹いっぱい。
2015/08/06(木) 16:32:44.920922名無しさん@お腹いっぱい。
2015/08/06(木) 17:20:14.830923名無しさん@お腹いっぱい。
2015/08/06(木) 17:37:16.740924名無しさん@お腹いっぱい。
2015/08/06(木) 17:41:57.71echo "a\nb\nc" | perl -0pe 's/a\nb\nc/d\ne\nf/m'
0925名無しさん@お腹いっぱい。
2015/08/06(木) 19:10:26.140926名無しさん@お腹いっぱい。
2015/08/06(木) 19:59:57.71tr abc def < hoge.txt
0927名無しさん@お腹いっぱい。
2015/08/06(木) 20:41:41.66そりゃだめだ
連続していない1つの文字単位も置換される
0928名無しさん@お腹いっぱい。
2015/08/06(木) 21:54:19.38$ tr '\n' '\0' < hoge.txt | sed -r 's/(^|\x00)a\x00b\x00c\x00/\1d\x00e\x00f\x00/g' | tr '\0' '\n'
でもこの場合、連続する "a\nb\nc\n" の置換ができない。
a\nb\nc\na\nb\nc\n => d\ne\nf\na\nb\nc\n
0929名無しさん@お腹いっぱい。
2015/08/06(木) 22:34:13.24それが^b$だったらまた次の行を読み込み
それが^c$だったら、ってやったらいいんでないの?
というか、エディタで読み込んで置換した方が早いよ
0930名無しさん@お腹いっぱい。
2015/08/07(金) 00:33:41.830931名無しさん@お腹いっぱい。
2015/08/07(金) 01:07:39.200932名無しさん@お腹いっぱい。
2015/08/07(金) 01:44:15.54$ cat /tmp/elisp.el
(replace-regexp "a\nb\nc\n" "d\ne\nf\n")
(save-buffer)
(save-buffers-kill-terminal)
$ emacs hoge.txt -l /tmp/elisp.el
0933名無しさん@お腹いっぱい。
2015/08/07(金) 07:44:33.04aa
b
c
も変換しちゃう
0934名無しさん@お腹いっぱい。
2015/08/07(金) 10:05:54.630935名無しさん@お腹いっぱい。
2015/08/07(金) 10:47:56.80動画のファイル名に「第x話」とか「#x」、「第x章」と付いてるやつを
ゼロパディングして桁数をそろえたいんだ
「第1話」→「第01話」
何かお勧めのコマンドある?
まあ普通に考えるとsedなんだけど誤変換怖いから
今は手動で変更してるんだ
0936名無しさん@お腹いっぱい。
2015/08/07(金) 11:05:53.06echo "第2章" | perl -ne 'if (/第(\d)章/){printf "第%02d章", "$1"}'
第02章
echo "第12章" | perl -ne 'if (/第(\d+)章/){printf "第%02d章", "$1"}'
第12章
0937名無しさん@お腹いっぱい。
2015/08/07(金) 11:31:16.58第x話などのxの部分を切り出せるなら
case $num in
[1-9]) num=0$num ;;
0*) ;;
esac
echo $num
3桁なら
case $num in
[1-9]) num=00$num ;;
[1-9][0-9]) num=0$num ;;
0*) ;;
esac
echo $num
0938名無しさん@お腹いっぱい。
2015/08/07(金) 13:49:06.350939名無しさん@お腹いっぱい。
2015/08/07(金) 13:52:45.45>第x話などのxの部分を切り出せるなら
核心の部分を飛ばしてどうするw
頭に0付けだけなら printf %03d $num とかで一発でできるよw (そこは問題じゃない)
0940名無しさん@お腹いっぱい。
2015/08/07(金) 14:36:35.671) 第x話や#x、第x章のxを切り出すよい方法がわからないのか、それとも
2) ゼロパディングする方法がわからないのか
もし1)なら、ゼロパディングする方法は関係ないし
もし2)なら、xを切り出す方法は関係ない
>核心の部分を飛ばしてどうするw
と言っている>>939は、したがって>>935さんの問題は1)だと解釈したことになる。
もし1)が「核心の問題」であるのなら
>>935さんはなぜ「ゼロパディングして桁数を揃えたい」と書いたのだろう?
ということで、>>935さんに何をしたいかもうちょっと具体的に言ってもらう必要があると思うよ。
0941名無しさん@お腹いっぱい。
2015/08/07(金) 15:09:50.57すでにそういう第x話とかの変換に対応した専用コマンドはないか?という質問だから。
答えは、「ない」
0942名無しさん@お腹いっぱい。
2015/08/07(金) 15:47:21.26sed -n 's/ごにょ/ごにょ/p'
で変更部分だけ出力されるから、
大丈夫なら sed -i 入れて実行
0943名無しさん@お腹いっぱい。
2015/08/07(金) 15:50:28.93どんな場面で誤変換になるの?
0944名無しさん@お腹いっぱい。
2015/08/07(金) 17:03:38.050945名無しさん@お腹いっぱい。
2015/08/07(金) 17:33:51.82そんな単一用途を求める時点でシェルスクリプトである必要ない
あなたにはファイル名変換君がお似合いです
0946名無しさん@お腹いっぱい。
2015/08/07(金) 19:52:08.400947名無しさん@お腹いっぱい。
2015/08/07(金) 20:25:15.450948名無しさん@お腹いっぱい。
2015/08/07(金) 21:15:22.11ふつうはそういうことしてからここで質問するよね
>>943
どんな誤変換か自分も知りたい
0949名無しさん@お腹いっぱい。
2015/08/08(土) 12:09:25.42:
第5章-ホゲホゲ34歳の不倫part1.mp4
第6章-ホゲホゲ34歳の不倫part2.mp4
:
とか??
0950名無しさん@お腹いっぱい。
2015/08/08(土) 19:30:56.990951名無しさん@お腹いっぱい。
2015/08/08(土) 21:18:40.90先読み・後読みが使えるのは便利
0952名無しさん@お腹いっぱい。
2015/08/09(日) 07:15:54.88aaaaa bbbbb ccccc
#printf "ddddd " >> a.txt
#cat a.txt
aaaaa bbbbb ccccc
ddddd
#printf "eeeee " >> a.txt
#printf "fffff " >> a.txt
#printf "ggggg " >> a.txt
#cat a.txt
aaaaa bbbbb ccccc
ddddd eeeee fffff ggggg
なんで1回目の追記のときだけ改行が入っちゃうの? 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
0953名無しさん@お腹いっぱい。
2015/08/09(日) 07:42:06.610954名無しさん@お腹いっぱい。
2015/08/09(日) 07:46:01.85何をやりたいんだよ
なんでa.txtがどういう状態か分かるんだよ
0955名無しさん@お腹いっぱい。
2015/08/09(日) 07:58:50.200956名無しさん@お腹いっぱい。
2015/08/09(日) 10:00:28.82なんで?
0957名無しさん@お腹いっぱい。
2015/08/09(日) 10:04:18.100958名無しさん@お腹いっぱい。
2015/08/09(日) 16:18:41.930959名無しさん@お腹いっぱい。
2015/08/09(日) 18:08:05.240960名無しさん@お腹いっぱい。
2015/08/10(月) 12:25:15.29みんなで風呂に過いるイメージだったけど、今は家風呂
個人の管理ってイメージだから、ユーザ=rootの時代だよね。
そう言う意味ではUNIXそのものの考え方をパーソナルに考え直す
という手間暇を惜しんだところが負けだと思うわ。
0961名無しさん@お腹いっぱい。
2015/08/10(月) 20:06:59.810962名無しさん@お腹いっぱい。
2015/08/11(火) 01:39:01.940963名無しさん@お腹いっぱい。
2015/08/11(火) 08:56:44.41androidをUNIXベースと考えるかどうかで勝敗は変わるんじゃないの?
0964名無しさん@お腹いっぱい。
2015/08/11(火) 11:03:46.050965名無しさん@お腹いっぱい。
2015/08/11(火) 13:12:49.800966名無しさん@お腹いっぱい。
2015/08/11(火) 13:15:39.190967名無しさん@お腹いっぱい。
2015/08/11(火) 13:41:34.720968名無しさん@お腹いっぱい。
2015/08/11(火) 22:28:27.880969名無しさん@お腹いっぱい。
2015/08/12(水) 01:15:37.26sudoは答えの一つだと思うがどうか?
0970名無しさん@お腹いっぱい。
2015/08/12(水) 07:34:06.58そりゃrootしか使わんわ
でもWindowsとかアドミン権限じゃないユーザで使ってる人結構多くて
いい意味でびっくりすることがある
0971名無しさん@お腹いっぱい。
2015/08/12(水) 10:29:07.02レス数が950を超えています。1000を超えると書き込みができなくなります。