[過去ログ] シェルスクリプト総合 その31 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
893
(2): デフォルトの名無しさん [sage] 2019/10/17(木) 17:04:24.98 ID:z1/RyPhF(1/10) AAS
ファイルの存在確認なら、-fを使えばいいだろ?
895
(2): デフォルトの名無しさん [sage] 2019/10/17(木) 17:05:47.88 ID:z1/RyPhF(2/10) AAS
あ、ディレクトリに *.txt があるかどうかってことか?
898: デフォルトの名無しさん [sage] 2019/10/17(木) 17:10:05.98 ID:z1/RyPhF(3/10) AAS
getopts vs getopt だけどさ、
BSDにおいてgetoptのメリットって何?

BSD版のgetoptはロングオプションに対応してないし、
引数にスペースが入ったらうまく行かないし
使い勝手悪いと思うんだが。

もしかして最初に作られたのがgetoptで
それを改良してgetoptsがシェルビルトインとして作られた。
(その後GNU版getoptが改良され、getoptsよりも便利になった)
という流れだったりするの?
901
(1): デフォルトの名無しさん [sage] 2019/10/17(木) 17:13:24.29 ID:z1/RyPhF(4/10) AAS
>>896
896(2): デフォルトの名無しさん [sage] 2019/10/17(木) 17:08:50.43 ID:PM8kIYTO(2/6) AAS
>>893
ところがワイルドカード使うと途端に何も引っかからなくなる
アスタリスクを使うと、シェルが解釈して、
例えば、 ls * だと、 ls file1 file2 file3 file4 って実行したのと同じことになるんだぞ。
lsコマンドの中からはアスタリスクが使われてるかどうかなんてわからない。

そしてダブルクォートで括ると、lsコマンドの中から引数は "*" という文字列が渡されたようになるんだよ。
903: デフォルトの名無しさん [sage] 2019/10/17(木) 17:19:49.73 ID:z1/RyPhF(5/10) AAS
>>899
899(2): デフォルトの名無しさん [sage] 2019/10/17(木) 17:10:16.84 ID:e7ZwLQTq(2/2) AAS
普通のプログラミング言語と違って
シェルスクリプトはブーリアンの分岐は可能なら
if else 使うよりも && || が見やすく良いと思う
それだめ。 shellcheck使ってみ、エラーになる。

shellcheck において && || みたいな三項演算子風な使い方は
func && VALUE=ok || VALUE=ng
という書き方(変数代入)のみ認められる。

func && foo || bar
は認められない。

なぜかと言うと、
1. func が 正常終了して
2. foo が 異常終了すると
3. bar が 実行されるから

変数代入に限れば必ずVALUE=okは正常終了するから、
この書き方に限って許されてる。
だから、一応fooが必ず正常終了するものであれば、使えなくはないけど
静的解析ではそれを知ることが不可能なので、shellcheckはエラーになる。

あともう一つ、barが異常終了したとき、&& || だと $?はエラーになるが、
ifで書けばfi終了後、$? は正常終了になってるという違いもある。
だからset -eでの挙動が変わる。
904: デフォルトの名無しさん [sage] 2019/10/17(木) 17:21:53.83 ID:z1/RyPhF(6/10) AAS
もちろん、&& 単独、もしくは || 単独で 使うならば問題ない。

func && foo とか func || bar ならOK
906: デフォルトの名無しさん [sage] 2019/10/17(木) 17:33:24.48 ID:z1/RyPhF(7/10) AAS
あー、やっぱりそうなんや

外部リンク:en.wikipedia.org
外部リンク:en.wikipedia.org

getoptは1980年頃つくられた。初期のgetoptは低機能
その改良として getopts が1986年にBourne shellに実装されたらしい。

その後、getopts (Solaris) と getopt (GNU) それぞれ違うコマンドで
ロングオプションがサポートされ

どちらでもないBSD(macOS含む)では、従来どおり
低機能な getopt と それを少し改良した getopts があるが
どちらもロングオプションはサポートしてないと
907
(1): デフォルトの名無しさん [sage] 2019/10/17(木) 17:37:12.84 ID:z1/RyPhF(8/10) AAS
>>905
905(1): デフォルトの名無しさん [sage] 2019/10/17(木) 17:26:43.45 ID:PM8kIYTO(5/6) AAS
今度は ls "$dir/tmp/*.txt"
みたいなことしたらアクセスできませんみたいなことを言われた

>>901
なるほど
>>902
多分"*.txt"ファイルにアクセスしようとしてできないって言われたことが原因?
でもなぜかls *.txtみたいに、ファイル直だとイケる
だからダブルクォートで括るからいかんのや

ls "$dir/tmp/" * ".txt"
これが正解(スペースは目立たせるために入れただけ)

この書き方ダサいよなw

ちなみに古いシェル(poshだっけ?)でこれがうまく行かない
バグがあるのだが、まあ誰も気にしないわなw
908: デフォルトの名無しさん [sage] 2019/10/17(木) 17:40:52.02 ID:z1/RyPhF(9/10) AAS
getopts (Solaris) でロングオプションがサポートされたってシェルなんだ?って思ったら、
Solarisでは/usr/bin/getoptsが存在するのか・・・
紛らわしいな
外部リンク[html]:docs.oracle.com
909: デフォルトの名無しさん [sage] 2019/10/17(木) 17:43:27.80 ID:z1/RyPhF(10/10) AAS
あ、いや /usr/bin/getopts もあるにはあるが、libcのgetopt()実装が拡張されたから
それを使ってるBourne Shellでも使えるようになったのか

> getopts (Solaris enhanced)
> As a result, this new feature was also available in the built-in command getopts of the Bourne Shell.
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.042s