シェルスクリプト総合 その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 でトレースしましょう。
前スレ落ちたみたいなのでリンク省略。
0866名無しさん@お腹いっぱい。
2009/05/29(金) 17:34:230867名無しさん@お腹いっぱい。
2009/05/30(土) 04:43:290868名無しさん@お腹いっぱい。
2009/05/30(土) 11:09:28なってたほうがいいアプリには個別対応してる。
0869名無しさん@お腹いっぱい。
2009/05/30(土) 11:10:420870名無しさん@お腹いっぱい。
2009/05/31(日) 00:49:43もとの質問の「仕様」が不明確?どこが?
例として10個もデータ載せてて0-9とスペース(タブ?)しか使って無いんだから
1001 とかの考慮は必要だろうけど、A00B なんて何勝手に仕様追加してるの?
もしそういうのもあるなら質問者も10個のデータ内、1つ位はそんなデータを載せるだろうよ
汎用性を考えるのは重要だけど元々無い仕様を勝手に追加して、
それに対応する方法を自分で書くならまだしも、人が書いた事を否定するだけって、何の意味があるの?
0871名無しさん@お腹いっぱい。
2009/05/31(日) 09:08:48実際のデータが例示されたものだけならどちらでも動くが、仕様は二通り考えられる。
今回の質問はそれほど不明確では無かったが、不明確な質問しといて後から
条件追加するアフォが多すぎるので防衛反応だろう。
0872名無しさん@お腹いっぱい。
2009/06/01(月) 12:15:24例えば特定の環境変数を指定した引数の値にセットして
makeを呼び出せるようなことが出来るとありがたい
bash風なシェルだとすると、次のようなイメージ
alias mak pattern='SOME_ENV_VARIABLE=$(pattern) make'
あるいは、代替案があればご教示頂けると幸いです
0873名無しさん@お腹いっぱい。
2009/06/01(月) 12:54:540874名無しさん@お腹いっぱい。
2009/06/01(月) 12:56:060875名無しさん@お腹いっぱい。
2009/06/01(月) 13:04:19local x="$1";
shift;
HOGE="$x" make "$@"
}
0876名無しさん@お腹いっぱい。
2009/06/01(月) 13:20:29ありがとうございます。快適になりました。
0877名無しさん@お腹いっぱい。
2009/06/02(火) 02:01:37例えば、以下の様に実行した command の exit status を実行元のシェルで取得したいのです。
(sleep 3; command >/dev/null 2>&1) &
0878名無しさん@お腹いっぱい。
2009/06/02(火) 02:07:33>>1
> manや参考リンクを見ましょう。
0879名無しさん@お腹いっぱい。
2009/06/02(火) 06:38:35できないならできないって答えてやれよ
0880名無しさん@お腹いっぱい。
2009/06/02(火) 07:14:370881名無しさん@お腹いっぱい。
2009/06/02(火) 07:23:01シェル依存。
バックグラウンドコマンドがすでに終了していると、
wait %1 ではステータスが取れないシェルがある。
0882名無しさん@お腹いっぱい。
2009/06/02(火) 08:25:010883名無しさん@お腹いっぱい。
2009/06/02(火) 08:29:38いや、一般論としては「できない」が正解。
「できない」とすでに答えてる。
0884名無しさん@お腹いっぱい。
2009/06/02(火) 10:01:270885名無しさん@お腹いっぱい。
2009/06/03(水) 02:21:440886名無しさん@お腹いっぱい。
2009/06/03(水) 08:20:180887名無しさん@お腹いっぱい。
2009/06/03(水) 09:11:32(sleep 3; command >/dev/null 2>&1; echo $? > status) &
で保存できるだろ。
0888名無しさん@お腹いっぱい。
2009/06/03(水) 10:27:420889名無しさん@お腹いっぱい。
2009/06/03(水) 11:03:05そんなのを回避する方法は、お前以外の人間はいくらでも思いつく。
0890名無しさん@お腹いっぱい。
2009/06/03(水) 12:08:48>>877は、実行してしまったシェルスクリプトを後からどう
にかしたいらしいので、>>887みたいに、実行前にタイムマ
シンで戻ってシェルスクリプトを編集するのは不可じゃない
の?
>>887みたいに$?を使っていいなら、>>877はそもそも質問し
ていないと思うけど。
0891名無しさん@お腹いっぱい。
2009/06/03(水) 13:44:26質問を普通に読むことができれば、そういう考えには至らない。
0892名無しさん@お腹いっぱい。
2009/06/03(水) 13:57:420893名無しさん@お腹いっぱい。
2009/06/03(水) 14:05:09なんだ単なるネタか。余りにつまらないんでレスしちまったぜ。
これほど、つまらないネタを見るのは始めてだ。
0894名無しさん@お腹いっぱい。
2009/06/03(水) 14:35:20もしそういう問題ならシステムコールトレースでも仕掛けておけば
いいんじゃねーの?w
0895名無しさん@お腹いっぱい。
2009/06/03(水) 15:24:06echoの直前にセミコロンが抜けていますね。
ほかの方の回答は興味がないので無視させていただきました。
0896名無しさん@お腹いっぱい。
2009/06/03(水) 15:41:550897名無しさん@お腹いっぱい。
2009/06/03(水) 18:47:090898名無しさん@お腹いっぱい。
2009/06/03(水) 20:24:59>直前 >直前 >直前
0899名無しさん@お腹いっぱい。
2009/06/03(水) 22:11:340900名無しさん@お腹いっぱい。
2009/06/03(水) 22:17:08>>1
>正規表現の話題はスレ違い(正規表現スレへ)
0901名無しさん@お腹いっぱい。
2009/06/03(水) 22:21:06うす!
0902名無しさん@お腹いっぱい。
2009/06/04(木) 01:24:43なにそれ?
0903名無しさん@お腹いっぱい。
2009/06/06(土) 09:22:29solari8 Cシェル環境において以下のシェルスクリプトでテキストに含まれる[]が表示できなくて困っています。
echo `cat fileA`
fileAの中身は下記です。
1234[aa]
このまま表示したいのですが、実行すると「echo:一致しません」と表示されます。
fileAの中身を"1234[aa]"でも1234\[aa\]にしても変わりません。
echo文は変えられないので何とかfileAの中身を工夫して1234[aa]と表示できる方法をどなたかご教示いただけないでしょうか?
0904名無しさん@お腹いっぱい。
2009/06/06(土) 10:47:36そんな方法は無い。不可能。絶対に無理。
0905名無しさん@お腹いっぱい。
2009/06/06(土) 11:55:02はどうなの?
0906名無しさん@お腹いっぱい。
2009/06/06(土) 12:52:52>echo文は変えられないので
0907名無しさん@お腹いっぱい。
2009/06/06(土) 13:49:29シェルを変えろ。話はそれからだ。
0908名無しさん@お腹いっぱい。
2009/06/06(土) 14:02:490909名無しさん@お腹いっぱい。
2009/06/06(土) 14:04:46alias echo 'cat'
0910名無しさん@お腹いっぱい。
2009/06/06(土) 14:21:02マジレスするとechoより前に set noglob すればOK
ただし、そのスクリプト自体変更できないと言うなら不可能。
0911名無しさん@お腹いっぱい。
2009/06/06(土) 16:03:34皆様ありがとうございます。
スクリプト自体を変更できないのです。^^;
残念ながらあきらめるしかないのですね。
お手数ですが、不可能な理由をご教示願えないでしょうか?
0912名無しさん@お腹いっぱい。
2009/06/06(土) 16:04:050913名無しさん@お腹いっぱい。
2009/06/06(土) 18:53:000914名無しさん@お腹いっぱい。
2009/06/06(土) 23:31:540915名無しさん@お腹いっぱい。
2009/06/08(月) 22:21:18a
b
c
d
e
f
g
と表示する方法ありますか?
0916名無しさん@お腹いっぱい。
2009/06/08(月) 22:27:37>>850
0917名無しさん@お腹いっぱい。
2009/06/10(水) 02:11:490918名無しさん@お腹いっぱい。
2009/06/10(水) 14:51:510919名無しさん@お腹いっぱい。
2009/06/10(水) 15:08:27たとえechoが内部コマンドじゃなかったとして、
echoをcatにすり替えることができたとしても、
>>903 の
> echo `cat fileA`
は、
cat `cat fileA`
になるだけ。これでは何の解決にもなっていない。
0920名無しさん@お腹いっぱい。
2009/06/11(木) 00:03:40cat fileA
じゃなくて
echo `cat fileA`
としてるのか問い詰めたい
0921名無しさん@お腹いっぱい。
2009/06/11(木) 00:10:30echo `cat fileA`
は明らかに異なるが。どうして同一だと考えられるのだろう。
問い詰めたい。問い詰めたい。問い詰めたい。問い詰めたい。
0922名無しさん@お腹いっぱい。
2009/06/11(木) 00:58:46これってうちのtcsh 6.15.00だと再現しないんだけど純正csh限定なの?
0923名無しさん@お腹いっぱい。
2009/06/11(木) 09:57:4420070713-2となっているが元がどういうのかはよくわからない。
どういう仕組みでそうなるんだろうか。solarisのcshに独自の何かがある?
0924名無しさん@お腹いっぱい。
2009/06/11(木) 17:12:08>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そもそもシェルスクリプトにこだわる理由も無さそうだが。
0927名無しさん@お腹いっぱい。
2009/06/12(金) 16:41:03sed -e 's/$iどうたら/こうたら/' とか。
0928名無しさん@お腹いっぱい。
2009/06/12(金) 18:11:14恥ずかしいほど基本。
''は変数置換しない。""はする。
0929名無しさん@お腹いっぱい。
2009/06/16(火) 00:02:05なぜcshの話題はだめなのかを誘導しないと「どうしてcshの話題はだめなのですか?」ってのが繁殖するよ
0930名無しさん@お腹いっぱい。
2009/06/16(火) 04:23:380931名無しさん@お腹いっぱい。
2009/06/16(火) 09:07:560932名無しさん@お腹いっぱい。
2009/06/16(火) 10:01:060933名無しさん@お腹いっぱい。
2009/06/16(火) 18:05:060934名無しさん@お腹いっぱい。
2009/06/16(火) 18:16:090935名無しさん@お腹いっぱい。
2009/06/17(水) 02:41:250936名無しさん@お腹いっぱい。
2009/06/17(水) 11:50:490937名無しさん@お腹いっぱい。
2009/06/17(水) 11:54:43シェルスクリプト書くのに何を使うかは
まったく別の話。
0938名無しさん@お腹いっぱい。
2009/06/17(水) 11:56:050939名無しさん@お腹いっぱい。
2009/06/19(金) 01:33:310940名無しさん@お腹いっぱい。
2009/06/19(金) 02:33:32bashが肥大化しててワラタw
0941名無しさん@お腹いっぱい。
2009/06/19(金) 03:09:310942名無しさん@お腹いっぱい。
2009/06/19(金) 06:10:470943名無しさん@お腹いっぱい。
2009/06/19(金) 07:29:20リーナスはSystemV贔屓だが、GNUはあんまり良く思ってないだろう。
emacsとかGNOMEとかGPL3とか悪口言いまくりだし。
0944名無しさん@お腹いっぱい。
2009/06/19(金) 18:11:24Debian信者の俺が言うのもなんだけど
0945名無しさん@お腹いっぱい。
2009/06/19(金) 18:15:54バグについて詳しく
0946名無しさん@お腹いっぱい。
2009/06/19(金) 18:20:080947名無しさん@お腹いっぱい。
2009/06/19(金) 18:33:14それを抜きにしても ja_JP.eucJP で使うのが基本。
UTF-8は問題が多い。
0948名無しさん@お腹いっぱい。
2009/06/19(金) 19:00:530949名無しさん@お腹いっぱい。
2009/06/19(金) 20:38:55えっと、LANG=C ならもろバグります。(解決になりません)
LANG=ja_JP.eucJPの時はバグらないと。(ただしファイル名もEUC-JPで作られる)
0950名無しさん@お腹いっぱい。
2009/06/19(金) 20:39:540951名無しさん@お腹いっぱい。
2009/06/19(金) 21:44:10http://znz.s1.xrea.com/t/?date=20090608
0952名無しさん@お腹いっぱい。
2009/06/19(金) 21:48:470953名無しさん@お腹いっぱい。
2009/06/19(金) 22:07:02http://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あいうえお
はて?
0956名無しさん@お腹いっぱい。
2009/06/19(金) 22:45:36ja_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:42ja_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あ
無問題、てかおまいの書き込みはbackslashじゃなくてyenになってんぞ?
0959名無しさん@お腹いっぱい。
2009/06/19(金) 23:46:220960名無しさん@お腹いっぱい。
2009/06/20(土) 00:07:120961名無しさん@お腹いっぱい。
2009/06/20(土) 11:07:33ホント犬廚ってレベル低いなwww
0962名無しさん@お腹いっぱい。
2009/06/20(土) 11:31:450963名無しさん@お腹いっぱい。
2009/06/20(土) 11:43:03そういう問題じゃない。ちゃんと読み直せ。
0964名無しさん@お腹いっぱい。
2009/06/20(土) 11:49:070965名無しさん@お腹いっぱい。
2009/06/21(日) 11:15:50http://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
キーワードが悪いのか、ググっても解決できない・・・
レス数が950を超えています。1000を超えると書き込みができなくなります。