シェルスクリプト総合 その24at UNIX
シェルスクリプト総合 その24 - 暇つぶし2ch900:880
15/07/19 11:47:38.55 .net
おおお!ありがとうございます。できました。
まことに感謝です

901:名無しさん@お腹いっぱい。
15/07/19 15:45:46.71 .net
var=$( command 1 | command 2 )
で、command 1とcommand 2のエラーレベルを取得数方法てありますか?
$?やPIPESTATUSではうまくいきませんでした。

902:名無しさん@お腹いっぱい。
15/07/19 16:44:41.05 .net
var=$( command 1 | command 2; echo ${PIPESTATUS[@]} >&2 )

903:名無しさん@お腹いっぱい。
15/07/19 19:00:45.99 .net
error_evel=(${PIPESTATUS[@]})
といった具合に格納したいのですが、できそうですか?
思いつかないです

904:名無しさん@お腹いっぱい。
15/07/19 19:16:46.14 .net
command 1 | command 2 > hoge
error_evel=(${PIPESTATUS[@]})
var=$(cat hoge); rm hoge

905:名無しさん@お腹いっぱい。
15/07/19 20:37:20.22 .net
var=$(command 1 | command; echo ${PIPESTATUS[@]})
error_evel=$(echo "$var" | tail -1)
var=$(echo "$var" | sed '$d')

906:名無しさん@お腹いっぱい。
15/07/19 22:00:11.98 .net
fun () {
 echo abc
}
# 1
res = "$(fun)"
# 2
res = `fun`

質問です。#1 と #2 は両方とも関数funの返り値を受け取って変数resへ代入していますが、
両方に特別な違いはあるのでしょうか?
見た目の好みの問題でどちらを使ってもよいものでしょうか?

907:名無しさん@お腹いっぱい。
15/07/19 23:16:03.23 .net
前者は純正シェルに拘ってるキチガイに絡まれる。

908:名無しさん@お腹いっぱい。
15/07/19 23:26:38.65 .net
>>906
$() は `` だから、"$(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

909:名無しさん@お腹いっぱい。
15/07/20 05:43:37.07 .net
$ echo $(echo $(echo hage))
hage
$ echo `echo `echo hage``
echo hage
後者は`echo `と``の中身がコマンドとして解釈されてこれは空っぽで、残ったecho hageが単純な文字列としてechoされるのかw

910:名無しさん@お腹いっぱい。
15/07/22 16:37:21.58 .net
いつも、変数取得と\rの消去をgrepと変数展開で
hoge=$(grep foo /bar/bar2)
hoge2=${hoge%?}
としているのですけど、?だとwinで作られたテキストか確認しなければ怖いのです。
\r、\r\n、^M、^M$では消せなかったです。
sedやtr使えばいいのですが、変数展開のほうが速いので
変数展開で安心して使いたいのです。
どうすればうまくできますか?

911:名無しさん@お腹いっぱい。
15/07/22 17:20:17.87 .net
grepで複数行がマッチすることはないのかな

912:名無しさん@お腹いっぱい。
15/07/22 17:30:47.13 .net
r=$(printf '\xd')
ってやっておいて
hoge2=${hoge%$r}

913:名無しさん@お腹いっぱい。
15/07/22 17:43:05.00 .net
>>911
もちろん、やるときにはgrep -m 1やってます
>>912
パターンを作ってしまえばいいのか


914:名無しさん@お腹いっぱい。
15/07/31 19:13:47.94 .net
すみません、自分用メモです
sedを使った改行を挟んだ置換
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

915:名無しさん@お腹いっぱい。
15/07/31 19:14:46.10 .net
あと、printfがわかっていないので質問させてください。
>>912のr=$(printf '\xd')は、r=$(printf '\r')や$(echo -e '\r')ではまずいのでしょうか?
\xdはどういう意味なのですか?
もし、LFをprintfで作るときには$(printf '\n')、echoで作るときには$(echo -e '\n')で大丈夫なのでしょうか?

916:名無しさん@お腹いっぱい。
15/08/02 06:43:49.16 .net
>>915
echoでやってもいいよ。ただシェルによってechoの-eオプションが要ったり要らなかったりするから、
printfならどちらでも動くと。xdは16進の0xdの意味。

917:名無しさん@お腹いっぱい。
15/08/02 13:55:04.46 .net
ありがとうございます
うちのechoのmanみたら-e使えませんでした。
でも、bashのechoを見たらつかえました。
実感できました。
LFならxaになるんですね。

918:名無しさん@お腹いっぱい。
15/08/05 12:50:25.59 .net
grep "hogehoge" | head -1

919:名無しさん@お腹いっぱい。
15/08/05 18:34:40.69 .net
>>918 は誰に何を言いたいのだろうか?
grep -m 1 知らない人?

920:名無しさん@お腹いっぱい。
15/08/05 18:42:34.72 .net
>>914をマネして
a
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の改行から解放されると思ったのに。

921:名無しさん@お腹いっぱい。
15/08/05 18:54:13.85 .net
>>919
2つのプログラムの呼び出し、メモリ増といいことが見えない
しかも上にgrep -m 1 があるのに
誤爆か、シェルの覚えたてじゃないか
直後の>>919はいい勉強になるのでは

922:名無しさん@お腹いっぱい。
15/08/05 19:18:30.92 .net
>>921
脳メモリの節約

923:名無しさん@お腹いっぱい。
15/08/06 03:47:34.20 .net
むしろフィルタ指向のスクリプトを入れると最適化して、パイプの段数を減らしたスクリプトを吐いてくれるような
賢いオプティマイザ誰か作ってくれないかな?

924:名無しさん@お腹いっぱい。
15/08/06 09:43:47.44 .net
細かいオプション憶える負担を人に負わせるより、パイプ1段増やす方が合理的。

925:名無しさん@お腹いっぱい。
15/08/06 13:25:47.04 .net
head -1 は老害互換性オプション。
正しくは
head -n 1
新規作成スクリプトでは head -1 形式で記述してはいけない

926:名無しさん@お腹いっぱい。
15/08/06 13:48:36.71 .net
ケースバイケース

927:名無しさん@お腹いっぱい。
15/08/06 14:02:13.45 .net
動くからいいや

928:名無しさん@お腹いっぱい。
15/08/06 14:08:49.62 .net
head -1 を使わせないためにせっかくmanからも記述削除してあるのに。。

929:名無しさん@お腹いっぱい。
15/08/06 14:57:15.89 .net
manなんて読まんよ
実装を変えないと

930:名無しさん@お腹いっぱい。
15/08/06 15:33:08.88 .net
実装は互換性のためにあえて変えてない。既存スクリプト用。

931:名無しさん@お腹いっぱい。
15/08/06 16:03:54.91 .net
実装変わらなきゃ使う人なくならんね

932:名無しさん@お腹いっぱい。
15/08/06 16:32:44.92 .net
歴史的経緯をなかったことにはできない。unixなんだから

933:名無しさん@お腹いっぱい。
15/08/06 17:20:14.83 .net
誰か>>920に答えてください

934:名無しさん@お腹いっぱい。
15/08/06 17:37:16.74 .net
/abc/ が何を意味するのか調べなさい

935:名無しさん@お腹いっぱい。
15/08/06 17:41:57.71 .net
>>920
echo "a\nb\nc" | perl -0pe 's/a\nb\nc/d\ne\nf/m'

936:名無しさん@お腹いっぱい。
15/08/06 19:10:26.14 .net
すみませんが詳しい方のみ回答をお願いします

937:名無しさん@お腹いっぱい。
15/08/06 19:59:57.71 .net
>>933
tr abc def < hoge.txt

938:名無しさん@お腹いっぱい。
15/08/06 20:41:41.66 .net
>>937
そりゃだめだ
連続していない1つの文字単位も置換される

939:名無しさん@お腹いっぱい。
15/08/06 21:54:19.38 .net
GNU sed で。
$ 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

940:名無しさん@お腹いっぱい。
15/08/06 22:34:13.24 .net
素直にsedで^a$だったら次の行を読み込み
それが^b$だったらまた次の行を読み込み
それが^c$だったら、ってやったらいいんでないの?
というか、エディタで読み込んで置換した方が早いよ

941:名無しさん@お腹いっぱい。
15/08/07 00:33:41.83 .net
具体的にどうやればいい?

942:名無しさん@お腹いっぱい。
15/08/07 01:07:39.20 .net
エディタによる

943:名無しさん@お腹いっぱい。
15/08/07 01:44:15.54 .net
emacsなら
$ 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

944:名無しさん@お腹いっぱい。
15/08/07 07:44:33.04 .net
それだと
aa
b
c
も変換しちゃう

945:名無しさん@お腹いっぱい。
15/08/07 10:05:54.63 .net
^を付けましょう

946:名無しさん@お腹いっぱい。
15/08/07 10:47:56.80 .net
取り止めがないというかちょっと流動的な対応が必要な内容なんだけど
動画のファイル名に「第x話」とか「#x」、「第x章」と付いてるやつを
ゼロパディングして桁数をそろえたいんだ
「第1話」→「第01話」
何かお勧めのコマンドある?
まあ普通に考えるとsedなんだけど誤変換怖いから
今は手動で変更してるんだ

947:名無しさん@お腹いっぱい。
15/08/07 11:05:53.06 .net
printfがあるやつなら2桁対応でいいんじゃないか?
echo "第2章" | perl -ne 'if (/第(\d)章/){printf "第%02d章", "$1"}'
第02章
echo "第12章" | perl -ne 'if (/第(\d+)章/){printf "第%02d章", "$1"}'
第12章

948:名無しさん@お腹いっぱい。
15/08/07 11:31:16.58 .net
>>946
第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

949:名無しさん@お腹いっぱい。
15/08/07 13:49:06.35 .net
すみませんが詳しい方のみ回答をお願いします

950:名無しさん@お腹いっぱい。
15/08/07 13:52:45.45 .net
>>948
>第x話などのxの部分を切り出せるなら
核心の部分を飛ばしてどうするw
頭に0付けだけなら printf %03d $num とかで一発でできるよw (そこは問題じゃない)

951:名無しさん@お腹いっぱい。
15/08/07 14:36:35.67 .net
>>946の内容だけでは何に困難を感じているのかがわからない
1) 第x話や#x、第x章のxを切り出すよい方法がわからないのか、それとも
2) ゼロパディングする方法がわからないのか
もし1)なら、ゼロパディングする方法は関係ないし
もし2)なら、xを切り出す方法は関係ない
>核心の部分を飛ばしてどうするw
と言っている>>950は、したがって>>946さんの問題は1)だと解釈したことになる。
もし1)が「核心の問題」であるのなら
>>946さんはなぜ「ゼロパディングして桁数を揃えたい」と書いたのだろう?
ということで、>>946さんに何をしたいかもうちょっと具体的に言ってもらう必要があると思うよ。

952:名無しさん@お腹いっぱい。
15/08/07 15:09:50.57 .net
いや、sedでゴニョゴニョすればできるのは知ってるけどそれだと誤動作が恐いから、
すでにそういう第x話とかの変換に対応した専用コマンドはないか?という質問だから。
答えは、「ない」

953:名無しさん@お腹いっぱい。
15/08/07 15:47:21.26 .net
誤変換が恐いなら確認してから走らせればいいん者ね?
sed -n 's/ごにょ/ごにょ/p'
で変更部分だけ出力されるから、
大丈夫なら sed -i 入れて実行

954:名無しさん@お腹いっぱい。
15/08/07 15:50:28.93 .net
>普通に考えるとsedなんだけど誤変換怖い
どんな場面で誤変換になるの?

955:名無しさん@お腹いっぱい。
15/08/07 17:03:38.05 .net
シェルスクリプトだけで、ツイッターのBot動かしている人っていますか?

956:名無しさん@お腹いっぱい。
15/08/07 17:33:51.82 .net
>>952
そんな単一用途を求める時点でシェルスクリプトである必要ない
あなたにはファイル名変換君がお似合いです

957:名無しさん@お腹いっぱい。
15/08/07 19:52:08.40 .net
動かしている人がいるかどうかを聞いてるんです

958:名無しさん@お腹いっぱい。
15/08/07 20:25:15.45 .net
そんな事どこで聞いてるんだ?

959:名無しさん@お腹いっぱい。
15/08/07 21:15:22.11 .net
>>953
ふつうはそういうことしてからここで質問するよね
>>954
どんな誤変換か自分も知りたい

960:名無しさん@お腹いっぱい。
15/08/08 12:09:25.42 .net
第1章-序章.mp4
:
第5章-ホゲホゲ34歳の不倫part1.mp4
第6章-ホゲホゲ34歳の不倫part2.mp4
:
とか??

961:名無しさん@お腹いっぱい。
15/08/08 19:30:56.99 .net
grepに、Pオプションなんてあったのか。sedにも欲しいスイッチだ

962:名無しさん@お腹いっぱい。
15/08/08 21:18:40.90 .net
>>961
先読み・後読みが使えるのは便利

963:名無しさん@お腹いっぱい。
15/08/09 07:15:54.88 .net
#cat a.txt
aaaaa 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)


964:名無しさん@お腹いっぱい。
15/08/09 07:42:06.61 .net
a.txtの最後に改行が入ってるから

965:名無しさん@お腹いっぱい。
15/08/09 07:46:01.85 .net
つーかこんなのprintf "aaaaa " > a.txtからやれよ
何をやりたいんだよ
なんでa.txtがどういう状態か分かるんだよ

966:名無しさん@お腹いっぱい。
15/08/09 07:58:50.20 .net
rootで実行するなよw

967:名無しさん@お腹いっぱい。
15/08/09 10:00:28.82 .net
>>966
なんで?

968:名無しさん@お腹いっぱい。
15/08/09 10:04:18.10 .net
本来いじられたくないrootでしか編集できないファイルを簡単に上書くから

969:名無しさん@お腹いっぱい。
15/08/09 16:18:41.93 .net
rootでしか編集できないファイルをいじるスクリプトを書いてるのかもしれない

970:名無しさん@お腹いっぱい。
15/08/09 18:08:05.24 .net
>>963 みたいな質問する奴にroot権限渡すな

971:名無しさん@お腹いっぱい。
15/08/10 12:25:15.29 .net
昔は共同浴場みたいな感じで番台の管理者さんに断って
みんなで風呂に過いるイメージだったけど、今は家風呂
個人の管理ってイメージだから、ユーザ=rootの時代だよね。
そう言う意味ではUNIXそのものの考え方をパーソナルに考え直す
という手間暇を惜しんだところが負けだと思うわ。

972:名無しさん@お腹いっぱい。
15/08/10 20:06:59.81 .net
UNIXベースのOSは過去最高に一般人に普及してるんだけどなにに負けたんだ?

973:名無しさん@お腹いっぱい。
15/08/11 01:39:01.94 .net
わかってるくせにw

974:名無しさん@お腹いっぱい。
15/08/11 08:56:44.41 .net
>>972
androidをUNIXベースと考えるかどうかで勝敗は変わるんじゃないの?

975:名無しさん@お腹いっぱい。
15/08/11 11:03:46.05 .net
iOSだってUNIXだよ

976:名無しさん@お腹いっぱい。
15/08/11 13:12:49.80 .net
windowsだってunixかもしれないよ

977:名無しさん@お腹いっぱい。
15/08/11 13:15:39.19 .net
ケンタッキーフライドチキンもUNIXだしな

978:名無しさん@お腹いっぱい。
15/08/11 13:41:34.72 .net
POSIX互換なのはWindows2000までだっけ

979:名無しさん@お腹いっぱい。
15/08/11 22:28:27.88 .net
美容室もUNIXだしな

980:名無しさん@お腹いっぱい。
15/08/12 01:15:37.26 .net
>>971
sudoは答えの一つだと思うがどうか?

981:名無しさん@お腹いっぱい。
15/08/12 07:34:06.58 .net
単にインストールして設定して満足って人が多くなったからだろう
そりゃrootしか使わんわ
でもWindowsとかアドミン権限じゃないユーザで使ってる人結構多くて
いい意味でびっくりすることがある

982:名無しさん@お腹いっぱい。
15/08/12 10:29:07.02 .net
個人ユースなんてサーバー用途だが多いだろうからログインするとき=rootじゃなきゃ出来ない作業をするときじゃないか?

983:名無しさん@お腹いっぱい。
15/08/12 11:18:27.54 .net
いやちがう
管理者がいないから自分が管理者なだけ

984:名無しさん@お腹いっぱい。
15/08/12 11:23:24.46 .net
>個人ユースなんてサーバー用途だが多い
んなこたーない

985:名無しさん@お腹いっぱい。
15/08/12 12:47:36.66 .net
sudo を使うことすら面倒くさいと言うのか…

986:名無しさん@お腹いっぱい。
15/08/12 13:36:17.12 .net
何の話だったっけ

987:名無しさん@お腹いっぱい。
15/08/12 14:25:02.72 .net
cshからbashに移行した場合
.cshrcってターミナル起動した時に読み込まれなくなってしまいますか?

988:名無しさん@お腹いっぱい。
15/08/12 14:54:50.56 .net
コマンド打つ

#になってないと実行できないコマンドだった

コマンド打ち直す

最初から#

コマンド打つ

確実に成功

後者のほうが効率がよい

989:名無しさん@お腹いっぱい。
15/08/12 15:03:47.83 .net
以下の結果を出力するシェルを,bashスクリプトで書け.
(基本仕様)
・コマンドとして実行できる.(シェルコマンドである.)
・ユーザーが10000以上99999以下の5桁の数字を入力する.
・その数字を7で割って1余り,かつ13で割って2余った場合は Daikichiと表示する.
・それ以外で,13で割って2余った場合は Chuukichiと表示する.
・それ以外で,7で割って1余った場合は Shoukichiと表示する.
・それ以外の場合は Hazureと表示する.
・入力した文字が10000以上99999以下の数字以外の場合はエラーメッセージを表示する.
・できる人は,コマンドライン引数でDaikichiなどの文字を変更できるようにする.
(ポイント)
☆シェルコマンドにするには,スクリプトの最初に(#!で始まる)おまじないを書く.
☆標準入力から文字列を入力するには read を用いる.
☆コマンドラインの引数は,$@に格納されている.(その要素は $1 $2 ...)
☆四則演算には $(( )) コマンドが使用できる.(ただし,整数しか扱えない.)

誰かわかるひとお願いします

990:名無しさん@お腹いっぱい。
15/08/12 15:54:32.72 .net
>>989
来年はちゃんと授業聞こうな

991:名無しさん@お腹いっぱい。
15/08/12 17:01:02.35 .net
私は講師です。ちょっと問題の反応を見たいのでここで聞いてみてるんですが、、

992:名無しさん@お腹いっぱい。
15/08/12 17:11:49.67 .net
お盆休みはきちんと休んだほうがいい

993:名無しさん@お腹いっぱい。
15/08/12 17:24:59.92 .net
> 誰かわかるひとお願いします
> 私は講師です。
講師CCO騙るにしてもこれは酷いw
遊びたかったら人狼逝け

994:名無しさん@お腹いっぱい。
15/08/12 18:07:03.66 .net
なんで私が出した課題がここに貼られてるんですかね

995:名無しさん@お腹いっぱい。
15/08/12 20:18:03.71 .net
bashでスクリプト書かせるなよ。

996:名無しさん@お腹いっぱい。
15/08/12 20:45:32.93 .net
RANDOM使っちゃえよ
結果だけならどうせバレない

997:名無しさん@お腹いっぱい。
15/08/12 21:26:42.33 .net
>>995
なんで?

998:名無しさん@お腹いっぱい。
15/08/12 22:53:02.21 .net
>>991
ユーザーの入力が標準入力である、
というのが問題中に載ってないのは
よくないと思う。直しておいて。

999:名無しさん@お腹いっぱい。
15/08/13 00:25:40.34 .net
>>987
文法がそもそも違う
>>995
#!/bin/sh
ruby <<< EOF
puts("Daikichi")
EOF
#とかでもよくね

1000:名無しさん@お腹いっぱい。
23/11/23 19:54:52.67 mNysEr30Y
test


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch