トップページunix
987コメント345KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2008/10/16(木) 00:48:38
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

前スレ
シェルスクリプト総合 その12
http://pc11.2ch.net/test/read.cgi/unix/1218277263/
0382名無しさん@お腹いっぱい。2008/12/03(水) 07:27:42
>>381
>>381
hogeの内容が空だから、
if [ = 10 ]; then
となって testコマンドから見るとエラーになる。

if [ "$hoge" = 10 ]; then
とすること。
0383名無しさん@お腹いっぱい。2008/12/03(水) 08:23:55
>>377
そのファイルリスト中のファイルの所有者は自分(root?)だけ?
他人所有のディレクトリ内のファイルでそれをやると危険。
0384名無しさん@お腹いっぱい。2008/12/03(水) 09:46:43
>>377
(IFS="";
while read x; do
rm -vf "$x"
done < file_list)
0385名無しさん@お腹いっぱい。2008/12/03(水) 09:48:55
-rがあるreadなら付けた方がいいです。
\や改行が含まれるパス名がある場合のみですが。
0386名無しさん@お腹いっぱい。2008/12/03(水) 11:18:08
【シェルスクリプトについて】

シェルスクリプトは、短く書けるが、後で可読性が悪い。
他人の書いたシェルスクリプトを解読するためには、予め、
言語仕様を幅広く勉強しておく必要がある。
例えば、"$(cat file)" が `cat file`と同じ意味だと分かるのは、
ある種の幸運が必要だ。この手の物は、本やネットでも検索しよう
がないから。

文脈で記号の意味が変動しやすいことも理解を難しくする。
"$variable"は、変数が展開されるが、'$variable'では展開されない。
ならば、`cat $variable` ではどちらか・・・。推測不可能だ。
0387名無しさん@お腹いっぱい。2008/12/03(水) 11:32:51
>>386
"$(cat file)" は `cat file`と同じ意味ではない。

よってこの文章読む価値なし
0388名無しさん@お腹いっぱい。2008/12/03(水) 11:36:13
PATH = xxxx:$PATH
export PATH

↑これもややこしい部分。

左辺では、PATHと書くのに、右辺では$PATHと書く。exportでは、
再び$を書かない書き方。よく考えれば分からないわけでもないが、
同じ変数なのに場所によって変わってしまうのは分かりにくい。
また、=があれば代入だとみなされるらしいが、外部コマンドの
呼び出しと余りにも微妙な差しかない。

また、シェル変数と環境変数の二つに分かれているので、exportが
必用。しかし、どちらも$変数名で参照できてしまう。
そして、シェル変数は小文字、環境変数は大文字なのに、なぜか、
シェル変数にpathがあり、環境変数にはPATHがあったりする。
0389名無しさん@お腹いっぱい。2008/12/03(水) 11:36:55
>>387
違いは?
0390名無しさん@お腹いっぱい。2008/12/03(水) 11:40:50
>>389
マジで知らないの?
>>386 自体、ネタだと思ったんだけど。他にも突っ込み箇所多数。

>>387
"$(cat file)" と同じなのは "`cat file`"

`cat file` と同じなのは $(cat file)
0391名無しさん@お腹いっぱい。2008/12/03(水) 11:43:33
>>388
> PATH = xxxx:$PATH
↑ この代入文自体が間違い。

これ、誰が書いた文章よ?
程度が低過ぎるから、間違い文章貼るのやめてくれるかな
0392名無しさん@お腹いっぱい。2008/12/03(水) 11:44:26
>>380
では、つっこみ箇所につっこんでみて。

>"$(cat file)" と同じなのは "`cat file`"
>`cat file` と同じなのは $(cat file)

なるほど。それはそうなんだろうけど、それらの違いは
具体的になんでしょう?
0393名無しさん@お腹いっぱい。2008/12/03(水) 11:46:32
>>386
>文脈で記号の意味が変動しやすい

間違い。記号の意味は変動しない。
ただ >>386 が ' ' と ` ` を混同してるだけ。

> `cat $variable` ではどちらか

どちらでもない。
$variable自体はクォートされていないから、
"$variable" でも '$variable' でもなく、
$variable として展開される。

外側の ` ` は、$variableの展開とは別物。
0394名無しさん@お腹いっぱい。2008/12/03(水) 11:50:56
>>392
たとえば、

$ echo `cat file`
とやると、fileの中の改行も、2個以上のスペースも、
ひとつのスペースに変換されて、全体が1行になって表示される。
ファイルの中に * とかがあったら、カレントディレクトリのファイル名に展開される。

$ echo "`cat file`"
なら、そのような変換は行なわれず、
ファイルの内容がそのままechoされる。


いずれも、このスレの回答者にとっては常識中の常識だから、
あまりスレのレベルを下げないでくれ。
0395名無しさん@お腹いっぱい。2008/12/03(水) 11:52:20
>>393
>>文脈で記号の意味が変動しやすい
>↑
>間違い。記号の意味は変動しない。

いいえ、この主張自体には間違いはない。

例えば、
ダブルクォーテーション中では、「$変数名」は展開されるのに、
シングルクォーテーション中では、「$変数名」は展開されない、
という様な事が、文脈によって「$変数名」の意味が変わっていると
みなせる。

もう一つの例としては、
=の左辺では、単に「変数名」と書くだけで変数名とみなされる
のに、右辺では単なる文字列とみなされてしまう、という事が
ある。これも「文脈」によって、解釈の方法が変わっている事の
例。例えば、C/C++/JavaやBasic言語などではこのような扱いは
ありえない。
0396名無しさん@お腹いっぱい。2008/12/03(水) 11:52:37
>>386
> 【シェルスクリプトについて】

最低限の言語習得も怠ったうすら馬鹿の書いた文章。
0397名無しさん@お腹いっぱい。2008/12/03(水) 11:53:53
>>391
間違い箇所は?

=の前後にスペースがあること?
0398名無しさん@お腹いっぱい。2008/12/03(水) 11:55:23
>>395
たった2000行しかないマニュアル(man)読めば書いてることだよ。
お前馬鹿だろ。
0399名無しさん@お腹いっぱい。2008/12/03(水) 11:56:09
>>384
それだと、fileの中の /tmp/hoge/??? というファイル指定が
文字通り ??? というファイルを指定してしまいます。
(3文字名のファイルを指定したい)
0400名無しさん@お腹いっぱい。2008/12/03(水) 12:03:19
eval "rm -vf $x"
0401名無しさん@お腹いっぱい。2008/12/03(水) 12:09:08
>>395
>ダブルクォーテーション中では、「$変数名」は展開されるのに、
>シングルクォーテーション中では、「$変数名」は展開されない、

その意味で言うならC言語でも同じことだろ。

C言語で、
「!var」は変数varの否定演算になるが、
「"!var"」は、単なる文字列になる。
ダブルクォーテーションがあるかどうかで、「!」という記号の意味が
「変動」してるなw

あと、C言語で、
"A" と 'A' の意味も違うしな。
0402名無しさん@お腹いっぱい。2008/12/03(水) 12:10:38
>>400
それだと、スペース入りファイル名の問題が再発します。
0403名無しさん@お腹いっぱい。2008/12/03(水) 12:15:50
>>395
> =の左辺では、単に「変数名」と書くだけで変数名とみなされる
> のに、右辺では単なる文字列とみなされてしまう、

Cでも、左辺値と右辺値は区別されている。左辺値になれない式が存在する。
Cでも文脈によって意味が変わるということだ。
0404名無しさん@お腹いっぱい。2008/12/03(水) 12:18:43
>>1
「文脈で変動している」
と言っても、コンピュータにはとっては筋が通っており、解析自体が
不可能なわけではない。

しかし、問題は、そのような例外が多くあると、シェルスクリプトの
初心者が他人のスクリプトを見た時に混乱しやすいことと、意味を調べ
たくても、検索し辛いことにある。

・「(英)単語」であれば検索しやすいが、記号だとしづらい。
・文脈依存性が強いと、調査に時間がかかる。
0405名無しさん@お腹いっぱい。2008/12/03(水) 12:20:36
>>403
変動はしているが、x に x + 1 を代入したい時は素直に、
x = x + 1;
と書けばよい。一方、シェルスクリプトでは、複雑なことになる。
evalやらを使うんだと思うが。
0406名無しさん@お腹いっぱい。2008/12/03(水) 12:25:05
404 の >>1 は、>>401 の間違い。
0407名無しさん@お腹いっぱい。2008/12/03(水) 12:28:30
>>388 の言いたいことがわからんでもないけど
もともとシェルはコマンド実行ユーティリティだから
普通のプログラム言語っぽく使えるだけて満足だがなあ

つ−か、書き方によってはサブシェルになる方が問題かと
0408名無しさん@お腹いっぱい。2008/12/03(水) 12:28:47
>>405
> evalやらを使うんだと思うが

ハイハイ、あなたの理解度はその程度ですねw
evalは使いません。勉強してから出直してね。
0409名無しさん@お腹いっぱい。2008/12/03(水) 12:30:28
>>405
bash限定でいいなら、
((x = x + 1))
って素直に書けるよ。

さらに、
((x++))
という書き方もできる。
0410名無しさん@お腹いっぱい。2008/12/03(水) 12:33:52
>>408
別に自慢のために書いているんじゃなく、シェルスクリプトの問題点を
考えたいと思っているだけなのに。
0411名無しさん@お腹いっぱい。2008/12/03(水) 12:36:49
evalではなく、exorか、$((xxx))だった。
0412名無しさん@お腹いっぱい。2008/12/03(水) 12:37:36
>>404
> しかし、問題は、そのような例外が多くあると、シェルスクリプトの
> 初心者が他人のスクリプトを見た時に混乱しやすいこと



自分が理解できていないことを「例外」ということにしたいのですね、わかります
0413名無しさん@お腹いっぱい。2008/12/03(水) 12:37:49
exor ---> expr
0414名無しさん@お腹いっぱい。2008/12/03(水) 12:41:33
ここは、言語の根本問題とかを議論できる場ではなかったかな。
勉強不足であろうがなかろうが、言語に問題があるかどうかが
議論したかったのに。
0415名無しさん@お腹いっぱい。2008/12/03(水) 12:50:40
>>414
そういうことを本気で議論したいなら、
まずは一通りでもその言語(シェルスクリプト)を習得してからじゃないと。
(批判しているつもりが、勉強不足のせいで批判ポイントがずれているしね)

>>386 のような間違いだらけの文章を書いたのでは、
どこに行っても誰にも相手にしてもらえないよ。
0416名無しさん@お腹いっぱい。2008/12/03(水) 13:04:01
「間違いだらけって」言っても、
$(cat file) と "$(cat file)"
の違いだけじゃん。
0417名無しさん@お腹いっぱい。2008/12/03(水) 13:20:13
それだけじゃないよ。
面倒だから、間違い箇所を挙げるだけにするよ。

(1)まず、
>"$(cat file)" が `cat file`

(2)
>本やネットでも検索しようがないから。
本の索引で記号は検索できる。
あと、man sh (man bash) でも lessで検索できる。

(3)
>文脈で記号の意味が変動
しない

(4)
>ならば、`cat $variable` ではどちらか
そもそも、' 'と ` ` の意味を理解していない。
「どちらか」という問い自体が間違い

(5)
>推測不可能だ
マニュアルに載ってる。推測なんて不要。
0418名無しさん@お腹いっぱい。2008/12/03(水) 13:20:46
(6)
>PATH = xxxx:$PATH
スペースを入れちゃ駄目

(7)
> =があれば代入だとみなされる
というわけでもない

(8)
>シェル変数は小文字、環境変数は大文字
とは限らない

(9)
>シェル変数にpathがあり
そんなものない

ざっと挙げても9箇所間違い。もっと細かく見ればもっと間違いが出てくるだろう。
0419名無しさん@お腹いっぱい。2008/12/03(水) 13:23:16
あんたは、頭が固いだけじゃん。
0420名無しさん@お腹いっぱい。2008/12/03(水) 13:32:21
よしんば文章内に間違いがあったとしても、間違いを含む文章だから議論の価値なしとして切り捨てるのは下だわな。
単語である点として間違っているのと、議論の筋である線として間違っているのは別だろうに。

しかし>>386の言うような問題があるとして、今更仕様を変えられるわけでもなし…
他人に理解しにくいように書けというならばどの言語でもできるのだから、
"シェルスクリプトにおいて可読性の高めるためにはどのようにすればよいか?また、スレの住人はどのような工夫をしているか?"
というのが妥当な議題になるのか。
0421名無しさん@お腹いっぱい。2008/12/03(水) 13:33:30
>>417
>(2)
>>本やネットでも検索しようがないから。
>本の索引で記号は検索できる。
>あと、man sh (man bash) でも lessで検索できる。

検索できません。試しに、Googleで、$(cat file)や、
"$(cat file)"を検索する方法を明示してください。

>(3)
>>文脈で記号の意味が変動
>しない

しまくってます。C/C++/Java の様な言語と比べれば雲泥の差です。
詳しくは知りませんが、シェルスクリプトは、「文脈依存文法」とでも
呼ぶべき様な言語に属すると思います。

>(4)
>>ならば、`cat $variable` ではどちらか
>そもそも、' 'と ` ` の意味を理解していない。
>「どちらか」という問い自体が間違い

理解してます。その上で、バッククォーテーションの中で、$varが展開さ
れるかどうかは、マニュアルを読まないことには推測できないと言っている
わけです。
0422名無しさん@お腹いっぱい。2008/12/03(水) 13:35:13
>(5)
>>推測不可能だ
>マニュアルに載ってる。推測なんて不要。

マニュアルに載っていたとしても、推測できる言語と出来ない言語では、
分かりやすさが全く違ってきます。Makefile なども非常に頭の良い人でも
マニュアルを読まずして推測するのが難しい構文が多いのです。
マニュアルを読まずして推定できる、と言う言語仕様を開発するのは、
ある種の力量が必要なのです。

>(7)
>> =があれば代入だとみなされる
>というわけでもない

シンボル名=
で、代入と見なされるはずです。違うというなら、それはそれで
文脈依存性が強い言語と言うことになりますが。

>(8)
>>シェル変数は小文字、環境変数は大文字
>とは限らない
>(9)
>>シェル変数にpathがあり
>そんなものない

これについては、シェルの種類に依存するようです。
0423名無しさん@お腹いっぱい。2008/12/03(水) 13:40:33
>>420
文章の間違いって、許容できるのは漢字の間違いとか、そういうレベルのことだろ。

議論の筋の根幹にかかわる部分で理解不足による間違いがあれば、
議論をしてもポイントずれまくりで話にならない。

シェルスクリプトについて教えて欲しいなら、
素直に「教えてください」って言えよ。
議論ふっかけを装って、実は自分の理解不足なところを質問したいだけだろ?
0424名無しさん@お腹いっぱい。2008/12/03(水) 13:43:38
>>421
> 理解してます。その上で、バッククォーテーションの中で、$varが展開さ
> れるかどうかは、マニュアルを読まないことには推測できない


それは「バッククォーテーションを理解していない」という。
そもそも ` ` と $var の展開は別物なんだから。
04253862008/12/03(水) 13:46:49
>シェルスクリプトについて教えて欲しいなら、
>素直に「教えてください」って言えよ。
>議論ふっかけを装って、実は自分の理解不足なところを質問したいだけだろ?

違います。シェルスクリプトの問題点を整理し、新しい言語仕様の策定に
役立てたいと思っているだけです。確かに、現状のシェルスクリプトにつ
いての理解も不十分ではありましたが。その点については反省します


「文脈依存性」について、考えてみましょう。
`xxx`は、コマンドxxxを実行し、その標準出力の結果をそこに展開する、
という意味です。しかし、これも、もし、
expand_stdout("command aaa${var}bbb")
expand_stdout('command aaa${var}bbb')
と書くのであったならば、マニュアルを読むことなく、${var}が展開
されるかどうかが一目瞭然であったんです。

これを、バッククォーテーション一つで実現しようとしたこと自体に
問題があるのではないでしょうか?
04263862008/12/03(水) 13:49:03
>>424
仕様を知りませんが、
`"command ${var}"`
で${var}を展開できるんですか?すか。

だとすると、今度は、double quotation が back quatationの中で
「展開される」
という事実がマニュアルなしでは推定できません。
04273862008/12/03(水) 13:54:37
「文字列中のパラメータ・ラインとして展開する」
--->expand_param("文字列")
「文字列をコマンドとして実行し標準出力を展開する」
--->expand_stdout("文字列")
もし、こういう仕様であったなら、

"$(cat file)" は、丁度、
expand_param(expand_stdout("cat file"))
というように書け、なんの推定の余地もないはずだったのです。
もしこうであったなら、マニュアルを読まなくても、色々な展開パターン
を好きなように書けます。展開の順序も推定の余地がありませんし。
04283862008/12/03(水) 13:55:32
誤字訂正:
「文字列中のパラメータ・ラインとして展開する」
--->
「文字列をパラメータ・ラインとして展開する」
04293862008/12/03(水) 13:58:41
>>427の例とは逆に、>>426のように、変数を展開してからバッククォーテーション
を実行したい、という場合ならば、

expand_stdout(expand_param("command $var"));

で書けるわけです。この場合、""や``の中で色々な記号が「展開」される
かどうかを憶えている必要もないし、マニュアルを読み込む必要もありま
せん。
0430名無しさん@お腹いっぱい。2008/12/03(水) 13:58:46
シェルっていうのは、本来はインタラクティブな目的のためのもので、
記述量を多くして読みやすくするための言語じゃない。

前提知識なしに読みやすくしたいなら、外部コマンドを呼ぶにも、
execute_external_command("ls", "-l");
と書くような言語を作らないといけない。

他の適当なスクリプト言語使っとけと。
0431名無しさん@お腹いっぱい。2008/12/03(水) 13:58:57
>>421
Google で検索可能だなんて >>417 は言ってないよ。
04323862008/12/03(水) 14:01:35
>>431
「本やネット」で検索できるかどうかを論じているわけです。
ネットで検索する場合、Googleで検索可能でないと、いったい何で
検索可能なんでしょうか?

記号単独の検索でも難しいのに、文脈依存性が高い言語仕様の場合、
探し出すのに非常に時間がかかります。
04333862008/12/03(水) 14:02:30
>>430
結局、そうなんです。

コマンドラインで短く打つ事と、わかりやすさのトレードオフになって
くるんでしょう。
0434名無しさん@お腹いっぱい。2008/12/03(水) 14:04:48
んじゃ、仕様が完成したら、ここに報告に来てくれ。
04353862008/12/03(水) 14:05:18
いや、ここで議論したい。
0436名無しさん@お腹いっぱい。2008/12/03(水) 14:05:46
で、トレードオフの結果が、今のシェルだ。
100歩ゆずって、plan9 の rc だ。
もっと勉強しろ。
04373862008/12/03(水) 14:07:03
>>436
今のシェルは、トレードオフの仕方が「下手」であったと考えます。
plan9のrcは知りません。
0438名無しさん@お腹いっぱい。2008/12/03(水) 14:26:00
>>437
お前の頭の悪さには負けるよ。
仕様も理解せずに批判しようと言うのだから。
レベルが低すぎて話にならない。
0439名無しさん@お腹いっぱい。2008/12/03(水) 14:28:03
30年も現役の言語を、
30分で読めるsh(1)さえ読まずに、
批判しようと言うのが間違ってる。
0440名無しさん@お腹いっぱい。2008/12/03(水) 14:34:08
>>439
一般人は30分では読めん。
0441名無しさん@お腹いっぱい。2008/12/03(水) 14:36:18
30年も現役であっても、このような劣悪な状態であったのは、市場が
閉鎖的であっただからか。
0442名無しさん@お腹いっぱい。2008/12/03(水) 14:54:18
ここは30年も使い続けられたクソ仕様の sh を
無理に延命させるスレということでいいよ。

まったく別の言語仕様のシェルがほしいって話なら
perl でも emacs でも好きなものを chsh で設定すればいいじゃないか。
このスレでやることじゃない。
0443名無しさん@お腹いっぱい。2008/12/03(水) 14:55:45
コマンドラインで短く打てて、インタプリタ方式だから試行錯誤が容易。
素人でも頑張ればなんとかかんとか使える敷居の低さが普及の最大の要因だと思う。

ところでシェルスクリプトとは全く別のスクリプトの策定に協力しろなどというのはこのスレの趣旨とは違うだろ。
シェルスクリプトで可読性が低いな、とか不便だな、とか思ったことはありませんか?と情報を集めるならばまだしも、議論を求めるのはお門違いだ。
0444名無しさん@お腹いっぱい。2008/12/03(水) 15:34:04
かつてあった(今もある?)OSつくろうスレみたいに、
シェル作ろうスレ立てて、
絶対投げ出さずみんなをひっぱっていくくらいの気概があるなら、
ついていくやつもいるんじゃなかろうか。

ここはそういう場ではないということだ。
0445名無しさん@お腹いっぱい。2008/12/03(水) 19:17:17
シェルスクリプトに大きな不満は無いな。
劣悪な状態だなんて思ってる人いる?

がっちり書きたいならperlなりなんなり使えばいいだけだし
0446名無しさん@お腹いっぱい。2008/12/03(水) 19:54:28
UNIX/Linux界隈でPowerShellみたいなものが主流になることは俺が生きてる内は無いだろうな
0447名無しさん@お腹いっぱい。2008/12/03(水) 22:19:35
Powershellが現行シェル(sh,bash.tcsh,zsh)より優れている点ってなんじゃい?
Windowsとの親和性が高いことの他にだが。
0448名無しさん@お腹いっぱい。2008/12/03(水) 22:29:27
後発だけあってPowerShellの「仕様は」強力でよくできてると思うが
コマンドインタプリタ/スクリプティング用途には起動が致命的に重くて
俺には使い道が無い

.NETやJava系は、そのプロセス起動の重さのお陰で
Unix流のツールボックスアプローチ的使い方には
全く不向きなプラットフォームだと思っている
計算性能においてははるかに劣るLLの方が、マシ
0449名無しさん@お腹いっぱい。2008/12/03(水) 22:55:00
GoogleがHotなんとかとかいうチト変わったシェル作ってなかったっけ?
0450>>3812008/12/03(水) 23:37:48
>>382
ありがとうございます。

ふと思ったのですが、数値比較の場合、どのようになりますか?

----- コーテーションなし------------------------------------
$ cat hoge.sh
#!/bin/sh

hoge=
if [ $hoge -eq 10 ]; then
echo hello
fi

$ ./hoge.sh
[: -eq: unexpected operator

----- コーテーションあり--------------------------------------
$ cat hoge.sh
#!/bin/sh

hoge=
if [ "$hoge" -eq 10 ]; then
echo hello
fi

$ ./hoge.sh
[: : bad number


どっちにしても、エラーがでる、、、、orz
0451名無しさん@お腹いっぱい。2008/12/04(木) 00:09:08
半日でえらくスレが消費されてて、
おそるべきはニートだなと改めておもった
0452名無しさん@お腹いっぱい。2008/12/04(木) 00:45:33
>>450
一体何をしたいんだ?

純正シェルでも使えるのか知らんが、適当にデフォルトの値(ここでは0)を決めておいて
${hoge:-0}
と書けば、hoge が宣言されていないか、宣言されているが値が無いときに 0 に評価される
0453名無しさん@お腹いっぱい。2008/12/04(木) 01:03:38
数値以外をはじかなければエラーがでる。
0454>>4502008/12/04(木) 07:03:48
>>452
おぉ、ありがっとん。
0455名無しさん@お腹いっぱい。2008/12/04(木) 08:35:29
sedで質問です。

sedの置き換え文字列に改行を含む場合、以下のようになります。

hoge() {
echo "start"
sed 's/hoge/foo \
bar/'
echo "end"
}

しかし、これですと、インデントがそろわず、不恰好になります。
インデントをずらす方法はないでしょうか?
0456名無しさん@お腹いっぱい。2008/12/04(木) 10:33:51
気にすんな。
0457名無しさん@お腹いっぱい。2008/12/04(木) 10:37:11
>>455
sedの内容を、シェル関数外でシェル変数(regex)とかに代入しておいて、
シェル関数内では sed "$regex" と書けば良い。


>>456
気にしろ
0458名無しさん@お腹いっぱい。2008/12/04(木) 13:03:26
bash/GNUツール前提でいいよ

あと最近は、OSXのやつらの台頭でスペース文字含みのファイルとか
余裕で出てくるようになったからその辺を気にしないといけなくなった
0459名無しさん@お腹いっぱい。2008/12/04(木) 13:18:18
>>457
regewxを定義するところが不恰好になるだけじゃ…

>>455
きにすんな
0460名無しさん@お腹いっぱい。2008/12/04(木) 13:28:40
sed `echo 's/hoge/foo \
bar/' | sed -e 's/ //g'`
二行目はhtab使ってるから注意しな。
0461名無しさん@お腹いっぱい。2008/12/04(木) 13:39:41
見た目を気にするならもっとまともな言語使え。
マニュアルを読まないと推定できないような言語じゃなくて。
0462名無しさん@お腹いっぱい。2008/12/04(木) 13:47:47
>>459
だから、インデントのいらない階層であるところの「シェル関数外」で
regexに代入するんだろ。
もともとインデントゼロのスコープに書くんだから、
不恰好にならない。

頭使え。
0463名無しさん@お腹いっぱい。2008/12/04(木) 14:01:24
>>455

N='
'

hoge() {
sed "s/hoge/foo ${N}bar/"
}


>>456
気にしろw
0464名無しさん@お腹いっぱい。2008/12/04(木) 14:06:14
あ、>>463 のsedの ${N}の前にバックスラッシュ入れてね。
なぜかこの環境から書き込むとバックスラッシュが化けるので、、

ダブルクォートの中だからバックスラッシュは2つね。
0465名無しさん@お腹いっぱい。2008/12/04(木) 23:01:38
新しい2ch語誕生の瞬間?






ってほどでもないかw
0466名無しさん@お腹いっぱい。2008/12/06(土) 10:43:43
>>465
気にすんな
0467名無しさん@お腹いっぱい。2008/12/06(土) 11:20:20
>見た目を気にするならもっとまともな言語使え。
>マニュアルを読まないと推定できないような言語じゃなくて。

シェルスクリプトすら書けないんなら、この業界から足をあらってカタギになれ!
0468名無しさん@お腹いっぱい。2008/12/06(土) 11:29:54
マニュアル読んだら推定じゃなくて理解してくれ。
0469名無しさん@お腹いっぱい。2008/12/06(土) 11:43:31
>マニュアルを読まないと推定できないような言語じゃなくて。
マニュアルを読んでも推定しかできないんなら、カタギになれ!
0470名無しさん@お腹いっぱい。2008/12/06(土) 12:07:18
マニュアルが完全じゃないこともそれなりにあるのがUnix
0471名無しさん@お腹いっぱい。2008/12/06(土) 13:06:54
>>467
何言ってんだおまえ
0472名無しさん@お腹いっぱい。2008/12/06(土) 21:49:18
`いいからカタギになれ
0473名無しさん@お腹いっぱい。2008/12/06(土) 22:13:05
ああちくしょう。超バカーなスクリプト書いてしまった↓

FOUND=false
netstat -lnx | grep /tmp/ssh | while read i; do
 set -- $i
 if [ -O "$9" ]; then
  SSH_AUTH_SOCK=$9; export SSH_AUTH_SOCK
  SSH_AGENT_PID=`echo $9 | cut -d. -f2`; export SSH_AGENT_PID
  FOUND=true
 fi
done
$FOUND || eval `ssh-agent -s`

シェルスクリプトでwhileはサブシェルなのだと何回やれば判るのかと・・・
0474名無しさん@お腹いっぱい。2008/12/06(土) 22:27:37
s/while/|while/; #今日はもうダメポ。寝る!
0475名無しさん@お腹いっぱい。2008/12/07(日) 00:28:05
文字列を返す関数を作るのが定石かと。
0476名無しさん@お腹いっぱい。2008/12/07(日) 00:37:51
shをインデントするツールないの?
0477名無しさん@お腹いっぱい。2008/12/07(日) 01:58:21
Emacs
0478名無しさん@お腹いっぱい。2008/12/07(日) 03:53:34
vim
0479名無しさん@お腹いっぱい。2008/12/07(日) 15:29:09
gedit
0480名無しさん@お腹いっぱい。2008/12/07(日) 17:40:52
vim /bin/sh ってやったら文字化けしましたが…
0481名無しさん@お腹いっぱい。2008/12/07(日) 19:13:55
vim -b /bin/sh -c '%!xxd'
■ このスレッドは過去ログ倉庫に格納されています