シェルスクリプト総合 その7
レス数が1000を超えています。これ以上書き込みはできません。
0001ミスターシェル
2006/09/07(木) 13:00:11スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。
0904名無しさん@お腹いっぱい。
2007/02/08(木) 20:07:161. > test.txt
2. sudo -u hoge echo "hoge"
の順で処理されるからね。
sudo -u hoge sh -c 'echo "hoge" > test.txt'
0905902
2007/02/08(木) 20:09:21レスありがとうございます、
上の内容をためしたところ、存在しない、といったエラーが出てしまいました。
お助けを〜〜
sh: test.txt: No such file or directory
0906902
2007/02/09(金) 01:44:34再度試してみたらいけました。
ありがとうございました。
教えていただいた内容も納得です!
ちょっと関連した内容になるのですが、
"hoge"の部分に改行などを含んだ変数を入れたいのですが、
うまくいきません。
どうやら改行ごとに、シェルが実行されてしまっている?ようです。
複数行にわたった変数を使用したい場合、
どのように記述すればよいでしょうか?
何度もすいません orz
0907名無しさん@お腹いっぱい。
2007/02/09(金) 06:43:270908名無しさん@お腹いっぱい。
2007/02/09(金) 10:17:57継続行を入力させてくれるかも。
0909名無しさん@お腹いっぱい。
2007/02/09(金) 11:38:06何もする必要ない。"hoge" の途中に改行があっても改行はそのまま保存される。
もし、そうならないなら、sudoを実行しているコマンドラインのシェルが、
普通のB-sh系のシェルじゃないんだろう。
(あるいは、sudo先のユーザーのログインシェルが B-sh系じゃないとか)
sh bash zsh ksh 等の B-sh系を使うこと。
0910902
2007/02/09(金) 15:59:08レスありがとうございます。
ある変数の内容をファイルに書き込みたい、
という場合、echo とリダイレクトを使う以外にありますでしょうか?
0911名無しさん@お腹いっぱい。
2007/02/09(金) 16:04:07echo "$変数" | sudo -u hoge sh -c 'cat > test.txt'
sudo先のshでechoすると、クォートが2重になってややこしいから、
sudo前にechoしておいてパイプでつなぐ。
0912902
2007/02/09(金) 16:30:53orz ありがとうございます、うまくいきました。
クオートが入れ子になってて鬱入ってました。
発想の転換ですね、さすがみなさん視点がすごいです!!
本当にありがとうございました!!!
0913名無しさん@お腹いっぱい。
2007/02/11(日) 17:22:09「ls -l」形式のファイル一覧が入っているテキストファイル(引数)
を1行ずつ読み込み、ファイル名に「.bak」が含まれるファイルを
消去するシェルスクリプトを作成したいのですが、頭の「#!/bin/sh」
を書いた時点で力尽きました。
「while read」を使う、というところまでは理解出来たのですが、
文法等がさっぱりで…どなたかご教授願えないでしょうか?
0914名無しさん@お腹いっぱい。
2007/02/11(日) 17:33:05read 使うと逆に難しそう。
grep .bak したのを sed か awk かなんかで加工して rm、がいいと思う。
> 「ls -l」形式のファイル一覧が入っているテキストファイル(引数)
この前提は変えられない?
ls -l 形式は扱いづらそうだから
find とか使った方がいいと思うんだが。
0915名無しさん@お腹いっぱい。
2007/02/11(日) 17:37:27超簡単。1行で書ける。
while read line; do case $line in *.bak);; *) echo "$line";; esac; done < file
>>914
おまえには難しかったようだね。
0916名無しさん@お腹いっぱい。
2007/02/11(日) 17:48:12それって >>913 の要求満たしてるの?
0917名無しさん@お腹いっぱい。
2007/02/11(日) 17:50:39「ls -l出力が書かれたファイルの中から、ファイル名 *.bakのファイルを消去する」 のか?
0918名無しさん@お腹いっぱい。
2007/02/11(日) 17:53:13わかりにくい質問でどうも済みませんでした。
前者の意味です。>>915 でできました。Thanksです。
0919名無しさん@お腹いっぱい。
2007/02/11(日) 17:54:48なら grep -v '\.bak$' でいいじゃん。
シンボリックリンクに対応してないけど。
0920913
2007/02/11(日) 18:02:01申し訳ありません。説明不足でした。
「ls -l出力が書かれたファイルの中から、ファイル名 *.bakのファイルを消去する」
が目的です。
ファイルリストをgrepして*.bakを含む行だけ取り出した後、awkを使用してls -lの
リストからファイル名を抜き出して…とか色々と考えていたのですが、それらを
シェルスクリプトで作成するだけの知識とか度胸とかが足りなくて困っております。
>915
回答ありがとうございます。「esacって何?」とか調べていたら返事が遅れて
しまいました。
0921名無しさん@お腹いっぱい。
2007/02/11(日) 18:03:460922名無しさん@お腹いっぱい。
2007/02/11(日) 18:04:520923名無しさん@お腹いっぱい。
2007/02/11(日) 18:06:10だったら、↓で行ける。(ls -l であって、ls -lR ではないんだから)
while read perm link usr grp size mon day year file other
do
case $file in
*.bak) rm "$file";;
esac
done < ls-l-file.txt
0924名無しさん@お腹いっぱい。
2007/02/11(日) 19:34:210925名無しさん@お腹いっぱい。
2007/02/11(日) 19:50:26cat file |sed -e
0926913
2007/02/11(日) 19:56:38回答ありがとうございます。色々いじくり回して実験してみます。
0927名無しさん@お腹いっぱい。
2007/02/11(日) 23:23:51アバウトに日付情報だけで判断できれば十分なので
find file -printf "%Ad" でやろうと思ったのですが
月をまたぐとどうにもこうにもいきません。
0928名無しさん@お腹いっぱい。
2007/02/11(日) 23:39:08OSによってはdateとかを駆使してもできるとは思うが、perlが適材適所
0929名無しさん@お腹いっぱい。
2007/02/11(日) 23:41:54とやって、
ファイルXXX をディレクトリAAA にコピー(cp) して
なおかつ、AAA に移動(cd) する
というコマンドを作りたいんだけど、どうすればいい?
0930名無しさん@お腹いっぱい。
2007/02/11(日) 23:48:390931名無しさん@お腹いっぱい。
2007/02/12(月) 00:14:22.bashrc あたりにこんな感じの function を書くのがお手軽かな
hoge(){
cp "$1" "$2"
builtin cd "$2"
}
引数のチェックとかの拡張はお好みで。
0932名無しさん@お腹いっぱい。
2007/02/12(月) 00:27:490933名無しさん@お腹いっぱい。
2007/02/12(月) 01:36:070934名無しさん@お腹いっぱい。
2007/02/12(月) 02:10:570935名無しさん@お腹いっぱい。
2007/02/12(月) 11:09:31>>934
そうだったのかー
0936名無しさん@お腹いっぱい。
2007/02/12(月) 11:46:560937名無しさん@お腹いっぱい。
2007/02/12(月) 12:00:010938名無しさん@お腹いっぱい。
2007/02/12(月) 12:33:37bashだろ、どうせ。
0939929
2007/02/12(月) 22:02:42tcsh です
0940名無しさん@お腹いっぱい。
2007/02/13(火) 00:32:06cshスクリプトを書いておいて、
それをsourceするaliasを設定するとか。
もっとスマートな方法、教えてエロい人。
0941名無しさん@お腹いっぱい。
2007/02/13(火) 03:40:49シンボリックリンクをgawkから変更しようかしら。
最近のgawkはインターネットアクセスが出来るらしいけど使いかたが分からない。
0942名無しさん@お腹いっぱい。
2007/02/13(火) 06:38:22日本語が「通る」の意味がよくわからないが、
.がちゃんと一文字に適合したり
文字クラスとして[あ-ん]のようなものが書けたり
\u3120のようにユニコードリテラルを記述できたりするの?
0943名無しさん@お腹いっぱい。
2007/02/13(火) 07:18:58そのへんは検証してもらえないかなと思いまして。w
とりあえず.は駄目でした。w
[あ-ん]はたぶん大丈夫そうな気が。
4行目の機能ってgawkにあるんですか?
0944名無しさん@お腹いっぱい。
2007/02/13(火) 07:45:46いや別にgawkは関係ない。
せっかくUnicodeに対応しているなら、出来たほうが便利なのは
確実だが。
"Tibetan"とか"Greek"とか"CJKCompatibility"みたいに、
Unicodeのブロック/カテゴリ名が使えるとさらによい。
逆にその辺が出来ないなら、今時のUnicode対応としては
大したこと無いレベルじゃまいか?
まー今更awkにそんなに多くを求めてもしゃーない気はするが。
0945名無しさん@お腹いっぱい。
2007/02/13(火) 07:48:10単に8bitクリーンなだけじゃないの?
0946名無しさん@お腹いっぱい。
2007/02/13(火) 08:25:37...(.が3回)で一文字に適合しました。w
0947名無しさん@お腹いっぱい。
2007/02/13(火) 14:47:36for f in $dir;do
echo "$f"
done
とすると
aaa
bbb
と表示されますが、この dir に空白を含む文字列を含ませるにはどうすればいいのでしょうか?
イメージとしては
dir='aaa bbb "ccc ddd"' とすると
aaa
bbb
ccc ddd
と表示できたらいいなと
0948名無しさん@お腹いっぱい。
2007/02/13(火) 18:30:35できないはず
だからperlにしろと
0949名無しさん@お腹いっぱい。
2007/02/13(火) 19:00:25そういう場合は位置パラメータを使う。
set aaa bbb 'ccc ddd'
for f in "$@"; do
echo "$f"
done
これで、
aaa
bbb
ccc ddd
と表示される。
0950名無しさん@お腹いっぱい。
2007/02/13(火) 20:24:330951929
2007/02/13(火) 21:04:24alias 使えばいいというのはわかるんですが、
そのcsh スクリプトがかけないんです
0952名無しさん@お腹いっぱい。
2007/02/13(火) 21:06:59cshの話は厳禁。よそ行け。
b-shでの答えはすでに出てる。
0953名無しさん@お腹いっぱい。
2007/02/13(火) 21:38:370954名無しさん@お腹いっぱい。
2007/02/13(火) 21:38:560955名無しさん@お腹いっぱい。
2007/02/13(火) 21:43:140956名無しさん@お腹いっぱい。
2007/02/13(火) 22:58:21$HOME/tmp/cpcd.shとかを作って中身を
#!/bin/tcsh
cp "$1" "$2"
cd "$2"
として、
chmod +x $HOME/tmp/cpcd.sh
alias cpcd "source $HOME/tmp/cpcd.sh"
0957名無しさん@お腹いっぱい。
2007/02/13(火) 23:25:57sh-bangも+xもいらないんじゃないか?
0958名無しさん@お腹いっぱい。
2007/02/14(水) 01:24:40対処法を伝授して下さい
mv abc.txt %Y%m%dd.txt
0959名無しさん@お腹いっぱい。
2007/02/14(水) 01:44:50>4行目の機能ってgawkにあるんですか?
ない。
gawkは内部的にwchar_tを使っているだけで、スクリプトの記述は
そのときの locale設定が使われ、表にはUnicode(やwchar_t)はでてこない。
一応 [あ-お]はできるけどね。
0960名無しさん@お腹いっぱい。
2007/02/14(水) 01:48:59mv abc.txt `date +%%Y%m%d`d.txt
0961名無しさん@お腹いっぱい。
2007/02/14(水) 01:50:000963名無しさん@お腹いっぱい。
2007/02/14(水) 03:16:180965名無しさん@お腹いっぱい。
2007/02/14(水) 08:07:50の上のほうにあるスクリプトのtrapって何を拾っているんでしょうか?
0 は分かるんですが、1, 2, 3, 15が分かりません。
0966名無しさん@お腹いっぱい。
2007/02/14(水) 09:19:02man 7 signal参照。
1:SIGHUP 2:SIGINT 3:SIGQUIT 15:SIGTERM
0967名無しさん@お腹いっぱい。
2007/02/14(水) 10:12:04$ man 7 signal
No entry for signal in section 7 of the manual
ここはLinux板じゃない。
0968名無しさん@お腹いっぱい。
2007/02/14(水) 13:32:310969名無しさん@お腹いっぱい。
2007/02/14(水) 13:33:040970名無しさん@お腹いっぱい。
2007/02/14(水) 13:54:30man -a signalと言っておけばよかったね。
BSD(つーかMacだが)だとセクション3のライブラリ関数のとこに
一緒に載ってるようだな。
0971名無しさん@お腹いっぱい。
2007/02/14(水) 15:13:050972名無しさん@お腹いっぱい。
2007/02/14(水) 22:52:510973名無しさん@お腹いっぱい。
2007/02/14(水) 23:01:02ls -FA | grep /
ちょっと意味が違うか?
0974名無しさん@お腹いっぱい。
2007/02/14(水) 23:13:07俺は
ls -l | grep 4096
でなんとかなっている
0975名無しさん@お腹いっぱい。
2007/02/14(水) 23:15:18ls -l | grep ^d
どちらかといえばこれか。
0976名無しさん@お腹いっぱい。
2007/02/14(水) 23:16:200977名無しさん@お腹いっぱい。
2007/02/14(水) 23:26:49大文字も小文字も区別なく表示させたいのですが、可能ですか?
ls *.dat
に何か工夫して、aaa.dat とbbb.DAT などを表示させたいです。
0978名無しさん@お腹いっぱい。
2007/02/14(水) 23:36:164096って!
Bite じゃなくて bit 単位ですか?
家だと、 grep 512 で、例外を除き期待どおりの結果になるが・・
0979名無しさん@お腹いっぱい。
2007/02/14(水) 23:44:26ls | grep -i
0980名無しさん@お腹いっぱい。
2007/02/14(水) 23:46:190981名無しさん@お腹いっぱい。
2007/02/14(水) 23:47:390982名無しさん@お腹いっぱい。
2007/02/14(水) 23:50:41それだと、質問子の例示した拡張子にしか一致しないよ。
>>大文字も小文字も区別なく表示させたいのですが、可能ですか?
というテーゼには合致しない。
0983977
2007/02/14(水) 23:51:14ありがとうございます
そっか、grep を使うという技があったか!
0984972
2007/02/14(水) 23:56:08-l オプションを使わずにおながいします、
余計な出力が多いので・・・。orz
0985名無しさん@お腹いっぱい。
2007/02/14(水) 23:59:23find . -depth 1 -type d
ってどのぐらいの範囲でつかえるんだろう?
0986名無しさん@お腹いっぱい。
2007/02/15(木) 00:00:52ならば
>>973 で、問題無かろう?
0987名無しさん@お腹いっぱい。
2007/02/15(木) 00:02:30なるほど
0988名無しさん@お腹いっぱい。
2007/02/15(木) 00:03:540989名無しさん@お腹いっぱい。
2007/02/15(木) 00:08:32http://www.jp.freebsd.org/man-jp/search.html
ここでアレとか
0990名無しさん@お腹いっぱい。
2007/02/15(木) 00:10:06http://www.linux.or.jp/JM/html/tcsh/man1/tcsh.1.html
0992名無しさん@お腹いっぱい。
2007/02/15(木) 00:39:29早速のおひかえ、ありあとうござんす
0993名無しさん@お腹いっぱい。
2007/02/15(木) 00:44:56ここは
シェルが参照するエイリアスがいくつ
って文章で終わってるね。ちょんぎれているのではないであろうかと愚考するものでありますが…
0994名無しさん@お腹いっぱい。
2007/02/15(木) 00:55:10エイリアス置換
の章だな
しょぼいブラウザをつかっているのかな?
そこはページ全体の1/5ぐらいの場所
0995名無しさん@お腹いっぱい。
2007/02/15(木) 01:05:260996名無しさん@お腹いっぱい。
2007/02/15(木) 01:19:130997名無しさん@お腹いっぱい。
2007/02/15(木) 13:59:58りぬサイトのせいなのかブラウザのせいなのかわからんけど。
りぬ使いは無問題か?
0998名無しさん@お腹いっぱい。
2007/02/15(木) 14:24:530999名無しさん@お腹いっぱい。
2007/02/15(木) 14:30:29firefoxでも windows でも FreeBSDでも無問題
つぎ
シェルスクリプト総合 その8
http://pc10.2ch.net/test/read.cgi/unix/1171517324/
1000名無しさん@お腹いっぱい。
2007/02/15(木) 14:33:05|
|∧∧
(-_-) 1000
(∩∩)―――
/
/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。