X



シェルスクリプト総合 その28

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2018/07/24(火) 11:01:16.36ID:r0TJj2hB
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

前スレ: シェルスクリプト総合 その27(https://mevius.5ch.net/test/read.cgi/unix/1525337663/
0146デフォルトの名無しさん
垢版 |
2018/08/17(金) 03:06:26.97ID:DWhhxT1h
単純な文字列置換ってどうしたら良いですかね?
sedつかうとメタ文字の置換で困るんです
0147デフォルトの名無しさん
垢版 |
2018/08/17(金) 03:42:44.91ID:l9m154d6
その辺りが楽なperlでいいんじゃない?
シェルスクリプトから使っちゃいけないというわけじゃないし
0155デフォルトの名無しさん
垢版 |
2018/08/17(金) 08:24:08.77ID:RTbKyx/W
>>154
残り容量600KBを切ってるので入りません
Rubyは依存関係も含めると圧縮された
パッケージサイズで1MB以上あります。
0159デフォルトの名無しさん
垢版 |
2018/08/17(金) 08:44:27.28ID:TmUZ5Zjz
パターン文字列をsedで置換しちゃうとか(GNU sed の場合)

$ pattern='foo[1]'
$ sed "s/$(sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g' <<< "${pattern}")/foo[2]/g" <<< 'foo[1]'
foo[2]
0162デフォルトの名無しさん
垢版 |
2018/08/17(金) 08:56:35.86ID:RTbKyx/W
>>158
スクリプトの実行はできましたが、 %s/〜/〜/g
だと〜に/が入っていた時に困ります。
〜には何が入るかわかりません。

あとviは標準入力から読み込めませんでした
できれば標準入力から読み込みんで標準出力に出力したいです。

ちなみにviのバージョンです

# vi -H
These features are available:
Pattern searches with / and ?
Last command repeat with .
Line marking with 'x
Named buffers with "x
Some colon mode commands with :
Settable options with ":set"
Signal catching- ^C
Job suspend and resume with ^Z
Adapt to window re-sizes
BusyBox v1.28.3 () multi-call binary.

Usage: vi [OPTIONS] [FILE]...

Edit FILE

-c CMD Initial command to run ($EXINIT also available)
-R Read-only
-H List available features
0163デフォルトの名無しさん
垢版 |
2018/08/17(金) 09:00:22.48ID:RTbKyx/W
>>159
GNU sedじゃないからだめなんでしょうね

# pattern='foo[1]'
# sed "s/$(sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g' <<< "${pattern}")/foo[2]/g" <<< 'foo[1]'
-ash: syntax error: unexpected redirection

ちなみにsedの--versionと--helpです。

# sed --version
This is not GNU sed version 4.0


# sed --help
BusyBox v1.28.3 () multi-call binary.

Usage: sed [-i[SFX]] [-nrE] [-f FILE]... [-e CMD]... [FILE]...
or: sed [-i[SFX]] [-nrE] CMD [FILE]...

-e CMD Add CMD to sed commands to be executed
-f FILE Add FILE contents to sed commands to be executed
-i[SFX] Edit files in-place (otherwise sends to stdout)
Optionally back files up, appending SFX
-n Suppress automatic printing of pattern space
-r,-E Use extended regex syntax

If no -e or -f, the first non-option argument is the sed command string.
Remaining arguments are input files (stdin if none).
0165デフォルトの名無しさん
垢版 |
2018/08/17(金) 09:16:49.96ID:TmUZ5Zjz
>>163
ああ、bash じゃなくて ash だから here string("<<<") が使えないのね…

# echo 'foo[1]' | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"

こんな感じかな。
0167デフォルトの名無しさん
垢版 |
2018/08/17(金) 09:48:06.80ID:RTbKyx/W
>>166
なんかプラスが入った時おかしいっすね

GNU sed
$ pattern='+'
$ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
foo[2]

$ pattern='a+'
$ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
foo[2]+

busybox sed
# pattern='+'
# echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
sed: bad regex '\+': Repetition not preceded by valid expression
0168デフォルトの名無しさん
垢版 |
2018/08/17(金) 09:57:27.72ID:TmUZ5Zjz
>>167
う〜ん、ash でやってみたけど、1番目、2番目は問題ないなぁ
Busybox の sed は -r オプションがないんじゃなかったかな
0171デフォルトの名無しさん
垢版 |
2018/08/17(金) 10:13:01.82ID:TmUZ5Zjz
あれ?でもさ、

pattern='+'
$ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
foo[2]

入力が '+' でパターン文字列も '+' だから foo[2] に置換されるのは正しいんじゃないかな?

でもまぁ、GNU sed で -r オプション付けると `+` 記号がメタキャラクタになるから、付けない場合は
`+` を考慮する必要はなかったのね…

$ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*^.$/\]|\[|\])/\\\1/g')/foo[2]/g"

こっちの方が良いみたい。
0174デフォルトの名無しさん
垢版 |
2018/08/17(金) 10:20:29.64ID:RTbKyx/W
だから要するに + はエスケープしたらダメってことなのか?

単純な文字列置換って正規表現置換よりも簡単な処理なのに
どれも面倒くさいなぁw
0175デフォルトの名無しさん
垢版 |
2018/08/17(金) 10:33:33.58ID:hKcJGgnp
ashの日本語manページはないのかなと思って検索した時に出てきた画面。
https://i.imgur.com/xzEhcAc.png
0177デフォルトの名無しさん
垢版 |
2018/08/17(金) 10:41:51.16ID:hKcJGgnp
>>176
カラフルな検索結果だがこれと言って役に立たないという共通点があるな・・・
0179デフォルトの名無しさん
垢版 |
2018/08/17(金) 11:32:47.25ID:TmUZ5Zjz
grep にある -F オプションと同等のオプションが sed にも
欲しいところではあるなぁ。生まれは同じなのに sed には無い
のは何故…(実はあったりして)
0181デフォルトの名無しさん
垢版 |
2018/08/18(土) 17:22:09.36ID:rQWtSS3z
Googleのシェルスクリプトに関するコーディング規約で
「そう〔訳注: 連続したパイプ節が二つ以下〕でない場合は一行につき一つのパイプ節を含むようにする。その際,二番目以降のパイプ節は,2文字分の欧文空白による字下げを行なう。」
とあるんだが[1],ここの例示が
command1 \
 | command2 \
 | command3 \
 | command4
となっている。
普通(といってもパイプをこのように多用しかつ改行しまくっている例はほとんど見たことがないのだが)https://github.com/ShellShoccar-jpn/kotoriotoko/blob/master/BIN/twtl.sh#L297
↑こことかでは
command1 |
command2 |
command3 |
command4
という書き方になっている。
俺はこっちの書式のほうが見慣れているので,自分のシェルスクリプトもこういう書き方でやっているのだが,みなさんはどういう書き方がいいとかあるだろうか。あるいはGoogleとは別のところが発表してるシェルスクリプトのコーディング規約とかないだろうか。
0182デフォルトの名無しさん
垢版 |
2018/08/18(土) 17:22:24.47ID:rQWtSS3z
一応俺の意見: 後者の利点としては,バックスラッシュが不要なこととコマンドが行頭に来て流れを掴みやすいということがある。
加えて簡易的なデバッグするときに,前者は
command1 \
 | command2 \
 | cat
# | command3 \
# | command4
などとするのに対して 後者は
command1 |
command2 |
cat
# command3 |
# command4
このように「新しい行を挿入してcatを入力」という単純な動作ができるので,例えばVimやEmacsなどマクロが作れるエディタなどでのデバッグ用の編集に有用というのもある。
実際俺はシェルスクリプトに関してはIDEを使わずVimで開発していて,この類のマクロを作成して便利に使っている。
長文すまん
[1]: http://google.github.io/styleguide/shell.xml#Pipelines
0183デフォルトの名無しさん
垢版 |
2018/08/18(土) 18:05:23.17ID:5BnyFmRJ
簡易的なデバッグするときに前者は
command1 \
 | command2 \
# | command3 \
# | command4
などとするのに対して 後者は
command1 |
command2 |
# command3 |
# command4
のように行頭に#をいれるだけではSyntax errorになるから前者の方がデバッグなど編集に有用とも言える

個人的には大差ないと思う
0184デフォルトの名無しさん
垢版 |
2018/08/18(土) 18:29:20.16ID:LW/iu6SG
末尾にバックスラッシュを入れることで次行を見なくても明確にコマンドが続くことがわかるから前者を支持する
0186デフォルトの名無しさん
垢版 |
2018/08/18(土) 19:19:56.79ID:rQWtSS3z
>>184
でも>>183のように,コメントアウトすると
「末尾にバックスラッシュがあっても後ろにコマンドがない(実行されない)」
という状況がありえる以上,
末尾のバックスラッシュの有無を過信するのはよくないと思う。
もちろん気をつければいい話だが。

なんというか,ハンガリアン記法の間違って流布された方法に近しい危険性がある
(変数i_VARを見て,本当はfloat型なのにint型だと思い込む)
0187デフォルトの名無しさん
垢版 |
2018/08/18(土) 19:21:44.26ID:rQWtSS3z
ていうか少なくとも二人くらいは
後者の方式に賛同してるのか。

Googleもそっちを推奨してるし,俺も手癖を直すべきなのかな。
0188デフォルトの名無しさん
垢版 |
2018/08/18(土) 20:18:01.73ID:pAmB63kN
>>184
それ、末尾にパイプ記号あるから〜
と同じことじゃね?
個人的には見栄え的には前者の方を採用したいが余計な継続記号が不要な後者で書いてる
0191デフォルトの名無しさん
垢版 |
2018/08/19(日) 01:23:37.19ID:A4xH6fb7
バックスラッシュで行継続(改行)って多くの言語で採用されているから
多くの人はパイプ先頭、バックスラッシュ行末じゃないかな?
0192デフォルトの名無しさん
垢版 |
2018/08/19(日) 02:52:07.69ID:YqoTvka6
俺は1行か2行くらいなら後者だな。
何行もずらずら並べるなら中括弧で囲んでパイプ記号を先頭に持ってくるかも。
行末にバックスラッシュを置いて行継続はあまり美しくないと思うのでなるべく書きたくない。

>>191
構文的に行末で文(言語によっては式)が完結できていれば行末を文の終わりとみなし
そうでなければ次の行に継続、というのもshそのものをはじめpython, JavaScriptなど多くの言語で採用されているよ。
(pythonはshと同じく行末バックスラッシュで継続もできるが)
更にRubyは行の終わりで完結できるように見えても次の行の先頭を見てどうするか決めていたりする。
0193デフォルトの名無しさん
垢版 |
2018/08/19(日) 04:00:58.03ID:O9LemqF2
>>190
無知ながら初耳だった。
scshの説明をざっと読んだけど、今回の問題の解決になる?
むしろ「括弧の前で改行するかいなか」みたいな新たな規約が生まれそうじゃない?
0195デフォルトの名無しさん
垢版 |
2018/08/19(日) 19:55:46.26ID:O9LemqF2
シェルスクリプトの話題からちょっと外れるんだけど
$ somecmd --help
としたときの手引きって標準エラー出力に出力すべき?
GNU Coreutilsでは基本的に標準出力なんだけど……。
0196デフォルトの名無しさん
垢版 |
2018/08/19(日) 20:37:51.45ID:6q4oK8R8
stderr だとページャにつなげたい時に

$ somecmd --help 2>&1 | $PAGER

とかするのが面倒。でも zsh とかだとエイリアスで
どうにかできるんだっけ?
0204デフォルトの名無しさん
垢版 |
2018/08/20(月) 03:32:09.94ID:OmELABLW
まあ>>201はそんな大層な意味で言ってるわけではないだろ。単にbashしか使ってない使い込んでるってだけの意味だろう。無知でしたという
0205デフォルトの名無しさん
垢版 |
2018/08/20(月) 03:46:49.27ID:GIvuOFoC
--helpで思い出したけど、あれって書き方ってあるの?

usageの書き方とかオプションの書き方とか
引数は大文字にするの?とか [ファイル]... とかの[] とか ... の使い方とか
あるようで、バラバラな気もしている
0208デフォルトの名無しさん
垢版 |
2018/08/23(木) 05:30:33.48ID:L+hDtmKU
シェルスクリプトの言語にJavaScriptってアリだと思う?
#! /usr/local/bin/js24
みたいなシェバンでさ。
0209デフォルトの名無しさん
垢版 |
2018/08/23(木) 05:39:54.64ID:ncZgpeak
シェルスクリプトっていうのは
シェルとして実用に堪えるものじゃないとダメ
名前の通り

コマンドを呼び出すのに、いちいちsystem関数を
使うとかいうのは、シェルとして使えない

ls だけでlsコマンドを実行できるようにしたら
シェルスクリプトと認めてもいいが
0210デフォルトの名無しさん
垢版 |
2018/08/23(木) 07:32:38.64ID:d2Ifs7B7
>>208
ナシだと思う
0211デフォルトの名無しさん
垢版 |
2018/08/23(木) 07:38:44.84ID:1n1CeI2l
シェルスクリプトというより、他のインタプリタ言語と同じようにコマンド(内容)記述用としてあっていいって話だろう
0212デフォルトの名無しさん
垢版 |
2018/08/23(木) 08:56:23.64ID:AY9SoYfw
普通にやるだろ。
#!/usr/bin/awk -f
とかだってたまにはやるぞ。
「#」がコメント扱いになる言語なら
気にせずどんどんやればいい。

そもそもshebangはUNIX上で「スクリプト言語」を呼び出す時の記法であって
現代UNIXではシェルは一切関与しないカーネルの機能だから
「シェルスクリプト」なんかじゃない。
(つまり実はスレ違い)
なお昔のSystem-V系UNIXにはカーネルにこの機能がなくexec(2)が失敗するので、
その場合にはシェルが代行してスクリプトのインタープリターをよびだしていた。
そういうUNIXはほぼ滅びたけどシェル側にはまだこの代行機能が残っていたりする。

シェルは関与しないのにshell-bangなんて変な名前だけど、
この言い方自体比較的新しくて、実装されてからだいぶ長い間名前がなかったんだよ。
普通はカーネルが処理しててシェルは関係ないってことを
知らない奴がつけた名前じゃないかと前から疑問に思ってる。
0213デフォルトの名無しさん
垢版 |
2018/08/23(木) 09:39:55.05ID:ncZgpeak
>>212

> 普通にやるだろ。
> #!/usr/bin/awk -f
> とかだってたまにはやるぞ。

落ち着け

それはスクリプト言語だ
"シェル"スクリプト言語ではない
0214デフォルトの名無しさん
垢版 |
2018/08/23(木) 09:45:44.18ID:ncZgpeak
> シェルは関与しないのにshell-bangなんて変な名前だけど、
shebang を shell-bangの略だと主張する人は少数派だよ
0217デフォルトの名無しさん
垢版 |
2018/08/23(木) 13:18:49.52ID:cYcyOMDR
スクリプト
スクリプトスクリプト
スクリプトスクリプトスクリプト
スクリプトスクリプトスクリプトスクリプト 👀
Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)
0219デフォルトの名無しさん
垢版 |
2018/08/23(木) 14:59:38.25ID:AY9SoYfw
>>214
shebang の e って何から来てるの?
俺は shell から来てるんだと思ってた。

なお shabang という書き方も少数派だが使われてはいるみたい。
実際 sharp-bang なわけで、こっちなら分かる。
shabang ならシバンじゃなくて、シャバンだよな。
シャバ〜ン。
0223デフォルトの名無しさん
垢版 |
2018/08/23(木) 15:13:13.81ID:eJiCstIz
なんというか、ヒーローの名前のようだ。
0226デフォルトの名無しさん
垢版 |
2018/08/23(木) 16:45:35.96ID:ssILkLQJ
宇宙刑事シャバン
0229デフォルトの名無しさん
垢版 |
2018/08/23(木) 18:14:50.72ID:AY9SoYfw
なんつーかオッサンばっかだな。
まあ俺もそういう反応を期待してたわけだがw
0230デフォルトの名無しさん
垢版 |
2018/08/23(木) 18:43:16.20ID:1n1CeI2l
>>219
#! -> sharp-bang -> shabang -> 単語ならshellだしすでにあるとても似たshebangでいいんじゃね、shebangの意味自体が似合ってるし
とか。shebangというれっきとした単語の由来は別にある
0234219
垢版 |
2018/08/24(金) 08:55:32.25ID:57yPHNQD
>>232
>>227 が元ネタ。
ギャバン/シャリバンのバンと、シャリバン/シャイダーのシャと、
ギャバンのオープニング末尾のギャーバーン♪
からの連想でシャーバンと書いた。
残りは歌詞検索とかすると分かる。

こんな連想するの俺だけかと思ったら他にも複数いてワラタ
0235デフォルトの名無しさん
垢版 |
2018/08/24(金) 09:13:07.93ID:LbFHGrVQ
>>234
男なんだろ?
の一言でギャバンOPテーマとわかるのはギャバン世代というよりもFLASH黄金世代な予感
実際俺はギャバンじゃなく当時の面白FLASHギャバソで知った
0236219
垢版 |
2018/08/24(金) 09:35:23.98ID:57yPHNQD
>>235
そんなFLASHがあったのか。
4月のAnisonDaysに串田アキラが出てギャバンのOPを歌ってたから、
それで記憶が蘇ってる人もいるかも。
てゆうかそれ俺。
0237デフォルトの名無しさん
垢版 |
2018/08/24(金) 10:43:03.55ID:wXpFbMeR
そして>>228の癒着というのはケロロ軍曹の登場人物
556(コゴロー)が変身するときのセリフ
元ネタはギャバンが変身するときに言うセリフの蒸着
40代ならここまで連想する
0238デフォルトの名無しさん
垢版 |
2018/08/24(金) 10:59:15.82ID:4te4jIm4
蒸着の元ネタってギャバンだったのか…
DeadSpaceのアーマー更新シーンを蒸着言うやついたけど元ネタあったんだな
0241デフォルトの名無しさん
垢版 |
2018/08/24(金) 19:44:16.61ID:Gfkbj1yB
バッチファイルやパワーシェルもシェルスクリプトですか?
何言語っていうんでしょうか?
0243デフォルトの名無しさん
垢版 |
2018/08/24(金) 19:54:12.80ID:Gfkbj1yB
静かに
0245デフォルトの名無しさん
垢版 |
2018/08/24(金) 22:34:41.93ID:UXXFLepR
>>241
バッチファイルはシェルスクリプトには入れないなあ。
PowerShellの方は、PowerShellスクリプトって言うな俺は。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況