シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)もしくはPOSIX準拠の互換シェルがデフォルトです。
bash/zsh/ksh/ash/dash/yash/poshなどの専用機能に依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
・POSIXについてのリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています
最新の仕様はこちらへ http://pubs.opengroup.org/onlinepubs/9699919799/
(左上の「Shell & Utilities」 から参照することができます。)
・v7 shに一番近くて、現役(?)のshは、OpenSolaris由来のheirloom sh。
http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
「そういうのはperl使いましょう」と回答するのはやめましょう。
安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
質問に対して問題が間違ってるといちゃもんをつけるのもやめましょう
シェルスクリプト総合 その27
https://mevius.5ch.net/test/read.cgi/unix/1525337663/
探検
シェルスクリプト総合 その28
■ このスレッドは過去ログ倉庫に格納されています
2018/08/02(木) 05:22:16.82
2018/11/29(木) 21:56:13.42
なんか混乱しとるなw
まあ、ダブルクォートは、他言語を使っている人からすれば
直感に反する機能だってことに、俺も最近気づいたんだけどな
ただどこがどう違うかを言葉で説明したことがわけじゃない。やってるみるか?
・シェルスクリプトは文字列として展開されて実行されているようでそうではない
・ダブルクォートは文字列を囲う機能ではなく、変数展開の挙動を変えるエスケープの一種
この二つに集約されるかなぁ
> しかし、ETAGはダブルクオートを含むし
これ関係ないんだわ
OPT=('--header' "If-None-Match: ${ETAG}")
だと
OPT=('--header' "If-None-Match: "686897696a7c876b7e"")
こうなってしまい
OPT=('--header' "If-None-Match: " 686897696a7c876b7e "")
のように解釈されると思ってしまうが違う。
別に文字列展開されてから、動くわけじゃない
ダブルクォートは「 If-None-Match: ${ETAG} 」の部分を一つの引数として
扱いますよー(ただし中の変数は展開されますよ)という意味。
変数の中にダブルクォートが入っていようが改行が入っていようが関係ない
またダブルクォートはそれだけの機能ではなく $@ が入っている場合に異なる挙動をする
"$@" が入っている場合、一つの引数ではなく複数の引数として扱われる
例えば引数$1〜$5が存在する場合、"$@" は "$1" "$2" "$3" "$4" "$5" と等価
また"foo$@bar" となっていた場合、 "foo$1" "$2" "$3" "$4" "$5bar" と等価
引数が一つなら "foo$1bar" だし、引数がゼロの場合は、書かなかったのと同じとなる("" 空文字にはならない)
このように文字列として囲う機能じゃなくて、中に入ってる文字や変数の解釈の仕方に影響を与える機能
まあ、ダブルクォートは、他言語を使っている人からすれば
直感に反する機能だってことに、俺も最近気づいたんだけどな
ただどこがどう違うかを言葉で説明したことがわけじゃない。やってるみるか?
・シェルスクリプトは文字列として展開されて実行されているようでそうではない
・ダブルクォートは文字列を囲う機能ではなく、変数展開の挙動を変えるエスケープの一種
この二つに集約されるかなぁ
> しかし、ETAGはダブルクオートを含むし
これ関係ないんだわ
OPT=('--header' "If-None-Match: ${ETAG}")
だと
OPT=('--header' "If-None-Match: "686897696a7c876b7e"")
こうなってしまい
OPT=('--header' "If-None-Match: " 686897696a7c876b7e "")
のように解釈されると思ってしまうが違う。
別に文字列展開されてから、動くわけじゃない
ダブルクォートは「 If-None-Match: ${ETAG} 」の部分を一つの引数として
扱いますよー(ただし中の変数は展開されますよ)という意味。
変数の中にダブルクォートが入っていようが改行が入っていようが関係ない
またダブルクォートはそれだけの機能ではなく $@ が入っている場合に異なる挙動をする
"$@" が入っている場合、一つの引数ではなく複数の引数として扱われる
例えば引数$1〜$5が存在する場合、"$@" は "$1" "$2" "$3" "$4" "$5" と等価
また"foo$@bar" となっていた場合、 "foo$1" "$2" "$3" "$4" "$5bar" と等価
引数が一つなら "foo$1bar" だし、引数がゼロの場合は、書かなかったのと同じとなる("" 空文字にはならない)
このように文字列として囲う機能じゃなくて、中に入ってる文字や変数の解釈の仕方に影響を与える機能
2018/11/29(木) 22:00:40.89
ちなみに "$@" を複数の引数に展開されたくなければ "$*" を使う
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- NVIDIA幹部「日本、もうロボット大国ではない」 AIで一変 [少考さん★]
- 青切符導入を前に取り締まりが厳格化 自転車の違反でクルマの免停が急増中 [七波羅探題★]
- 「Fラン大卒より高卒」企業人事部が断言する🧐"定着率"と"成長力"の明確な差 [パンナ・コッタ★]
- 芸人・永野が断言 令和が「1」なら昭和は「100楽しかった」「夢いっぱいだった」★2 [muffin★]
- 【サッカー】日本が2046年W杯の開催地に立候補 宮本会長「手を挙げる予定」 他国との共催を視野 8万人収容スタジアム問題も [冬月記者★]
- 電車内で財布盗んだか 中国人の男2人逮捕 短期滞在でこれまでに16回来日 [七波羅探題★]
- 【実況】博衣こよりのえちえちMIMESIS🏴‍☠🐏🎪🧪
- 【高市朗報】山上ついに謝罪!「何の恨みもありません。非常に申し訳ないことをした」 [686538148]
- 伊藤園、10月に値上げした「お~いお茶」を2026年3月1日からまた値上げ [663766621]
- 天音かなたそ😇🪽の思い出を語ろう🏡
- 【貧困ジャップ速報】LAWSON、ついにゆでただけのパスタ(具無し)を230円で売るwwwwwwwwwwwwwwwwwwww [802034645]
- 【速報】高市総理「国益を最大化することが私の責任です!」😳 [518915984]
