トップページunix
1001コメント305KB

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名無しさん@お腹いっぱい。2009/01/29(木) 06:54:48
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


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

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

前スレ落ちたみたいなのでリンク省略。
0889名無しさん@お腹いっぱい。2009/06/03(水) 11:03:05
>>888
そんなのを回避する方法は、お前以外の人間はいくらでも思いつく。
0890名無しさん@お腹いっぱい。2009/06/03(水) 12:08:48
>>887
>>877は、実行してしまったシェルスクリプトを後からどう
にかしたいらしいので、>>887みたいに、実行前にタイムマ
シンで戻ってシェルスクリプトを編集するのは不可じゃない
の?
>>887みたいに$?を使っていいなら、>>877はそもそも質問し
ていないと思うけど。
0891名無しさん@お腹いっぱい。2009/06/03(水) 13:44:26
>>890
質問を普通に読むことができれば、そういう考えには至らない。
0892名無しさん@お腹いっぱい。2009/06/03(水) 13:57:42
>>877はどこ行った?
0893名無しさん@お腹いっぱい。2009/06/03(水) 14:05:09
>>890
なんだ単なるネタか。余りにつまらないんでレスしちまったぜ。
これほど、つまらないネタを見るのは始めてだ。
0894名無しさん@お腹いっぱい。2009/06/03(水) 14:35:20
>>890
もしそういう問題ならシステムコールトレースでも仕掛けておけば
いいんじゃねーの?w
0895名無しさん@お腹いっぱい。2009/06/03(水) 15:24:06
>>887 さんの方法で解決しました。
echoの直前にセミコロンが抜けていますね。
ほかの方の回答は興味がないので無視させていただきました。
0896名無しさん@お腹いっぱい。2009/06/03(水) 15:41:55
では次の質問どうぞ。
0897名無しさん@お腹いっぱい。2009/06/03(水) 18:47:09
抜けてないw
0898名無しさん@お腹いっぱい。2009/06/03(水) 20:24:59
>>897
>直前 >直前 >直前
0899名無しさん@お腹いっぱい。2009/06/03(水) 22:11:34
正規表現でアルファベット6文字というのはどう書けばいいでしょう?
0900名無しさん@お腹いっぱい。2009/06/03(水) 22:17:08
>>899
>>1
>正規表現の話題はスレ違い(正規表現スレへ)
0901名無しさん@お腹いっぱい。2009/06/03(水) 22:21:06
>>900
うす!
0902名無しさん@お腹いっぱい。2009/06/04(木) 01:24:43
>>898
なにそれ?
0903名無しさん@お腹いっぱい。2009/06/06(土) 09:22:29
[を含むテキスト表示で困っています。
solari8 Cシェル環境において以下のシェルスクリプトでテキストに含まれる[]が表示できなくて困っています。
echo `cat fileA`
fileAの中身は下記です。
1234[aa]
このまま表示したいのですが、実行すると「echo:一致しません」と表示されます。
fileAの中身を"1234[aa]"でも1234\[aa\]にしても変わりません。
echo文は変えられないので何とかfileAの中身を工夫して1234[aa]と表示できる方法をどなたかご教示いただけないでしょうか?
0904名無しさん@お腹いっぱい。2009/06/06(土) 10:47:36
> fileAの中身を工夫して1234[aa]と表示できる方法
そんな方法は無い。不可能。絶対に無理。
0905名無しさん@お腹いっぱい。2009/06/06(土) 11:55:02
csh% echo "`cat fileA`"
はどうなの?
0906名無しさん@お腹いっぱい。2009/06/06(土) 12:52:52
>>905
>echo文は変えられないので
0907名無しさん@お腹いっぱい。2009/06/06(土) 13:49:29
>>903
シェルを変えろ。話はそれからだ。
0908名無しさん@お腹いっぱい。2009/06/06(土) 14:02:49
echoのソースを八苦するしか無いなw
0909名無しさん@お腹いっぱい。2009/06/06(土) 14:04:46
>>903
alias echo 'cat'
0910名無しさん@お腹いっぱい。2009/06/06(土) 14:21:02
cshの話題だから敢えて無視してたけど、
マジレスするとechoより前に set noglob すればOK
ただし、そのスクリプト自体変更できないと言うなら不可能。
0911名無しさん@お腹いっぱい。2009/06/06(土) 16:03:34
903です。
皆様ありがとうございます。
スクリプト自体を変更できないのです。^^;
残念ながらあきらめるしかないのですね。
お手数ですが、不可能な理由をご教示願えないでしょうか?
0912名無しさん@お腹いっぱい。2009/06/06(土) 16:04:05
出来ないように作られているから。
0913名無しさん@お腹いっぱい。2009/06/06(土) 18:53:00
#!/bin/csh とか -f を付け忘れてるスクリプトなら、.cshrc でなんとかなるかも
0914名無しさん@お腹いっぱい。2009/06/06(土) 23:31:54
そこまでcshでがんばる理由も無いと思うけどね。乙。
0915名無しさん@お腹いっぱい。2009/06/08(月) 22:21:18
abcdefg を
a
b
c
d
e
f
g
と表示する方法ありますか?
0916名無しさん@お腹いっぱい。2009/06/08(月) 22:27:37
>>915
>>850
0917名無しさん@お腹いっぱい。2009/06/10(水) 02:11:49
パスを変えてecho -> /bin/cat を優先させるという
0918名無しさん@お腹いっぱい。2009/06/10(水) 14:51:51
内部コマンドじゃないの?
0919名無しさん@お腹いっぱい。2009/06/10(水) 15:08:27
>>909 = >>917 は根本的に勘違いしてる。
たとえechoが内部コマンドじゃなかったとして、
echoをcatにすり替えることができたとしても、

>>903
> echo `cat fileA`
は、

cat `cat fileA`

になるだけ。これでは何の解決にもなっていない。
0920名無しさん@お腹いっぱい。2009/06/11(木) 00:03:40
何が目的で
cat fileA
じゃなくて
echo `cat fileA`
としてるのか問い詰めたい
0921名無しさん@お腹いっぱい。2009/06/11(木) 00:10:30
cat fileAと
echo `cat fileA`
は明らかに異なるが。どうして同一だと考えられるのだろう。
問い詰めたい。問い詰めたい。問い詰めたい。問い詰めたい。
0922名無しさん@お腹いっぱい。2009/06/11(木) 00:58:46
>>903
これってうちのtcsh 6.15.00だと再現しないんだけど純正csh限定なの?
0923名無しさん@お腹いっぱい。2009/06/11(木) 09:57:44
debianのパッケージで入れたcshでも再現しないな。パッケージのバージョンは
20070713-2となっているが元がどういうのかはよくわからない。

どういう仕組みでそうなるんだろうか。solarisのcshに独自の何かがある?
0924名無しさん@お腹いっぱい。2009/06/11(木) 17:12:08
copyrightファイルに書いてあるだろ
>The original sources were retrieved from the OpenBSD CVS repository
>(anoncvs@anoncvs.openbsd.org:/cvs). The upstream tarball can be
>recreated using `debian/rules get-orig-source'.

オリジナルとの差分
http://patch-tracking.debian.net/package/csh/
0925名無しさん@お腹いっぱい。2009/06/11(木) 23:17:47
次スレのテンプレに、

「cshの話題は厳禁」

明記よろ
0926名無しさん@お腹いっぱい。2009/06/11(木) 23:33:07
csh限定のシェルスクリプトスレでも建てれば?
そもそもシェルスクリプトにこだわる理由も無さそうだが。
0927名無しさん@お腹いっぱい。2009/06/12(金) 16:41:03
'' の中に変数を書いたら、ダメですか?

sed -e 's/$iどうたら/こうたら/' とか。
0928名無しさん@お腹いっぱい。2009/06/12(金) 18:11:14
>>927
恥ずかしいほど基本。
''は変数置換しない。""はする。
0929名無しさん@お腹いっぱい。2009/06/16(火) 00:02:05
>>925,926

なぜcshの話題はだめなのかを誘導しないと「どうしてcshの話題はだめなのですか?」ってのが繁殖するよ
0930名無しさん@お腹いっぱい。2009/06/16(火) 04:23:38
どうしてcシェルスクリプトの話題には、ちゃんと答えられないのですか?
0931名無しさん@お腹いっぱい。2009/06/16(火) 09:07:56
cshは専用のスレがあるからそっちで、で十分だと思うけど。
0932名無しさん@お腹いっぱい。2009/06/16(火) 10:01:06
csh使ってないから。
0933名無しさん@お腹いっぱい。2009/06/16(火) 18:05:06
シェルスクリプトでcshとか・・・おっそ
0934名無しさん@お腹いっぱい。2009/06/16(火) 18:16:09
cshインストールしてあるマシンが手元に無い。
0935名無しさん@お腹いっぱい。2009/06/17(水) 02:41:25
rootのシェルがデフォでcだな。
0936名無しさん@お腹いっぱい。2009/06/17(水) 11:50:49
OS名すら書かずに。
0937名無しさん@お腹いっぱい。2009/06/17(水) 11:54:43
ログインシェルのデフォルトが何かと
シェルスクリプト書くのに何を使うかは
まったく別の話。
0938名無しさん@お腹いっぱい。2009/06/17(水) 11:56:05
エスパーしろよ。rootのデフォcが今でも残ってる時代遅れは*BSDのみ。
0939名無しさん@お腹いっぱい。2009/06/19(金) 01:33:31
犬はbash以外無いからな。リーナスの趣味だっけか。
0940名無しさん@お腹いっぱい。2009/06/19(金) 02:33:32
ログインシェルにはtcshがお薦めですって言って回っていいほど
bashが肥大化しててワラタw
0941名無しさん@お腹いっぱい。2009/06/19(金) 03:09:31
zshに比べたらまだまだだがな
0942名無しさん@お腹いっぱい。2009/06/19(金) 06:10:47
そして毎日肥大化したbashでスクリプトが実行されてしまってる罠。
0943名無しさん@お腹いっぱい。2009/06/19(金) 07:29:20
deb系はdashがデフォルトだよ。
リーナスはSystemV贔屓だが、GNUはあんまり良く思ってないだろう。
emacsとかGNOMEとかGPL3とか悪口言いまくりだし。
0944名無しさん@お腹いっぱい。2009/06/19(金) 18:11:24
dashはリダイレクト処理がバグってる糞シェルだ
Debian信者の俺が言うのもなんだけど
0945名無しさん@お腹いっぱい。2009/06/19(金) 18:15:54
>>944
バグについて詳しく
0946名無しさん@お腹いっぱい。2009/06/19(金) 18:20:08
LANG=ja_JP.eucJP ならバグらないよ。
0947名無しさん@お腹いっぱい。2009/06/19(金) 18:33:14
日本語のファイル名なんて使わないからどうでもいいが、
それを抜きにしても ja_JP.eucJP で使うのが基本。
UTF-8は問題が多い。
0948名無しさん@お腹いっぱい。2009/06/19(金) 19:00:53
スクリプトにLANG=Cって書くのは…ダメ?
0949名無しさん@お腹いっぱい。2009/06/19(金) 20:38:55
>>948
えっと、LANG=C ならもろバグります。(解決になりません)
LANG=ja_JP.eucJPの時はバグらないと。(ただしファイル名もEUC-JPで作られる)
0950名無しさん@お腹いっぱい。2009/06/19(金) 20:39:54
どういうバグなん?
0951名無しさん@お腹いっぱい。2009/06/19(金) 21:44:10
ググればヒットすんだろ
http://znz.s1.xrea.com/t/?date=20090608
0952名無しさん@お腹いっぱい。2009/06/19(金) 21:48:47
ああ、今ググったよありがとう
0953名無しさん@お腹いっぱい。2009/06/19(金) 22:07:02
これか。
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=532302
0954名無しさん@お腹いっぱい。2009/06/19(金) 22:17:37
リダイレクトだけじゃなくて、
シェル変数に代入してもバグるね。

$ echo $LANG
ja_JP.UTF-8

$ bash -c 'a="あいうえお"; echo "$a"'
あいうえお

$ dash -c 'a="あいうえお"; echo "$a"'
?????
0955名無しさん@お腹いっぱい。2009/06/19(金) 22:31:40
$ dash -c 'a="あいうえお"; echo "$a"'
あいうえお

はて?
0956名無しさん@お腹いっぱい。2009/06/19(金) 22:45:36
$ echo $LANG
ja_JP.UTF-8

$ dash -c 'printf "????n"'


$ dash -c 'a=`printf "????n"`; echo "$a"'


$ bash -c 'a=`printf "????n"`; echo "$a"'
0957名無しさん@お腹いっぱい。2009/06/19(金) 22:47:42
$ echo $LANG
ja_JP.UTF-8

$ dash -c 'printf "¥343¥201¥202¥n"'


$ dash -c 'a=`printf "¥343¥201¥202¥n"`; echo "$a"'


$ bash -c 'a=`printf "¥343¥201¥202¥n"`; echo "$a"'
0958名無しさん@お腹いっぱい。2009/06/19(金) 22:53:53
$ dash -c 'a=`printf "\343\201\202\n"`; echo "$a"'


無問題、てかおまいの書き込みはbackslashじゃなくてyenになってんぞ?
0959名無しさん@お腹いっぱい。2009/06/19(金) 23:46:22
バッシュカスワラタw
0960名無しさん@お腹いっぱい。2009/06/20(土) 00:07:12
バグってるのは dashの方で、bashは正常なんだが
0961名無しさん@お腹いっぱい。2009/06/20(土) 11:07:33
ターミナルがUTFを表示してくれるか次第じゃないの?
ホント犬廚ってレベル低いなwww
0962名無しさん@お腹いっぱい。2009/06/20(土) 11:31:45
debianのバグはdebianスレでやれと
0963名無しさん@お腹いっぱい。2009/06/20(土) 11:43:03
>>961
そういう問題じゃない。ちゃんと読み直せ。
0964名無しさん@お腹いっぱい。2009/06/20(土) 11:49:07
>>961のレベルの低さに呆れた
0965名無しさん@お腹いっぱい。2009/06/21(日) 11:15:50
未だに不良品使ってるデブ廚哀れ。

http://pc11.2ch.net/test/read.cgi/linux/1241948212/
【dashが】Debian GNU/Linux スレッド Ver.60【バグ持ち】
0966名無しさん@お腹いっぱい。2009/06/22(月) 03:13:53
変数中の %%:* と ##.* の意味を教えてください

# cat test.sh

TEST1=45:0:0:0
TEST2=aaa.bbb.ccc
echo "TEST1%%:* = ${TEST1%%:*}"
echo "TEST2##.* = ${TEST2##*.}"

# sh test.sh

TEST1%%:* = 45
TEST2##.* = ccc

どうしてこうなるのかが、わからないんです orz
キーワードが悪いのか、ググっても解決できない・・・
0967名無しさん@お腹いっぱい。2009/06/22(月) 05:31:15
>>966
$ man sh

${parameter%word}
Remove Smallest Suffix Pattern. The word is expanded to produce
a pattern. The parameter expansion then results in parameter,
with the smallest portion of the suffix matched by the pattern
deleted.

${parameter%%word}
Remove Largest Suffix Pattern. The word is expanded to produce a
pattern. The parameter expansion then results in parameter, with
the largest portion of the suffix matched by the pattern deleted.

${parameter#word}
Remove Smallest Prefix Pattern. The word is expanded to produce
a pattern. The parameter expansion then results in parameter,
with the smallest portion of the prefix matched by the pattern
deleted.

${parameter##word}
Remove Largest Prefix Pattern. The word is expanded to produce a
pattern. The parameter expansion then results in parameter, with
the largest portion of the prefix matched by the pattern deleted.

0968名無しさん@お腹いっぱい。2009/06/22(月) 05:49:40
>>967
ありがとう
自分の愚かさを理解しました
初心に戻ります・・・

ありがとう!
0969名無しさん@お腹いっぱい。2009/06/23(火) 00:07:39
バラメータにディレクトリ名を渡すbashをつくってるんですが、パラメータなしの場合は/tmpにしたいです

dir=${1=/tmp}

こんな感じでスマートに書けるかと思ったらできなかったんですがどうなんでしょう?
0970名無しさん@お腹いっぱい。2009/06/23(火) 00:37:18
ここはbash開発スレでは有りません。2chにはbash開発スレはないのでMLに行くと良いでしょう。
0971名無しさん@お腹いっぱい。2009/06/23(火) 06:40:26
>>969
dir=${1-/tmp}

ちなみに、bash以外の開発でも↑の書き方で桶。
0972名無しさん@お腹いっぱい。2009/06/23(火) 08:21:35
>>969
自分なら
dir=${1:-/tmp}
0973名無しさん@お腹いっぱい。2009/06/23(火) 08:28:19
>>972
それだと、

shellscript ''

みたいに空文字列を敢えて引数にした時まで、
/tmp に変換されてしまう。

敢えて空文字列指定はしたいので。
0974名無しさん@お腹いっぱい。2009/06/24(水) 01:58:04
>>971
>>972
そもそも書式間違ってたようですね
ありがとうございます!
0975名無しさん@お腹いっぱい。2009/06/29(月) 21:56:04
テキストの置換で質問があります。

hoge0:0 = "TRUE"
hoge0:1 = "TRUE"
hoge0:2 = "TRUE"
  ・
  ・
hoge0:9 = "TRUE"

上記の様な記述がされたテキストのhoge0:0以外の"TRUE"の
部分だけを"FALSE"へ置換したいのですが、sed等の置換で
置換可能でしょうか?
全ての"TRUE"を"FALSE"に変更するのであれば
簡単に出来ますが、「置換条件にあった複数行の数文字目以降だけを置換」
みたいな事って出来るんでしょうか?
0976名無しさん@お腹いっぱい。2009/06/29(月) 21:59:54
>>975

sed '/hoge0:0/!s/TRUE/FALSE/'
0977名無しさん@お腹いっぱい。2009/06/29(月) 23:01:28
>>976
ありがとうございます。
これで何とかなりそうです。
0978名無しさん@お腹いっぱい。2009/06/30(火) 03:41:23
たまにEnterを押しても^Mと出るだけでEnterが渡らなくなるんだけど
これって何?どうやったら直るの?
0979名無しさん@お腹いっぱい。2009/06/30(火) 04:26:51
http://pc12.2ch.net/test/read.cgi/unix/1025917502/
termcap について語るスレ
0980名無しさん@お腹いっぱい。2009/06/30(火) 07:37:47
むしろsttyじゃね?
0981名無しさん@お腹いっぱい。2009/06/30(火) 12:14:39
>>978
$ reset
0982名無しさん@お腹いっぱい。2009/06/30(火) 14:58:21
ttyは誰が制御してるのかと。
そろそろ産め。
0983名無しさん@お腹いっぱい。2009/07/01(水) 01:52:42
>>981
その一コマンドでbashが三日分死ぬ
0984名無しさん@お腹いっぱい。2009/07/01(水) 06:14:50
OSごと落ちるaliasが設定されてる罠。
0985名無しさん@お腹いっぱい。2009/07/01(水) 08:13:06
タンマツリセット
0986名無しさん@お腹いっぱい。2009/07/01(水) 09:58:32
次スレ
http://pc12.2ch.net/test/read.cgi/unix/1246408968/
0987名無しさん@お腹いっぱい。2009/07/01(水) 14:39:20
シャットダウンか。
0988名無しさん@お腹いっぱい。2009/07/01(水) 15:04:35
resetコマンドはBSD依存。
Solarisにはない。
レス数が950を超えています。1000を超えると書き込みができなくなります。