シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
探検
シェルスクリプト総合 その32
■ このスレッドは過去ログ倉庫に格納されています
2019/10/25(金) 00:08:45.53ID:6btPTvif
598デフォルトの名無しさん
2020/02/12(水) 17:58:00.53ID:44kLfG7j pv 使うとか
$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$ time { < /usr/bin/od od -A nx -t x1 -v; }
:
real 0m0.404s
user 0m0.024s
sys 0m0.005s
$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$ time { < /usr/bin/od od -A nx -t x1 -v | pv -q -L2M > /dev/null; }
real 0m0.458s
user 0m0.019s
sys 0m0.007s
$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$ time { < /usr/bin/od od -A nx -t x1 -v; }
:
real 0m0.404s
user 0m0.024s
sys 0m0.005s
$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$ time { < /usr/bin/od od -A nx -t x1 -v | pv -q -L2M > /dev/null; }
real 0m0.458s
user 0m0.019s
sys 0m0.007s
599デフォルトの名無しさん
2020/02/12(水) 21:18:18.55ID:ngmZ90wk600597
2020/02/13(木) 19:02:20.33ID:qpgEIAWv601デフォルトの名無しさん
2020/02/13(木) 19:45:08.54ID:d+A9Zjku 標準出力バッファを無効にして/dev/nullに送り込むと良いかも。知らんけど
602デフォルトの名無しさん
2020/02/15(土) 07:57:33.28ID:TqNhf8oX ていうかtimeで測った絶対速度なんてほとんど信用できなくて、(ハードウェアの状態なんかに依存するから)
使い道としては複数のコマンドどうしの相対速度の比較が主でしょう。
ならば、両方とも> /dev/nullに捨てておけば、相対速度としては変化しないから速度比較の目的は果たせるのでは。
使い道としては複数のコマンドどうしの相対速度の比較が主でしょう。
ならば、両方とも> /dev/nullに捨てておけば、相対速度としては変化しないから速度比較の目的は果たせるのでは。
603デフォルトの名無しさん
2020/02/15(土) 09:41:54.81ID:LBGCL7FY リダイレクトとfdは概ね理解したけど3以上はどう使えばいいんです?
1>や2>は自然と使い分けてるけど1>&3を使う機会なくて
&>の方がまだ出番ある
1>や2>は自然と使い分けてるけど1>&3を使う機会なくて
&>の方がまだ出番ある
604デフォルトの名無しさん
2020/02/15(土) 11:02:57.91ID:vIJrSTGq >>603
スクリプト開始時の stdout や stderr を保存しておくのに使うぐらいかなあ
# stdout を fd=3 にコピー
exec 3>&1
# fd=1,2 を foo.log にリダイレクト
exec > foo.log 2>&1
echo "foo.log に途中経過出力中です..." >&3
...
echo "処理B開始" >&3
...
echo "終了しました" >&3
スクリプト開始時の stdout や stderr を保存しておくのに使うぐらいかなあ
# stdout を fd=3 にコピー
exec 3>&1
# fd=1,2 を foo.log にリダイレクト
exec > foo.log 2>&1
echo "foo.log に途中経過出力中です..." >&3
...
echo "処理B開始" >&3
...
echo "終了しました" >&3
605デフォルトの名無しさん
2020/02/15(土) 13:14:38.75ID:QAGa8Flq bashの問題なのか知らんけど、
CRとかLFとかTABとかVTとかをどう解釈するかって
制御するフラグってあったりする?OSがらみの設定でもいいけど
CRとかLFとかTABとかVTとかをどう解釈するかって
制御するフラグってあったりする?OSがらみの設定でもいいけど
606デフォルトの名無しさん
2020/02/15(土) 14:59:47.10ID:7hJxIdg7607デフォルトの名無しさん
2020/02/15(土) 17:24:25.12ID:LBGCL7FY608デフォルトの名無しさん
2020/02/15(土) 22:02:17.95ID:7TGox9oB >>606
sttyコマンドなのかな?
詳細は言えないけど、"予め構築された特定の環境"のみおかしくなる
(どうやって構築されたかは公開されてない)
それと近いと思われる環境を自分で作っても再現できなくて困っている。
evalやコマンド置換と改行やタブ含めたホワイトスペースに属する文字を
使ったときにおかしくなってるのはわかるんだが
どうやったらこんな状況を作れるんだろうか。なぞだ。
sttyコマンドなのかな?
詳細は言えないけど、"予め構築された特定の環境"のみおかしくなる
(どうやって構築されたかは公開されてない)
それと近いと思われる環境を自分で作っても再現できなくて困っている。
evalやコマンド置換と改行やタブ含めたホワイトスペースに属する文字を
使ったときにおかしくなってるのはわかるんだが
どうやったらこんな状況を作れるんだろうか。なぞだ。
609デフォルトの名無しさん
2020/02/15(土) 23:22:52.25ID:FhP/kA+H 頭悪い奴ってのは、おかしくなったとかエラーになったとかいうだけで、
どうなったのかメッセージはなんなのか、そこを書かないのは何でだぜ
おかしいのはシステムじゃなくておまえの頭だろうという
どうなったのかメッセージはなんなのか、そこを書かないのは何でだぜ
おかしいのはシステムじゃなくておまえの頭だろうという
610デフォルトの名無しさん
2020/02/15(土) 23:28:09.90ID:7TGox9oB evalするときに何故か構文エラーが起きたり
ホワイトスペースがどこかで消えたりしている。
ホワイトスペースがどこかで消えたりしている。
611デフォルトの名無しさん
2020/02/15(土) 23:28:21.51ID:2teiXV5j >詳細は言えないけど
なんだろ。単なるチラ裏なことを長々とというだけの
対処する側なのにその前置きでエスパー求めるなんてありえないし
なんだろ。単なるチラ裏なことを長々とというだけの
対処する側なのにその前置きでエスパー求めるなんてありえないし
612デフォルトの名無しさん
2020/02/15(土) 23:28:41.71ID:7TGox9oB もちろんその環境以外ではそんな事は起きていない。
だから制御する方法があるのだろうと思ってるがわからない。
だから制御する方法があるのだろうと思ってるがわからない。
613デフォルトの名無しさん
2020/02/15(土) 23:31:04.26ID:2teiXV5j614デフォルトの名無しさん
2020/02/15(土) 23:31:40.17ID:7TGox9oB >>613
具体的に書くとまずいことがあるからわざとぼやかしてる
具体的に書くとまずいことがあるからわざとぼやかしてる
615デフォルトの名無しさん
2020/02/15(土) 23:32:15.43ID:2teiXV5j だったら、チラ裏なげえな
616デフォルトの名無しさん
2020/02/15(土) 23:33:17.78ID:7TGox9oB 短くしたら、お前が俺にレスさせるようにしただけ。
最初に詳細は言えないって書いてるんだから察しろ
最初に詳細は言えないって書いてるんだから察しろ
617デフォルトの名無しさん
2020/02/15(土) 23:36:08.92ID:2teiXV5j618デフォルトの名無しさん
2020/02/15(土) 23:38:36.70ID:7TGox9oB619デフォルトの名無しさん
2020/02/15(土) 23:40:02.90ID:2teiXV5j620デフォルトの名無しさん
2020/02/15(土) 23:50:22.01ID:7TGox9oB621デフォルトの名無しさん
2020/02/15(土) 23:52:28.65ID:cPtDrAlk /\___/\
/ / ヽ ::: \
| (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ,,ノ(、_, )ヽ、,, | < まーたはじまった
| ,;‐=‐ヽ .:::::| \_______
\ `ニニ´ .:::/
/`ー‐--‐‐―´´\
/ / ヽ ::: \
| (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ,,ノ(、_, )ヽ、,, | < まーたはじまった
| ,;‐=‐ヽ .:::::| \_______
\ `ニニ´ .:::/
/`ー‐--‐‐―´´\
622デフォルトの名無しさん
2020/02/15(土) 23:53:21.82ID:2teiXV5j 何を言っているのかなあ。意味不明すぎ
読めなさすぎだろう、独りよがりすぎだろう
読めなさすぎだろう、独りよがりすぎだろう
623デフォルトの名無しさん
2020/02/15(土) 23:57:25.05ID:7TGox9oB 理解能力がないという告白を見た瞬間w
624デフォルトの名無しさん
2020/02/16(日) 00:03:10.55ID:0ownCpNF >>609をみて、「頭悪いやつ〜おかしいのは〜お前の頭だろう」というのは言い過ぎだろう、わからないでもないけどw
てか「詳細は言えないけど」てあるやん、まあ、そういうことだろう。チラ裏だけどなw
ということで、611を書いた
そしたら、直前同時に610があった(それが609に反応してのなんて当たり前だろう。逆になんでそうじゃないと思うのか意味不明すぎ)
なんだかな、またふわっとしたことを。なので、613を書いた(アンカー付けるてるのはそゆことだよ)
そしたらならなんか616があったりしたが、まあ前後してたんだよ。そんなの当たり前にあるだろうに
>>623
お前は本当に自分視点しかなさすぎだぞ、マジでw
てか「詳細は言えないけど」てあるやん、まあ、そういうことだろう。チラ裏だけどなw
ということで、611を書いた
そしたら、直前同時に610があった(それが609に反応してのなんて当たり前だろう。逆になんでそうじゃないと思うのか意味不明すぎ)
なんだかな、またふわっとしたことを。なので、613を書いた(アンカー付けるてるのはそゆことだよ)
そしたらならなんか616があったりしたが、まあ前後してたんだよ。そんなの当たり前にあるだろうに
>>623
お前は本当に自分視点しかなさすぎだぞ、マジでw
625デフォルトの名無しさん
2020/02/16(日) 00:06:52.88ID:0ownCpNF 誤 そしたらならなんか616があったりしたが
正 そしたらならなんか612があったりしたが
正 そしたらならなんか612があったりしたが
626デフォルトの名無しさん
2020/02/16(日) 09:10:15.42ID:xg4O4sK0 sort -kについて正しく分かり易いサイトはないですか?
627デフォルトの名無しさん
2020/02/16(日) 12:16:49.32ID:O89bDljg628デフォルトの名無しさん
2020/02/16(日) 12:17:20.39ID:k2/UeE1A えいごなのでわかりやすくないです
629デフォルトの名無しさん
2020/02/16(日) 12:50:45.03ID:tUbalZD+630デフォルトの名無しさん
2020/02/16(日) 13:15:28.05ID:U5VJnWmt >>627
中国語の解説をご所望だそうだ
中国語の解説をご所望だそうだ
631デフォルトの名無しさん
2020/02/16(日) 14:38:33.35ID:O89bDljg おめーらイジワルだなw
632デフォルトの名無しさん
2020/02/16(日) 15:33:45.11ID:iNVxJNOu633デフォルトの名無しさん
2020/02/17(月) 08:01:59.15ID:ZjAffcZp 与えられた数字のファイルの行番号になにかを書き込むスクリプトってどう書くのが一番いいですかね。
一応 今 思い付いてるのは
与数をNNN,書き込む文字列をXXXとして
sed -n -e 'NNNs/.*/XXX/p'
↑こういうのかなと思ったんだけど
これだと新規ファイルを作成する目的には使えない…
一応 今 思い付いてるのは
与数をNNN,書き込む文字列をXXXとして
sed -n -e 'NNNs/.*/XXX/p'
↑こういうのかなと思ったんだけど
これだと新規ファイルを作成する目的には使えない…
634デフォルトの名無しさん
2020/02/17(月) 10:14:55.01ID:LO6gJc6j nl使えばいいだろ。POSIX標準の基本コマンド一覧見ろや
635デフォルトの名無しさん
2020/02/17(月) 10:37:47.88ID:ZjAffcZp >>634
nlにそんな機能あるの?
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/nl.html
↑ここ見る限り
指定した行になにかを書き込むなんていう機能なさそうなんだけど。
nlにそんな機能あるの?
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/nl.html
↑ここ見る限り
指定した行になにかを書き込むなんていう機能なさそうなんだけど。
636デフォルトの名無しさん
2020/02/17(月) 10:47:12.51ID:8g99SQEJ こういう事?
seq 10 | sed '5s/.*/& Here/'
seq 10 | sed '5s/.*/& Here/'
637デフォルトの名無しさん
2020/02/17(月) 11:12:00.77ID:ZjAffcZp638デフォルトの名無しさん
2020/02/17(月) 14:40:41.78ID:xPbhxlpI 配列に書いて要素番号と共に出力すれば
639デフォルトの名無しさん
2020/02/17(月) 14:53:39.21ID:qj5C8HtX おまえらよく
与えられた数字のファイルの行番号になにかを書き込むスクリプト
で何がいいたいのかわかるな
与えられた 数字のファイル の行番号なのか
与えられた数字 のファイルの行番号なのか
与えられた数字のファイル の行番号なのか
与えられた数字のファイルの行番号 なのか
さっぱりなんだがw
入力と出力の例を出せば、すぐに解決する問題だろうに
与えられた数字のファイルの行番号になにかを書き込むスクリプト
で何がいいたいのかわかるな
与えられた 数字のファイル の行番号なのか
与えられた数字 のファイルの行番号なのか
与えられた数字のファイル の行番号なのか
与えられた数字のファイルの行番号 なのか
さっぱりなんだがw
入力と出力の例を出せば、すぐに解決する問題だろうに
640デフォルトの名無しさん
2020/02/17(月) 14:56:06.69ID:qj5C8HtX > やりたいのは全部で何行必要か分からない状態で
> 次々に指定した行に文字列を書き込むってこと。
これもさっぱり
何行必要かわからないって、何の行数なのか
次々に指定した行って、どうやって指定するつもりなのか
示したスクリプトは別に10行という前提じゃなくても機能するし
元のファイルがないって、元のファイルってどのファイルだよ?
なければ作ればいいだけだろ?
> 次々に指定した行に文字列を書き込むってこと。
これもさっぱり
何行必要かわからないって、何の行数なのか
次々に指定した行って、どうやって指定するつもりなのか
示したスクリプトは別に10行という前提じゃなくても機能するし
元のファイルがないって、元のファイルってどのファイルだよ?
なければ作ればいいだけだろ?
641デフォルトの名無しさん
2020/02/17(月) 15:06:30.32ID:y136Nw0W 行ごとに何か処理したいならawkの出番なのでは?
642デフォルトの名無しさん
2020/02/17(月) 15:42:52.76ID:ZjAffcZp >>639
入力
linenumber=78
value='hoge huga'
linenumber=805
value='foo bar'
...
↓
出力
(空行)...
(78行目)hoge huga
(空行)...
(80行目)foo bar
こんな感じっすね。
入力は(この例では)変数に格納するような形式にしましたが
別にこれと決まった訳じゃないです。
入力
linenumber=78
value='hoge huga'
linenumber=805
value='foo bar'
...
↓
出力
(空行)...
(78行目)hoge huga
(空行)...
(80行目)foo bar
こんな感じっすね。
入力は(この例では)変数に格納するような形式にしましたが
別にこれと決まった訳じゃないです。
643デフォルトの名無しさん
2020/02/17(月) 15:45:24.56ID:ZjAffcZp >>641
うーん。それはまあ,sedでもawkでも同じことが言えますけど
どちらも既存のファイル(またはパイプ越しの既存の出力)に対しての行処理
が得意なんですよね。
一方いまやりたいことはファイルの新規作成であって
しかも最後まで行の総数が分からないという……
これはawkでどうにかするのは難しいのではと思います。
うーん。それはまあ,sedでもawkでも同じことが言えますけど
どちらも既存のファイル(またはパイプ越しの既存の出力)に対しての行処理
が得意なんですよね。
一方いまやりたいことはファイルの新規作成であって
しかも最後まで行の総数が分からないという……
これはawkでどうにかするのは難しいのではと思います。
644デフォルトの名無しさん
2020/02/17(月) 15:49:37.43ID:qj5C8HtX 行番号と文字列のペアが入ったデータ(ファイル)があって、
それに従って別のファイルの指定された行の頭に文字列を入れるってことね
ん?別のファイルの行の頭に文字列を入れるのか?
それとも単に、その出力通りに出すだけなのか?
その出力を作るだけなら簡単だろうけど・・・あーいやどちらも大差ないかw
それに従って別のファイルの指定された行の頭に文字列を入れるってことね
ん?別のファイルの行の頭に文字列を入れるのか?
それとも単に、その出力通りに出すだけなのか?
その出力を作るだけなら簡単だろうけど・・・あーいやどちらも大差ないかw
645デフォルトの名無しさん
2020/02/17(月) 15:50:05.60ID:P9Oy3OK5 先に行指定の最大値を取得すればええやろ?
646デフォルトの名無しさん
2020/02/17(月) 15:54:20.48ID:y136Nw0W それならもう無理せずperl,ruby,pythonあたりで書いたらいいんでないの?
647デフォルトの名無しさん
2020/02/17(月) 16:01:09.81ID:qj5C8HtX 入力ファイル形式を
78 hoge hug
805 foo bar
とする。行番号は小さい順に並んでいるものとする。
並んでいないならsortコマンドで並び替えられるのでどうでもいい
あとは、こんな感じのスクリプトを書いて
i=1
while read -r num string; do
while [ $i -lt "$num" ]; do
echo
i=$((i+1))
done
echo $string
i=$((i+1))
done
cat data.txt | script.sh とかすればいい
echoで空行出す所は、seqとかprintf '%s' "$@"とか使えば短くできるだろうな。
78 hoge hug
805 foo bar
とする。行番号は小さい順に並んでいるものとする。
並んでいないならsortコマンドで並び替えられるのでどうでもいい
あとは、こんな感じのスクリプトを書いて
i=1
while read -r num string; do
while [ $i -lt "$num" ]; do
echo
i=$((i+1))
done
echo $string
i=$((i+1))
done
cat data.txt | script.sh とかすればいい
echoで空行出す所は、seqとかprintf '%s' "$@"とか使えば短くできるだろうな。
648デフォルトの名無しさん
2020/02/17(月) 16:15:26.16ID:qj5C8HtX649デフォルトの名無しさん
2020/02/17(月) 16:25:32.91ID:qj5C8HtX 短くしてみた。バグとかはしらん
i=1 num=0
while [ "$i" -le "$num" ] || read -r num string; do
[ "$i" -eq "$num" ] && echo "$string" || echo " "
i=$((i+1))
done
i=1 num=0
while [ "$i" -le "$num" ] || read -r num string; do
[ "$i" -eq "$num" ] && echo "$string" || echo " "
i=$((i+1))
done
650デフォルトの名無しさん
2020/02/17(月) 16:31:22.20ID:2IQo7lRr >>637
どういうことをしたいのかよくわからんが、とりあえずtouchしておけばファイルは作れるんでないの?
どういうことをしたいのかよくわからんが、とりあえずtouchしておけばファイルは作れるんでないの?
651デフォルトの名無しさん
2020/02/17(月) 18:55:51.30ID:P9Oy3OK5 一旦配列に入れてからjoin風に出力
入力はsortされてなくても可
#! /usr/bin/env bash
while read -r num string; do
array[num]="$string"
done
index=( "${!array[@]}" )
for (( i=1; i<=${index[-1]}; i++)); do
if [ -v array["$i"] ];then
echo "${array[$i]}"
else
echo
fi
done
入力はsortされてなくても可
#! /usr/bin/env bash
while read -r num string; do
array[num]="$string"
done
index=( "${!array[@]}" )
for (( i=1; i<=${index[-1]}; i++)); do
if [ -v array["$i"] ];then
echo "${array[$i]}"
else
echo
fi
done
652デフォルトの名無しさん
2020/02/17(月) 21:12:48.06ID:ZjAffcZp >>650
いや,ただたんに新規作成したい訳じゃない…
いや,ただたんに新規作成したい訳じゃない…
653デフォルトの名無しさん
2020/02/18(火) 03:26:33.92ID:enVFBik2 Ruby で作った
以下のコードを、script.rb に保存して、
「ruby script.rb 行番号指定ファイル 入力ファイル」と実行する
ARGV[ 0 ] は、行番号指定ファイル
ARGV[ 1 ] は、入力ファイル
結果は、標準出力に出したので、ファイルへリダイレクトして下さい。
ただし、入力ファイルへはリダイレクトしないように!
行番号指定ファイルは「数字・半角空白・文字列」の順番です。
ただし、行は数字でソートされていること
3 あ い
7 ab
# 行番号指定ファイルを、[ 行番号, 文字列 ] の、2次元配列に読み込む。
# 1行ずつ処理する。末尾の改行を削除する
line_num_ary = File.foreach( ARGV[ 0 ], chomp: true ).with_object( [ ] ) do |line, ary|
tmp_ary = line.split( nil, 2 ) # 空白で、2つに分割する
tmp_ary[ 0 ] = Integer( tmp_ary[ 0 ], 10 ) # 数値型に変換する
ary.push tmp_ary
end
次へ続く
以下のコードを、script.rb に保存して、
「ruby script.rb 行番号指定ファイル 入力ファイル」と実行する
ARGV[ 0 ] は、行番号指定ファイル
ARGV[ 1 ] は、入力ファイル
結果は、標準出力に出したので、ファイルへリダイレクトして下さい。
ただし、入力ファイルへはリダイレクトしないように!
行番号指定ファイルは「数字・半角空白・文字列」の順番です。
ただし、行は数字でソートされていること
3 あ い
7 ab
# 行番号指定ファイルを、[ 行番号, 文字列 ] の、2次元配列に読み込む。
# 1行ずつ処理する。末尾の改行を削除する
line_num_ary = File.foreach( ARGV[ 0 ], chomp: true ).with_object( [ ] ) do |line, ary|
tmp_ary = line.split( nil, 2 ) # 空白で、2つに分割する
tmp_ary[ 0 ] = Integer( tmp_ary[ 0 ], 10 ) # 数値型に変換する
ary.push tmp_ary
end
次へ続く
654653
2020/02/18(火) 03:27:41.15ID:enVFBik2 last_line_num = line_num_ary.last[ 0 ] # 最後の行番号
line_count = nil # ファイルの行数
if FileTest.file? ARGV[ 1 ] # 入力ファイルがあれば
open( ARGV[ 1 ] ) do |f|
while f.gets; end # ファイルを最後まで読む
line_count = f.lineno # ファイルの行数
end
# 最後の行番号の方が、入力ファイルの行数よりも大きい場合は、空行を追加して、同じ行数にする
if last_line_num > line_count
open( ARGV[ 1 ], "a" ) do |f| # 追記
( last_line_num - line_count ).times { f.puts }
end
end
else # 入力ファイルが無ければ、最後の行番号の数だけ、空行を挿入する
open( ARGV[ 1 ], "w" ) do |f| # 書き込み
last_line_num.times { f.puts }
end
end
# 末尾の改行を削除して、配列に読み込む
input_ary = File.readlines( ARGV[ 1 ], chomp: true )
# 行番号で指定された行の、内容を置き換える
line_num_ary.each { |ary| input_ary[ ary[ 0 ] - 1 ] = ary[ 1 ] }
puts input_ary
line_count = nil # ファイルの行数
if FileTest.file? ARGV[ 1 ] # 入力ファイルがあれば
open( ARGV[ 1 ] ) do |f|
while f.gets; end # ファイルを最後まで読む
line_count = f.lineno # ファイルの行数
end
# 最後の行番号の方が、入力ファイルの行数よりも大きい場合は、空行を追加して、同じ行数にする
if last_line_num > line_count
open( ARGV[ 1 ], "a" ) do |f| # 追記
( last_line_num - line_count ).times { f.puts }
end
end
else # 入力ファイルが無ければ、最後の行番号の数だけ、空行を挿入する
open( ARGV[ 1 ], "w" ) do |f| # 書き込み
last_line_num.times { f.puts }
end
end
# 末尾の改行を削除して、配列に読み込む
input_ary = File.readlines( ARGV[ 1 ], chomp: true )
# 行番号で指定された行の、内容を置き換える
line_num_ary.each { |ary| input_ary[ ary[ 0 ] - 1 ] = ary[ 1 ] }
puts input_ary
655デフォルトの名無しさん
2020/02/18(火) 03:35:49.66ID:dYxIHNEw >>649
これが一番だな。短くてbash依存なし。ruby依存なしw
これが一番だな。短くてbash依存なし。ruby依存なしw
656デフォルトの名無しさん
2020/02/18(火) 09:24:28.92ID:2AC9Ct1n いや、それちょっとした文字列操作したくなった時点で相当めんどくさくなるだろ。。
てきとーなスクリプト言語使う方が正解だわ。
シェルで書くことに意固地になってるだけだろ。
てきとーなスクリプト言語使う方が正解だわ。
シェルで書くことに意固地になってるだけだろ。
657デフォルトの名無しさん
2020/02/18(火) 09:30:40.26ID:HqsHcaRa 別にならんだろ。まああれだ、シェル芸しかできなくて
シェルプログラミングできないやつが
ごまかすために言ってるんだろうなと
シェルプログラミングできないやつが
ごまかすために言ってるんだろうなと
658デフォルトの名無しさん
2020/02/18(火) 09:53:00.13ID:2AC9Ct1n あ、普通に馬鹿なんだな。。
もしかしてユニケージの人か?
もしかしてユニケージの人か?
659デフォルトの名無しさん
2020/02/18(火) 10:03:42.59ID:HqsHcaRa ユニケージを見ればわかるが、あれは使い物にならない
特定業務専用のコマンド集でしか無い
そんなことよりさ、自分でコード書けないの?
特定業務専用のコマンド集でしか無い
そんなことよりさ、自分でコード書けないの?
660デフォルトの名無しさん
2020/02/18(火) 10:04:48.16ID:HqsHcaRa 文字列操作の何が面倒なのか知らんが、文字列操作はC言語よりもずっと楽なんだがね。
コマンド呼び出しだけを見れば他のどの言語よりも優れてるし
コマンド呼び出しだけを見れば他のどの言語よりも優れてるし
661デフォルトの名無しさん
2020/02/18(火) 10:42:09.68ID:X2bVDQHa > てきとーなスクリプト言語
シェルスクリプトとか?w
シェルスクリプトとか?w
662デフォルトの名無しさん
2020/02/18(火) 14:37:02.43ID:gCN/+gaX >>660
ていうか実はシェルスクリプトって
PythonでいうC API的なものの嚆矢であり最前線なんだよね。
C言語の標準入出力・ファイル読出/書込をシェルでやって
数値計算とかバイナリ解析とかそういう部分はC言語でコマンド作って任せるっていう。
ていうか実はシェルスクリプトって
PythonでいうC API的なものの嚆矢であり最前線なんだよね。
C言語の標準入出力・ファイル読出/書込をシェルでやって
数値計算とかバイナリ解析とかそういう部分はC言語でコマンド作って任せるっていう。
663デフォルトの名無しさん
2020/02/18(火) 15:45:01.04ID:fdBjlYYo IT系の仕事してるけどアプリ作ってるときはコンパイルは普通だった
でもインフラの仕事をするとシェルスクリプト多数だった
シェルスクリプト作ってる人たちはコンパイルの概念が分からないらしかった
プログラムはビルドしてリリースしてとソースと実行ファイルの管理が面倒だけど
シェルスクリプトって即物的なのがいい
でもインフラの仕事をするとシェルスクリプト多数だった
シェルスクリプト作ってる人たちはコンパイルの概念が分からないらしかった
プログラムはビルドしてリリースしてとソースと実行ファイルの管理が面倒だけど
シェルスクリプトって即物的なのがいい
664デフォルトの名無しさん
2020/02/18(火) 17:27:39.45ID:X8dqmLc9 1 2
3 4
みたいなhoge.txtがあって
cat hoge.txt | sed "s/\t/,/g" > piyo.csv
ってやってもhogeのままなんですけど
cat hoge.txt | tr " \t" "," > piyo.csv
ってやると上手くいきました、mac環境なんですけど
何が原因なのか分かりません…
sedの置換対象に数字を入れた場合は上手くいきました
3 4
みたいなhoge.txtがあって
cat hoge.txt | sed "s/\t/,/g" > piyo.csv
ってやってもhogeのままなんですけど
cat hoge.txt | tr " \t" "," > piyo.csv
ってやると上手くいきました、mac環境なんですけど
何が原因なのか分かりません…
sedの置換対象に数字を入れた場合は上手くいきました
665デフォルトの名無しさん
2020/02/18(火) 17:30:18.44ID:hjlsDnk2 1 と 2 の間にあるのがスペースなんじゃ…
666デフォルトの名無しさん
2020/02/18(火) 20:22:18.38ID:wp4bvOJX667デフォルトの名無しさん
2020/02/18(火) 20:27:51.93ID:VB0SzzBs >>664
mac の sed は \t をタブ文字として扱わないらしいね
https://stackoverflow.com/questions/5398395/how-can-i-insert-a-tab-character-with-sed-on-os-x/5398453#5398453
sed "s/$(printf '\t')/,/g" はどうかな
printf も \t 非対応なんてことはさすがに無いと思うけど
mac の sed は \t をタブ文字として扱わないらしいね
https://stackoverflow.com/questions/5398395/how-can-i-insert-a-tab-character-with-sed-on-os-x/5398453#5398453
sed "s/$(printf '\t')/,/g" はどうかな
printf も \t 非対応なんてことはさすがに無いと思うけど
668デフォルトの名無しさん
2020/02/18(火) 20:33:06.70ID:hjlsDnk2 tr " \t" "," となっていてスペースが含まれているから
上手くいっているんじゃないかと
上手くいっているんじゃないかと
669デフォルトの名無しさん
2020/02/18(火) 21:52:28.55ID:8C0JMYsF 665~668の方まで皆さんありがとうございます
とりあえず痴漢の成功例を○、上手くいかなかったのを×として
× tr " " ","
○ tr "\t" ","
× sed "s/\t/,/g" (\tを\\tに変える、クオーテーションを変えるなどしても同様)
○ sed "s/$(printf '\t')/,/g"
という感じでした。
macとlinuxでオプション違うのは経験で知ってたんですが正規表現にまで
関わってくるんですね…良い事を教えていただいてありがとうございます。
とりあえず痴漢の成功例を○、上手くいかなかったのを×として
× tr " " ","
○ tr "\t" ","
× sed "s/\t/,/g" (\tを\\tに変える、クオーテーションを変えるなどしても同様)
○ sed "s/$(printf '\t')/,/g"
という感じでした。
macとlinuxでオプション違うのは経験で知ってたんですが正規表現にまで
関わってくるんですね…良い事を教えていただいてありがとうございます。
670デフォルトの名無しさん
2020/02/18(火) 22:18:45.81ID:ObTpNy6/ macならgnu-sedをインストールしてそっち使ったほうが良い
671デフォルトの名無しさん
2020/02/19(水) 11:18:51.97ID:nP6c4IYT 痴漢の成功例っていやだなw
672デフォルトの名無しさん
2020/02/19(水) 12:03:18.50ID:pMNWrift 気が付かなかったww
673デフォルトの名無しさん
2020/02/21(金) 06:21:58.42ID:A/822pua $ ed -s <(seq 3) <<< $'3m1\n,p'
1
3
2
$ ed -s <(seq 3) <<< '3m1\n,p'
?
これでコマンドラインからedが使えるけどこの$ってどんな効果が?
付けないとこの通り表示されないし
1
3
2
$ ed -s <(seq 3) <<< '3m1\n,p'
?
これでコマンドラインからedが使えるけどこの$ってどんな効果が?
付けないとこの通り表示されないし
674デフォルトの名無しさん
2020/02/21(金) 07:58:16.90ID:0dzJ+7kH675デフォルトの名無しさん
2020/02/21(金) 14:48:04.29ID:A/822pua676デフォルトの名無しさん
2020/02/22(土) 16:39:03.63ID:C/dFKPoq kshのリポジトリのmasterが3400ぐらいあったコミットが13に減っていてワロタw
677デフォルトの名無しさん
2020/02/25(火) 12:18:34.54ID:S19Y4jrS grepの-eオプションみたく複数回指定できるオプション引数って
シェルスクリプトでどうやって処理するのが一般的なんかな。
getopts(1)の例
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html#tag_20_54_17
とかに載ってるような引数付き-bオプションに対して変数bflag=1, bval="$OPTARG"にする方法だと
最後に出現した-b XXXしか感知できないよね。
-b XX1 -b XX2 -b XX3
↑こういうコマンドライン引数があったときに-bオプションに対する引数を全部認識するようにしたい。
そういう処理をしているスクリプトのソースへのリンクとか教えてもらえるとすごく助かる。
シェルスクリプトでどうやって処理するのが一般的なんかな。
getopts(1)の例
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html#tag_20_54_17
とかに載ってるような引数付き-bオプションに対して変数bflag=1, bval="$OPTARG"にする方法だと
最後に出現した-b XXXしか感知できないよね。
-b XX1 -b XX2 -b XX3
↑こういうコマンドライン引数があったときに-bオプションに対する引数を全部認識するようにしたい。
そういう処理をしているスクリプトのソースへのリンクとか教えてもらえるとすごく助かる。
678デフォルトの名無しさん
2020/02/25(火) 12:53:16.03ID:5KSIeSvf 出現するたびになにかやればいいだけじゃん
679デフォルトの名無しさん
2020/02/25(火) 14:13:23.37ID:oSeHo6cg >>677
一般的かどうか知らないけど配列に入れて要素の数だけループさせてる
別のコマンドに渡すことが大半なのでループ内ではコマンド文字列を生成して実行はループの外でやる
while getopts “e:” opt; do
case "$opt" in
“e”) strings+=("$OPTARG");;
esac
done
shift $(($OPTIND - 1))
for value in "${strings[@]}"; do
…
done
一般的かどうか知らないけど配列に入れて要素の数だけループさせてる
別のコマンドに渡すことが大半なのでループ内ではコマンド文字列を生成して実行はループの外でやる
while getopts “e:” opt; do
case "$opt" in
“e”) strings+=("$OPTARG");;
esac
done
shift $(($OPTIND - 1))
for value in "${strings[@]}"; do
…
done
680デフォルトの名無しさん
2020/02/25(火) 15:00:07.73ID:mMwfySZI bash依存は甘え
681デフォルトの名無しさん
2020/02/25(火) 15:30:00.20ID:K+FIgRaj682デフォルトの名無しさん
2020/02/25(火) 15:45:41.88ID:K+FIgRaj 今更だけど、試しにNetBSDのgrepのソースコードを覗いてみたら、pattern[]配列に格納してたわ。
POSIXシェルみたいな配列に対応してないシェルでも0x1Fユニット区切り文字とか使えばいいかな。
POSIXシェルみたいな配列に対応してないシェルでも0x1Fユニット区切り文字とか使えばいいかな。
683デフォルトの名無しさん
2020/02/25(火) 17:02:15.34ID:eOOTHTW4 全てのシェルに配列はあるだろ? $@を使えばいいんだよ
あとはqiitaででも探せ。答えはそこにある。
あとはqiitaででも探せ。答えはそこにある。
684デフォルトの名無しさん
2020/02/25(火) 17:24:31.11ID:S19Y4jrS685デフォルトの名無しさん
2020/02/25(火) 17:25:41.11ID:S19Y4jrS サブシェルで処理すれば$@は引き継がれないから影響ないけど
そうすると今度は肝心要の、現在処理しているコマンドライン引数を全く参照できなくなる。
そうすると今度は肝心要の、現在処理しているコマンドライン引数を全く参照できなくなる。
686デフォルトの名無しさん
2020/02/25(火) 17:46:16.45ID:eOOTHTW4 サブシェルなんかいらねーだろ
関数使えよ
関数使えよ
687デフォルトの名無しさん
2020/02/25(火) 22:33:40.09ID:S19Y4jrS >>686
頭悪くて恥ずかしい限りだが、
スクリプトの例を書いてもらえないか。
excmd -a XXX -a YYY -a ZZZ
みたいなコマンドライン引数を解釈して、
全部読み切った後に-aオプションに対するオプション引数をそれぞれ取得できるっていう。
全部読み切った後ってのは、getoptやらで最後のオプションまで読み切って、
引数関連のエラーがないことを確かめてからってことね。
「-aオプションの出現を感知するたびに標準出力に出す」みたいなのじゃなく。
頭悪くて恥ずかしい限りだが、
スクリプトの例を書いてもらえないか。
excmd -a XXX -a YYY -a ZZZ
みたいなコマンドライン引数を解釈して、
全部読み切った後に-aオプションに対するオプション引数をそれぞれ取得できるっていう。
全部読み切った後ってのは、getoptやらで最後のオプションまで読み切って、
引数関連のエラーがないことを確かめてからってことね。
「-aオプションの出現を感知するたびに標準出力に出す」みたいなのじゃなく。
688デフォルトの名無しさん
2020/02/25(火) 22:48:26.39ID:8Uixj76j689デフォルトの名無しさん
2020/02/26(水) 08:09:52.20ID:vrfGqddo >>688
?
-aの位置の次にある引数を取得するってこと?
でもそうすると
-bcaXXX
↑こういうときはどう解析するの?(-b,-cは引数を取らないオプション)
この形式のオプションもPOSIXでは許可されてるから
当然解析できなければならないけど。
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
?
-aの位置の次にある引数を取得するってこと?
でもそうすると
-bcaXXX
↑こういうときはどう解析するの?(-b,-cは引数を取らないオプション)
この形式のオプションもPOSIXでは許可されてるから
当然解析できなければならないけど。
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
690デフォルトの名無しさん
2020/02/26(水) 08:25:40.38ID:iwwM4ZEx >>689
引数処理にこだわり始めるとスクリプト実行して引数解析終わるまで時間がかかるようになって
使い物にならなくなるので複雑な記法は全部捨てたわ
POSIXで許可されているから実装しなきゃならないというならPOSIXを窓から投げ捨てるべき
引数処理にこだわり始めるとスクリプト実行して引数解析終わるまで時間がかかるようになって
使い物にならなくなるので複雑な記法は全部捨てたわ
POSIXで許可されているから実装しなきゃならないというならPOSIXを窓から投げ捨てるべき
691デフォルトの名無しさん
2020/02/26(水) 08:29:52.36ID:kXv4PxDr692デフォルトの名無しさん
2020/02/26(水) 09:28:16.44ID:9H3dDcdo bash によるオプション解析 - Qiita
https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb
getoptsの存在すら知らずに横着して=~を使ってすまんな
オプションの集約ってこうも面倒だったのね
https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb
getoptsの存在すら知らずに横着して=~を使ってすまんな
オプションの集約ってこうも面倒だったのね
693デフォルトの名無しさん
2020/02/26(水) 09:48:23.19ID:re2OdmIW timeoutで終了するプログラムの最後の1行だけを表示させたいどうするの?
694デフォルトの名無しさん
2020/02/26(水) 09:54:37.39ID:kXv4PxDr >>692
どの言語にもオプション解析用のライブラリがある理由が分かったろ?
どの言語にもオプション解析用のライブラリがある理由が分かったろ?
695デフォルトの名無しさん
2020/02/26(水) 11:26:08.87ID:vrfGqddo ちなみにgetoptsコマンドはPOSIXで定義されてるけど,実はPOSIXが定めるオプション書式に対応していないっていう。
まあOpenGroup側も「任意のオプション引数は歴史的な理由以外で使ってはならない」って言ってる訳だし
仕方無い部分もあるけど。
一方で複数回登場する引数付きオプションは,ちゃんと現行のアプリケーションでの使用も許可されているにもかかわらず
getopts自身はそういうオプションに対する便利な機能をなんら提供してない。
まあOpenGroup側も「任意のオプション引数は歴史的な理由以外で使ってはならない」って言ってる訳だし
仕方無い部分もあるけど。
一方で複数回登場する引数付きオプションは,ちゃんと現行のアプリケーションでの使用も許可されているにもかかわらず
getopts自身はそういうオプションに対する便利な機能をなんら提供してない。
696デフォルトの名無しさん
2020/02/26(水) 13:10:48.18ID:iFRpldfA >>695
任意のオプション引数ってどういうもののことを言ってる?
任意のオプション引数ってどういうもののことを言ってる?
697デフォルトの名無しさん
2020/02/26(水) 13:41:46.61ID:vrfGqddo >>696
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
ここを読め…と突き放すのはあんまりなんで説明すると
“optional option-argument”---任意のオプション引数っていうのは,
当該オプションのあとにそのオプションに対する(一つの)引数が指定されてもされなくてもいいような
オプションのこと。
manページの「書式」節で
somecmd -o[arg]
みたいに書かれている場合が該当する。
これは
somecmd -o
の時は「オプション-oが引数なしで指定された」と解釈し
somecmd -oXXX
の時は「オプション-oが引数XXXで指定された」と解釈,
somecmd -o XXX
のときは「オプション-oと,(それとは直接関係ない)被演算子XXXが指定された」と解釈する
という決まりになってる。
なおPOSIXでは規程されてないけど,長いオプションの場合は
任意のオプション引数を指定したければオプションとオプション引数を=で結ぶのが通例みたい。
--long-opt=XXX
↑こういう感じ。
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
ここを読め…と突き放すのはあんまりなんで説明すると
“optional option-argument”---任意のオプション引数っていうのは,
当該オプションのあとにそのオプションに対する(一つの)引数が指定されてもされなくてもいいような
オプションのこと。
manページの「書式」節で
somecmd -o[arg]
みたいに書かれている場合が該当する。
これは
somecmd -o
の時は「オプション-oが引数なしで指定された」と解釈し
somecmd -oXXX
の時は「オプション-oが引数XXXで指定された」と解釈,
somecmd -o XXX
のときは「オプション-oと,(それとは直接関係ない)被演算子XXXが指定された」と解釈する
という決まりになってる。
なおPOSIXでは規程されてないけど,長いオプションの場合は
任意のオプション引数を指定したければオプションとオプション引数を=で結ぶのが通例みたい。
--long-opt=XXX
↑こういう感じ。
698デフォルトの名無しさん
2020/02/26(水) 13:46:00.81ID:Z7ha8duC >>697
ああ、OKOK、ちゃんと分かってるね
ああ、OKOK、ちゃんと分かってるね
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【ネット民のツッコミ】立憲・野田代表の「事実上の撤回」発言がトレンド、「高市さんそんな事は言ってない」「流石に無理あるだろw」 [1ゲットロボ★]
- 【国際法を無視】日本での「中華人民共和国に台湾問題を論じる資格なし」との声に 中国外交部が厳しく反論… ★2 [BFU★]
- 【文春】元TOKIO・国分太一(51)「女性スタッフ2名への“わいせつ事案”」日テレ事情聴取の全貌が分かった! ★5 [Ailuropoda melanoleuca★]
- 【工作員】「X」のアカウント所在地公開機能が暴いた世論操作の実態 MAGA支持著名アカウントの多くが米国外から運営 日本にも波及 ★3 [ごまカンパチ★]
- 首相答弁「スパイ防止法、外国代理人登録法、ロビー活動公開法などについて速やかに法案を策定する」 [1ゲットロボ★]
- 東京23区の単身マンション家賃、最高値更新 福岡が初の名古屋超え [蚤の市★]
- 【悲報】ゼレンスキー大統領、和平案に大筋合意 ホンコンみたいなウヨ芸人を大統領にするとこうなる [455031798]
- 【高市悲報】中国「ふにゃふにゃ言いながら、時が自然に解決するのを期待する—そんなジャップ流は決して通用しない」 [115996789]
- 千晴がレスナンバー4に執着してる理由wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
- まったりまったりおじゃる丸待機スレ🏡
- シャドバでビヨンドになった!
- 無料でいますぐできるおもろいゲームなんかないか
