シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ:
シェルスクリプト総合 その29
https://mevius.5ch.net/test/read.cgi/tech/1537540487/
探検
シェルスクリプト総合 その30
■ このスレッドは過去ログ倉庫に格納されています
2019/07/01(月) 23:04:27.02ID:/rKj5XUf
2019/07/01(月) 23:18:57.10ID:/rKj5XUf
お約束
・特記なき場合、Bourne Shell もしくは POSIX 準拠の sh 可換シェルが既定です
つまりシバンは #!/bin/sh です。
特定のシェル(bash, zsh, (m|pd)ksh, (d)ash, yash, posh, fish, (t)csh など)の専用機能に依存する場合は明示しましょう。
macOS (10.14以前), GNU/Linux ユーザー(Debian, Ubuntu 系以外) は /bin/sh の実体が bash なので*特に*注意
自覚なき bashism---シバンが #!/bin/sh なのに bash に依存する構文を使っていませんか?
ただし Debian, Ubuntu などでは /bin/sh の実体は POSIX sh 互換の dash ですのであまり気にしないでも大丈夫です。
FreeBSD ユーザーは /bin/sh の実体が ash なので注意。
Solaris, OpenBSD ユーザーは /bin/sh の実体が ksh なので注意。
macOS 10.15以降のユーザーは/bin/sh の実体が zsh なので注意。
android ユーザーは /bin/sh の実体が mksh なので注意。
csh/tcshでのシェルスクリプトは*まったく推奨しません*。
(参考URL: http://www.speech-lab.org/~hiroki/csh-whynot.euc)
・POSIX に準拠しましょう
有用なリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています。
最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/
(左上の「Shell & Utilities」から各コマンドやファイルの仕様を参照することができます)
・Version 7 UNIX の sh(1) に一番近いのは OpenSolaris 由来の Heirloom sh、次点で Debian などに搭載されている Dash shell
Heirloom sh: http://heirloom.sourceforge.net/sh.html
Dash shell: http://gondor.apana.org.au/~herbert/dash/
・UNIX にはシェルスクリプトに便利な小さなコマンドがいろいろあります
Man ページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.htmlなど)を見ましょう。
apropos(1) ないしは man(1) の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
・特記なき場合、Bourne Shell もしくは POSIX 準拠の sh 可換シェルが既定です
つまりシバンは #!/bin/sh です。
特定のシェル(bash, zsh, (m|pd)ksh, (d)ash, yash, posh, fish, (t)csh など)の専用機能に依存する場合は明示しましょう。
macOS (10.14以前), GNU/Linux ユーザー(Debian, Ubuntu 系以外) は /bin/sh の実体が bash なので*特に*注意
自覚なき bashism---シバンが #!/bin/sh なのに bash に依存する構文を使っていませんか?
ただし Debian, Ubuntu などでは /bin/sh の実体は POSIX sh 互換の dash ですのであまり気にしないでも大丈夫です。
FreeBSD ユーザーは /bin/sh の実体が ash なので注意。
Solaris, OpenBSD ユーザーは /bin/sh の実体が ksh なので注意。
macOS 10.15以降のユーザーは/bin/sh の実体が zsh なので注意。
android ユーザーは /bin/sh の実体が mksh なので注意。
csh/tcshでのシェルスクリプトは*まったく推奨しません*。
(参考URL: http://www.speech-lab.org/~hiroki/csh-whynot.euc)
・POSIX に準拠しましょう
有用なリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています。
最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/
(左上の「Shell & Utilities」から各コマンドやファイルの仕様を参照することができます)
・Version 7 UNIX の sh(1) に一番近いのは OpenSolaris 由来の Heirloom sh、次点で Debian などに搭載されている Dash shell
Heirloom sh: http://heirloom.sourceforge.net/sh.html
Dash shell: http://gondor.apana.org.au/~herbert/dash/
・UNIX にはシェルスクリプトに便利な小さなコマンドがいろいろあります
Man ページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.htmlなど)を見ましょう。
apropos(1) ないしは man(1) の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
2019/07/01(月) 23:19:51.24ID:/rKj5XUf
初心者へのアドバイス
・適した道具を判断するのも頭の重要な使い方。
シェルスクリプトよりも Per lまたは Python の方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたら man(1) を引きましょう。
・思い通りに動かないときは、まずは sh(1) の -x オプションでトレースしましょう。
回答者への注意事項
・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに「そういうのはPerl, Python使え」と回答するのはやめましょう。
安易に Perl や Python に逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。
・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。
・適した道具を判断するのも頭の重要な使い方。
シェルスクリプトよりも Per lまたは Python の方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたら man(1) を引きましょう。
・思い通りに動かないときは、まずは sh(1) の -x オプションでトレースしましょう。
回答者への注意事項
・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに「そういうのはPerl, Python使え」と回答するのはやめましょう。
安易に Perl や Python に逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。
・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。
2019/07/01(月) 23:28:17.35ID:GotlxjDf
2019/07/02(火) 00:29:00.45ID:rBxHnYzF
お約束
・特記なき場合,Bourne ShellもしくはPOSIX準拠のsh互換(というより再現=jシェルが質問・議論の前提です。
つまりシェルスクリプトのシバンは#!/bin/shです。
他のシェル(Bash, Zsh, Ksh, BusyBox sh, DASH, Yash, posh, fish, (t)csh)などの専用機能に依存する場合は,その旨を明示しましょう。
macOS及びGNU/Linuxの利用者は/bin/shの実体がbashなので*特に*注意; 自覚なきbashism――シバンが#!/bin/shなのにBashに依存する構文を使っていませんか?
※ただしDebian, Ubuntuなどでは/bin/shの実体はPOSIX shにかなり近い(つまり独自の拡張がほとんどない)DASHですのであまり気にしないでも大丈夫です。
FreeBSDの利用者は/bin/shの実体がashなので注意。
Solaris及びOpenBSDの利用者は/bin/shの実体がKshなので注意。
(t)cshでのシェルスクリプトは*まったく推奨しません*(参考: http://www.speech-lab.org/~hiroki/csh-whynot.euc)。
・POSIX (Portable Operating System Interface) に準拠しましょう。
有用なリンクはhttps://en.wikipedia.org/wiki/POSIX末節などを参照。
最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/
(左上の「Shell & Utilities」から各コマンドの仕様を閲覧できます。また,コマンドだけでなく,ファイルその他の仕様も閲覧できます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh,次点でDebianなどに搭載されているDASH。
Heirloom sh: http://heirloom.sourceforge.net/sh.html
Dash shell: http://gondor.apana.org.au/~herbert/dash/
・Bourne shellの種類・歴史やシェルの挙動とかいろいろ詳しいサイト: https://www.in-ulm.de/~mascheck/
・Unixにはシェルスクリプトに便利な小さなコマンド類がいろいろあります。
「並び換え (sort(1))」「検索 (grep(1))」等々。
Manページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.htmlなど)を見ましょう。
apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
・特記なき場合,Bourne ShellもしくはPOSIX準拠のsh互換(というより再現=jシェルが質問・議論の前提です。
つまりシェルスクリプトのシバンは#!/bin/shです。
他のシェル(Bash, Zsh, Ksh, BusyBox sh, DASH, Yash, posh, fish, (t)csh)などの専用機能に依存する場合は,その旨を明示しましょう。
macOS及びGNU/Linuxの利用者は/bin/shの実体がbashなので*特に*注意; 自覚なきbashism――シバンが#!/bin/shなのにBashに依存する構文を使っていませんか?
※ただしDebian, Ubuntuなどでは/bin/shの実体はPOSIX shにかなり近い(つまり独自の拡張がほとんどない)DASHですのであまり気にしないでも大丈夫です。
FreeBSDの利用者は/bin/shの実体がashなので注意。
Solaris及びOpenBSDの利用者は/bin/shの実体がKshなので注意。
(t)cshでのシェルスクリプトは*まったく推奨しません*(参考: http://www.speech-lab.org/~hiroki/csh-whynot.euc)。
・POSIX (Portable Operating System Interface) に準拠しましょう。
有用なリンクはhttps://en.wikipedia.org/wiki/POSIX末節などを参照。
最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/
(左上の「Shell & Utilities」から各コマンドの仕様を閲覧できます。また,コマンドだけでなく,ファイルその他の仕様も閲覧できます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh,次点でDebianなどに搭載されているDASH。
Heirloom sh: http://heirloom.sourceforge.net/sh.html
Dash shell: http://gondor.apana.org.au/~herbert/dash/
・Bourne shellの種類・歴史やシェルの挙動とかいろいろ詳しいサイト: https://www.in-ulm.de/~mascheck/
・Unixにはシェルスクリプトに便利な小さなコマンド類がいろいろあります。
「並び換え (sort(1))」「検索 (grep(1))」等々。
Manページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.htmlなど)を見ましょう。
apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
2019/07/02(火) 00:29:24.94ID:rBxHnYzF
↑一個のスレに収まるギリギリ……。
2019/07/02(火) 05:21:24.78ID:uO4UDEG+
なんかどうも理解してないようだから、続きのひとレス
動くかどうかの問題無いじゃないんだよ。cat 以後の cat の出力に対してのという表記に見えるのが好みじゃないってとこなんだよ。わかるかなあ?
例で cat | while でやることと、前処理と前処理の調整は別のもん。なのにってとこだよ。そこが無理してんなということだよ。わかるかなあ?まあ、わからんだろうけど
そういう「俺の好み」からはナイなということだよ。言ってもわからんだろうけど、いちおう最後にということで
動くかどうかの問題無いじゃないんだよ。cat 以後の cat の出力に対してのという表記に見えるのが好みじゃないってとこなんだよ。わかるかなあ?
例で cat | while でやることと、前処理と前処理の調整は別のもん。なのにってとこだよ。そこが無理してんなということだよ。わかるかなあ?まあ、わからんだろうけど
そういう「俺の好み」からはナイなということだよ。言ってもわからんだろうけど、いちおう最後にということで
2019/07/02(火) 05:29:38.90ID:Atdu9zIi
明確な理由がなくて、単に好みとだけ言ってたら
賛同を得られないのは当たり前。
bashはだめだよ。好みじゃないもの(笑)
賛同を得られないのは当たり前。
bashはだめだよ。好みじゃないもの(笑)
2019/07/02(火) 05:31:07.65ID:Atdu9zIi
変数のスコープを考えろって話だ。
前処理だろうが、後処理だろうが、
変数を参照するならば、同じ階層(かそれ以下)でなければならない。
関数の外で、関数内の変数を参照しようっていうのがそもそも間違い。
前処理だろうが、後処理だろうが、
変数を参照するならば、同じ階層(かそれ以下)でなければならない。
関数の外で、関数内の変数を参照しようっていうのがそもそも間違い。
2019/07/02(火) 05:34:16.34ID:Atdu9zIi
例えば、
hoge=0 # ← ==== ここで変数定義 ==== ・・・ (A)
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done < <(cat)
if [ hoge = 0 ]; then # ← ==== ここで使用してる ====・・・ (B)
前処理の調整
else
前処理の調整
fi
というコードの場合、少なくともAからBの間は
同一スコープ(=サブシェル ≒ 関数)内になければいけない
関数内で定義したローカル変数は、関数内でしか参照できないのと一緒。
これぐらいはすぐに理解しよう。
hoge=0 # ← ==== ここで変数定義 ==== ・・・ (A)
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done < <(cat)
if [ hoge = 0 ]; then # ← ==== ここで使用してる ====・・・ (B)
前処理の調整
else
前処理の調整
fi
というコードの場合、少なくともAからBの間は
同一スコープ(=サブシェル ≒ 関数)内になければいけない
関数内で定義したローカル変数は、関数内でしか参照できないのと一緒。
これぐらいはすぐに理解しよう。
2019/07/02(火) 05:38:13.57ID:Atdu9zIi
関数の中で、前処理、後処理(前処理の調整)を
したくないっていうのなら、こうなる。
foo() {
hoge=0
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done
[ hoge = 0 ]
}
前処理
if cat | foo; then
前処理の調整
else
前処理の調整
fi
これはもうシェルスクリプトがどうとかいうんじゃなくて、
個人のプログラミング技術レベルの問題
まともな設計能力があればできること
ワンライナーとかシェル芸とかばっかりやってると
こういうプログラミング能力が身につかないのかもなw
したくないっていうのなら、こうなる。
foo() {
hoge=0
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done
[ hoge = 0 ]
}
前処理
if cat | foo; then
前処理の調整
else
前処理の調整
fi
これはもうシェルスクリプトがどうとかいうんじゃなくて、
個人のプログラミング技術レベルの問題
まともな設計能力があればできること
ワンライナーとかシェル芸とかばっかりやってると
こういうプログラミング能力が身につかないのかもなw
2019/07/02(火) 05:38:23.13ID:uO4UDEG+
別にそれでいいよ。別に俺はあなたにそう使うなとは言ってないし、bashのを使えとも言ってないけど?どう書くのかなあと聞いただけだよ、理解してお礼も言っているのにw
あなたが根本的に勘違いしているのは自分は正しい他は間違いってとこだね。賛同とかw別にあなたに賛同を求めてはいないよ?はなから。
>>9は無茶苦茶。なにかひどく後で出た巻数にすればいいに自信を持っているように見えるんだが、勝手にいろいろ妄想しすぎです
なんか異常に自分は正しいに拘るのね。わからん
あなたが根本的に勘違いしているのは自分は正しい他は間違いってとこだね。賛同とかw別にあなたに賛同を求めてはいないよ?はなから。
>>9は無茶苦茶。なにかひどく後で出た巻数にすればいいに自信を持っているように見えるんだが、勝手にいろいろ妄想しすぎです
なんか異常に自分は正しいに拘るのね。わからん
2019/07/02(火) 05:40:12.69ID:rBxHnYzF
>>7
正直,お前の好みと可搬性だったら可搬性を優先するわ。
正直,お前の好みと可搬性だったら可搬性を優先するわ。
2019/07/02(火) 05:41:35.09ID:Atdu9zIi
>>12
お前なんの話してるの?
POSIX準拠だとサブシェルの中で変数を書き換えられないって
言ってたから、正しいプログラミングをすれば、それは問題にならないって
実例を上げて説明したんだが?
で、お礼も言わずに「俺の好みじゃない」と言ってるだけじゃん
お前なんの話してるの?
POSIX準拠だとサブシェルの中で変数を書き換えられないって
言ってたから、正しいプログラミングをすれば、それは問題にならないって
実例を上げて説明したんだが?
で、お礼も言わずに「俺の好みじゃない」と言ってるだけじゃん
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【東京】わずか9平方メートル…都心に近い「極小」アパートが若者に人気 狭くても“住めば都” [煮卵★]
- 「外国人はもう日本を選ばなくなる」経営者たちが抱く深刻な懸念 ベトナム人実習生なしでは「成り立たない街」…【多文化共生企画】 [少考さん★]
- 【△】コンビニの鮭おにぎり、価格にネット衝撃「ついに…」 驚き続々「これはキツい…」「日本人を殺しに来てる」 ★2 [ぐれ★]
- 上野動物園の双子パンダ、1月末に中国に返還へ 国内でパンダ不在に ★2 [蚤の市★]
- 「ルンバ」製造のアイロボット、連邦破産法11条適用申請-近年収益減 [少考さん★]
- 【伊東市長選】「きょうは行きたくない」 落選の田久保眞紀 前市長が”取材拒否” 約束の場所に姿を現さず 最後まで誠実さを欠く [ぐれ★]
- 「甲鉄城のカバネリ」ってなんで過小評価されてるの? [746560692]
- 有名漫画家「差別するやつは、少なくとも正直者ではある。一方、「差別反対」を言うやつは大体嘘つき。」 [762037879]
- 「刀使ノ巫女」(とじのみこ)ってなんで過小評価されてるの? [746560692]
- 京アニ「ℂ 𝕀 𝕋 𝕐」ってなんで過小評価されてるの? [746560692]
- 【高市悲報】中国「だから事前通知してたやろ…」日本「ろ、論点をずらすな~!😡根拠を言えぇ!!」 [359965264]
- 【年金支給日】今日は偶数月の15日だ❗うおおおおおおおおおお★2🏡
