シェルスクリプト総合 その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/
0458名無しさん@お腹いっぱい。
2008/12/04(木) 13:03:26あと最近は、OSXのやつらの台頭でスペース文字含みのファイルとか
余裕で出てくるようになったからその辺を気にしないといけなくなった
0459名無しさん@お腹いっぱい。
2008/12/04(木) 13:18:18regewxを定義するところが不恰好になるだけじゃ…
>>455
きにすんな
0460名無しさん@お腹いっぱい。
2008/12/04(木) 13:28:40bar/' | sed -e 's/ //g'`
二行目はhtab使ってるから注意しな。
0461名無しさん@お腹いっぱい。
2008/12/04(木) 13:39:41マニュアルを読まないと推定できないような言語じゃなくて。
0462名無しさん@お腹いっぱい。
2008/12/04(木) 13:47:47だから、インデントのいらない階層であるところの「シェル関数外」で
regexに代入するんだろ。
もともとインデントゼロのスコープに書くんだから、
不恰好にならない。
頭使え。
0463名無しさん@お腹いっぱい。
2008/12/04(木) 14:01:24N='
'
hoge() {
sed "s/hoge/foo ${N}bar/"
}
>>456
気にしろw
0464名無しさん@お腹いっぱい。
2008/12/04(木) 14:06:14なぜかこの環境から書き込むとバックスラッシュが化けるので、、
ダブルクォートの中だからバックスラッシュは2つね。
0465名無しさん@お腹いっぱい。
2008/12/04(木) 23:01:38ってほどでもないかw
0466名無しさん@お腹いっぱい。
2008/12/06(土) 10:43:43気にすんな
0467名無しさん@お腹いっぱい。
2008/12/06(土) 11:20:20>マニュアルを読まないと推定できないような言語じゃなくて。
シェルスクリプトすら書けないんなら、この業界から足をあらってカタギになれ!
0468名無しさん@お腹いっぱい。
2008/12/06(土) 11:29:540469名無しさん@お腹いっぱい。
2008/12/06(土) 11:43:31マニュアルを読んでも推定しかできないんなら、カタギになれ!
0470名無しさん@お腹いっぱい。
2008/12/06(土) 12:07:180471名無しさん@お腹いっぱい。
2008/12/06(土) 13:06:54何言ってんだおまえ
0472名無しさん@お腹いっぱい。
2008/12/06(土) 21:49:180473名無しさん@お腹いっぱい。
2008/12/06(土) 22:13:05FOUND=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:370475名無しさん@お腹いっぱい。
2008/12/07(日) 00:28:050476名無しさん@お腹いっぱい。
2008/12/07(日) 00:37:510477名無しさん@お腹いっぱい。
2008/12/07(日) 01:58:210478名無しさん@お腹いっぱい。
2008/12/07(日) 03:53:340479名無しさん@お腹いっぱい。
2008/12/07(日) 15:29:090480名無しさん@お腹いっぱい。
2008/12/07(日) 17:40:520481名無しさん@お腹いっぱい。
2008/12/07(日) 19:13:550482名無しさん@お腹いっぱい。
2008/12/07(日) 20:46:490483名無しさん@お腹いっぱい。
2008/12/07(日) 20:50:130484名無しさん@お腹いっぱい。
2008/12/08(月) 03:56:00もう質問者いなそうだけどOSによっては改行として"^J"を使う手も
vi だと挿入モードの時、ctrl + v してから ctrl + j で入力
sed 's/hoge/foo \
bar/'
を
sed 's/hoge/foo ^Jbar/'
OSを選ぶので汎用性もないしオプションなしのcatやmoreだと"^J"の部分が
改行になるかもと色々問題ありまくりだけど場合によってはこんな方法もってことで
あと"^J"使える場合はヒアドキュメントも cat - <<END^JOK^JEND と1行で書ける
意味あるかどうか人それぞれだろうけど
0485名無しさん@お腹いっぱい。
2008/12/08(月) 11:22:53改行扱えないsedは存在しないんじゃないかな。
0486名無しさん@お腹いっぱい。
2008/12/08(月) 11:45:11そういう問題じゃないんだよ。
もとの質問の >>455 よくよめ
UNIX環境では ^J は改行そのものなので、
>>484 の方法では全く解決にならない。
0487名無しさん@お腹いっぱい。
2008/12/08(月) 12:06:41ぶっちゃけPerl使えばいいんじゃね?
0488名無しさん@お腹いっぱい。
2008/12/08(月) 21:51:54だからちゃんと見てやれよw
0489487
2008/12/08(月) 22:49:22あ、ごめん、俺のは横レスだから>>485あたりの人とは別人
>>455見る限りでは、GNUではないsedだから置換文字列に\nが
使えなくてああいう書き方をしてて、それがいやだってんでしょ?
そう読めたけど
0490名無しさん@お腹いっぱい。
2008/12/08(月) 22:53:55俺には^Jをどう表示するかというエディタの問題に思えるが…
>>456>>459>>466>>487
禿同
0491名無しさん@お腹いっぱい。
2008/12/09(火) 04:04:02分かる方が居たらお願いします。
http://pc11.2ch.net/test/read.cgi/linux/1210999497/611
0492名無しさん@お腹いっぱい。
2008/12/09(火) 10:23:370493名無しさん@お腹いっぱい。
2008/12/09(火) 10:29:170494名無しさん@お腹いっぱい。
2008/12/10(水) 22:03:11if [ 変数 != 文字列A ] | [ 変数 != 文字列B ];then
ERROR処理
fi
ネスト無しでやる場合これって有りかな?
数値じゃないから-oは使えないんでこれしかやりようがなかったんすけど
有識者の方頼みます
0495名無しさん@お腹いっぱい。
2008/12/10(水) 22:08:05| じゃなくて || な。
↓
if [ 変数 != 文字列A ] || [ 変数 != 文字列B ]; then
あと、数式じゃなくても -o 使えるよ。
↓
if [ 変数 != 文字列A -o 変数 != 文字列B ]; then
-o が使えないのは [[ ]] の場合。その場合は、
↓
if [[ 変数 != 文字列A || 変数 != 文字列B ]]; then
0496名無しさん@お腹いっぱい。
2008/12/10(水) 22:12:30意味的には、やりたいことは -o (||) じゃなくて、-a (&&) のような気がする。
0497名無しさん@お腹いっぱい。
2008/12/10(水) 22:14:20この場合、if [ ] よりも case を使った方が簡単に書けるよ。
0498名無しさん@お腹いっぱい。
2008/12/10(水) 22:17:11実は|でいけたんっすよ
テストケース作って試したんですけど、一応正常系も異常系も通りました。。。
-oについては明日また試してみます
ありがとうございます
0499名無しさん@お腹いっぱい。
2008/12/10(水) 22:20:22ミドルのステータスチェックを増やしたんすよ
元が共通シェルだから余り大幅な変更は出来ないんです
caseの方が良いのはその通りなんですが・・
0500名無しさん@お腹いっぱい。
2008/12/10(水) 22:21:10行けたように勘違いしただけで正常に変数チェックされていない。
| は パイプ。パイプでは、A | B の場合、Bが真か偽かしかチェックされない。
(Aは無関係になる)
具体的には、
if [ 変数 != 文字列A ] | [ 変数 != 文字列B ];then
だと、
[ 変数 != 文字列B ] だけがチェックされて、
[ 変数 != 文字列A ] の結果は無視される。
それをたまたま「行けた」と勘違いしただけ。
全然行けてないので勘違いしないように。
0501名無しさん@お腹いっぱい。
2008/12/10(水) 22:25:43確かに文字列Bの追加したステータスチェックは通ったけど、文字列Aは怪しいですね。
了解しました
参考にさせていただきます。
>>495
>>496
>>497
>>500
有難うございました。
0502名無しさん@お腹いっぱい。
2008/12/10(水) 23:16:010503名無しさん@お腹いっぱい。
2008/12/11(木) 01:28:58下の1から3に画面を変えるときは
clearして全部表示しなおすしかないですかね?
表示しなおしたい部分だけ変えるってできないのかな?
1.
□■□
□□□
□□□
2.
□□□
□■□
□□□
3.
□□□
□□□
□■□
0504名無しさん@お腹いっぱい。
2008/12/11(木) 01:57:32エスケープシーケンス出力してカーソル動かせばいい。
zshならcursesモジュールがあるから端末独立なスクリプトも書けるだろうけど。
0505名無しさん@お腹いっぱい。
2008/12/11(木) 08:43:50tput使え。
例えばtput cuu1がカーソルを一行上げる。
tput homeで左上へ移動。
0506名無しさん@お腹いっぱい。
2008/12/11(木) 21:06:49シェルでは無理。
強いてやるなら、echo;echo;echo;echo;.... で画面を全部流してから、
新しい画面の文字を全部 echoし直すしかないかな。
0507名無しさん@お腹いっぱい。
2008/12/11(木) 21:19:520508名無しさん@お腹いっぱい。
2008/12/11(木) 21:25:150509名無しさん@お腹いっぱい。
2008/12/11(木) 21:27:42FreeBSDならcm。
0510名無しさん@お腹いっぱい。
2008/12/11(木) 23:25:310511名無しさん@お腹いっぱい。
2008/12/11(木) 23:37:36tputって OS間の互換性ないんだな。
0512名無しさん@お腹いっぱい。
2008/12/15(月) 22:27:41HP-UX11iv2orv3でファイルをある一定の法則に従う複数のディレクトリにコピーするコマンドについて
お知恵をお貸しください。
たとえば、下記のようなディレクトリに同一のファイルを配置したいのですが
論理ホスト名が異なるサーバでも同じコマンドで実行できるようできませんか。
/etc/opt/論理ホスト名1/sh/
/etc/opt/論理ホスト名2/sh/
/etc/opt/論理ホスト名3/sh/
RHELの場合、下記コマンドで実行できたのですが
HP-UXでは、{}を単独で使わないと、検索したパスに置き換えてくれないようです。
(下記記述だと{}を{}そのもので認識されてしまいました。)
find /etc/opt/ -type d -path */sh -exec cp 配布元ファイル {}/配布先ファイル \;
配布元ファイル名と配布先ファイル名は、異なる場合でも対応できるようにしたいです。
よろしくお願いします。
0513名無しさん@お腹いっぱい。
2008/12/15(月) 22:31:32for dir in /etc/opt/*/sh
do
cp 配布元ファイル $dir/配布先ファイル
done
0515名無しさん@お腹いっぱい。
2008/12/21(日) 16:32:11http://ash.jp/ash/src/csh/tree.txt
どうせならファイルの詳細情報も表示させたいと思っています。
今のままだと以下の表示なのですが、
+---bin/
+---boot/
| +---efi/
| | +---EFI/
以下のように表示させたい。どうすればよいですか?
+---bin/ drwxr-xr-x 2 root root 4096 2008-12-21 16:11
+---boot/ drwxr-xr-x 5 root root 1024 2008-10-26 05:21
| +---efi/ drwxr-xr-x 13 root root 4200 2008-12-21 16:03
| | +---EFI/ drwxr-xr-x 115 root root 12288 2008-12-21 16:11
0516名無しさん@お腹いっぱい。
2008/12/21(日) 17:03:18「以下のawkで代用しているのですが」みたいに書くのか?
0517名無しさん@お腹いっぱい。
2008/12/21(日) 17:20:45すみませんが、質問だけに答えてください。
0518名無しさん@お腹いっぱい。
2008/12/21(日) 17:31:31\/┏┷┓\/
。┃お┃。
゙ # ゚┃断┃; 。
; 。 ・┃り.┃・ #
。 ;゙ #┃し.┃# 。
゙・# : ┃ま┃。 ; 。
.;:# ゙。゚┃す┃゚ 。 #
; 。;; ゙.:。┗┯┛。 # : #
. ハ,,ハ |
. ( ゚ω゚ ) |
:/ つΦ
0519名無しさん@お腹いっぱい。
2008/12/21(日) 21:35:57シェルで代用とはどういう事ですか?
0520名無しさん@お腹いっぱい。
2008/12/21(日) 22:53:31シェルで代用もご存知ない方には聞いていません。
ハイ、次のもっと優秀な回答者
↓
0521名無しさん@お腹いっぱい。
2008/12/21(日) 23:17:51Emacsスレか?
0522名無しさん@お腹いっぱい。
2008/12/22(月) 01:26:400523名無しさん@お腹いっぱい。
2008/12/22(月) 10:13:410524名無しさん@お腹いっぱい。
2008/12/22(月) 10:23:110525名無しさん@お腹いっぱい。
2008/12/22(月) 15:25:41不便なのでシェルを作ろうと思うのですが、
具体的にはどう作ればいいですか?
0526名無しさん@お腹いっぱい。
2008/12/22(月) 15:32:500527名無しさん@お腹いっぱい。
2008/12/24(水) 22:22:39うまいこといきますか
ちなみにディレクトリ名は日本語だったりスペースありだったり()あったりです。
0528名無しさん@お腹いっぱい。
2008/12/24(水) 22:38:09改行がないなら、findして、/の個数を数えて、最大値でも出せばどうかね?
0529名無しさん@お腹いっぱい。
2008/12/24(水) 22:57:34find ./ -type d だと再帰的になってしまうので
ls -l | egrep '^d' | awk ' { print $8 } '
みたいにしたら、スペース込みのディレクトリ名の場合8カラム目以降消えてしまうし
0530名無しさん@お腹いっぱい。
2008/12/24(水) 23:00:070531名無しさん@お腹いっぱい。
2008/12/24(水) 23:18:57ちっと出直してきます
0532名無しさん@お腹いっぱい。
2008/12/25(木) 06:51:30(-depthはあっても-maxdepthがないfindは存在する)
0533名無しさん@お腹いっぱい。
2008/12/25(木) 07:54:35-depth 1 -type d で要求は満たす。
-maxdepth 1 を指定すれば効率はよくなるだろうけど、
ないと無理という根拠が不明。
0534名無しさん@お腹いっぱい。
2008/12/25(木) 07:56:58おいおい、何か勘違いしてないか?
-depth に引数は付かない。
全く要求を満たさない。
試してから書けよな。
0535名無しさん@お腹いっぱい。
2008/12/25(木) 08:02:07一般のfindの-depthじゃ、>>534 の言う通り、無理なんだよ。(例:Solaris)
0536名無しさん@お腹いっぱい。
2008/12/25(木) 08:13:340537名無しさん@お腹いっぱい。
2008/12/25(木) 08:49:500538名無しさん@お腹いっぱい。
2008/12/25(木) 12:01:090539名無しさん@お腹いっぱい。
2008/12/25(木) 13:53:10はいって何?
出来るの?
さっきから何度も。
はいって言葉の重みわかってる?
いま出来ますって断言したんだよ君。
その責任の重さわかってんの?
社会に出たらもっと自分の言葉に責任持てよ。
ん?
社会人の一言一言に掛かる責任の重さが分かってないだろ全然。
学生気分でやってんだったら帰ってもらうよ。
とにかく明日はもう来なくていいから。
0540名無しさん@お腹いっぱい。
2008/12/25(木) 16:31:480541名無しさん@お腹いっぱい。
2008/12/25(木) 22:30:580542名無しさん@お腹いっぱい。
2008/12/25(木) 22:31:230543名無しさん@お腹いっぱい。
2008/12/25(木) 22:34:56.で始まったりすると面倒じゃね
0544名無しさん@お腹いっぱい。
2008/12/25(木) 22:50:31標準bourne shellにこだわらなければ、
.で始まるファイルをファイル展開に含める方法があるシェルが最近は多い。
0545名無しさん@お腹いっぱい。
2008/12/25(木) 22:59:070546名無しさん@お腹いっぱい。
2008/12/25(木) 23:06:48..aaが含まれない。
.* *で.と..を省いた方がまだいい。
0547名無しさん@お腹いっぱい。
2008/12/26(金) 06:44:520548名無しさん@お腹いっぱい。
2008/12/26(金) 22:53:28find hogedir -type f | wc -l
とかしか無いの?
かっこいいのないのかね
0549名無しさん@お腹いっぱい。
2008/12/26(金) 23:10:570550名無しさん@お腹いっぱい。
2008/12/27(土) 03:40:29hogedir 以下にディレクトリがあっても空とみなすの?
0551名無しさん@お腹いっぱい。
2008/12/27(土) 04:20:31$ cat a.dat
111
AAA
BBB
CCC
222
$ cat b.dat
AAA
BBB
CCC
$ cat c.dat
DDD
EEE
FFF
で、以下のように実行(hogeコマンドはあくまでイメージです)すると、
-------------------------
$ hoge -t a.dat -s b.dat -d c.dat
111
DDD
EEE
FFF
222
-------------------------
上のようになるコマンドはありますでしょうか?
そのようなコマンドがない場合、みなさんだったらどのようにこの置換えを行いますか?
0552名無しさん@お腹いっぱい。
2008/12/27(土) 09:37:21-sにあるものを
対応する-dの行で置き換えるってこと?
$ cat b.dat
BBB
AAA
なら、
111
EEE
DDD
CCC
222
ってこと?
0553名無しさん@お腹いっぱい。
2008/12/27(土) 10:20:010554名無しさん@お腹いっぱい。
2008/12/27(土) 12:05:09case `ls -A hogedir` in '') 空の場合の処理;; esac
の方が、wcがいらない分まし。
0555名無しさん@お腹いっぱい。
2008/12/27(土) 14:40:01違います。すいません説明がたりませんでした。
ある領域に一致するものを、別の領域に置き換えるという意味です。
>>552の場合は、一致しないので置き換えないようになります。
0556名無しさん@お腹いっぱい。
2008/12/27(土) 14:41:290557名無しさん@お腹いっぱい。
2008/12/27(土) 16:36:16b.datの内容(3行全部)に完全に一致する部分を、
c.datの内容で置き換えるってことか。
■ このスレッドは過去ログ倉庫に格納されています