シェルスクリプト総合 その21
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2012/11/15(木) 18:57:33.11□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
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でそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
「そういうのはperl使いましょう」と回答するのはやめましょう。
安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その20
http://toro.2ch.net/test/read.cgi/unix/1339083351/
0067名無しさん@お腹いっぱい。
2012/12/09(日) 10:42:10.500068名無しさん@お腹いっぱい。
2012/12/09(日) 10:43:37.850069名無しさん@お腹いっぱい。
2012/12/09(日) 10:46:03.34bo?rn?
0070名無しさん@お腹いっぱい。
2012/12/09(日) 18:39:45.900071名無しさん@お腹いっぱい。
2012/12/10(月) 09:34:25.06どういう意味? ?で変数の何が分かるの?
0072名無しさん@お腹いっぱい。
2012/12/10(月) 10:11:21.88${hoge:?}
0073名無しさん@お腹いっぱい。
2012/12/10(月) 13:52:17.02fooが nullかunset なら "", それ以外は "hello"
${foo+hello}
fooが unsetなら "", それ以外は "hello"
前者は man bash にて仕様が
${parameter:+word}
Use Alternate Value. If parameter is null or unset, nothing is
substituted, otherwise the expansion of word is substituted.
のように確認できたのですが、後者が見あたりません
どの辺を見れば載っているでしょうか? 或いは man レベルでは載っていない仕様でしょうか?
0074名無しさん@お腹いっぱい。
2012/12/10(月) 14:13:26.18あ、それちょうど今週のレポートで学生に課したネタなんで、
知ってる人も答をここには書かないでね。(偶然は恐ろしい)
0075名無しさん@お腹いっぱい。
2012/12/10(月) 14:36:02.61ならせめてレポート提出日が過ぎたら教えてください
0076名無しさん@お腹いっぱい。
2012/12/10(月) 14:38:03.860077名無しさん@お腹いっぱい。
2012/12/10(月) 14:57:36.75http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html#lbBB
> コロンを省略した場合には設定されているかどうかのみを調べます。
これじゃね。
0078名無しさん@お腹いっぱい。
2012/12/10(月) 17:47:50.38ありがとうございます。それですね。
辿ってみたら man bash でも該当する箇所がありました。
0079名無しさん@お腹いっぱい。
2012/12/10(月) 17:55:03.110080名無しさん@お腹いっぱい。
2012/12/10(月) 18:53:49.370081名無しさん@お腹いっぱい。
2012/12/13(木) 04:02:30.30意味不明
0082名無しさん@お腹いっぱい。
2012/12/13(木) 11:02:31.60もともとbashのmanは英語で書かれていたんだよ
0083名無しさん@お腹いっぱい。
2012/12/13(木) 23:00:47.57引数で入力した値で、設定ファイル(~/test.conf)の置換文字列(%replace%)を置換することを考えています。
replace_str=%replace%
input=$1
sed -e "s/${replace_str}/${input}/" ~/test.conf
上記のようなことを考えていますが、入力値に /(スラッシュ)があると、sedコマンドがエラーになってしまい、うまく置換ができません。
入力値に /(スラッシュ)がある場合でも正しく置換する方法はありますか?
また、/(スラッシュ)以外でもNGになってしまう文字はありますか?
その文字も正しく置換することは可能でしょうか。
0084名無しさん@お腹いっぱい。
2012/12/13(木) 23:11:09.68入力値に絶対入らない文字はある?
あれば / のかわりにそれを使う。
sed -e "s,${replace_str},${input}," ~/test.conf
みたいに。
0085名無しさん@お腹いっぱい。
2012/12/13(木) 23:14:17.61$1中の / を \/ に置換してからinputに入れるしかないかな。
この置換がまたやっかいかもだが。
0086名無しさん@お腹いっぱい。
2012/12/13(木) 23:29:11.48たぶんこれでいけるでしょう
0087名無しさん@お腹いっぱい。
2012/12/14(金) 12:41:31.89\や&も特殊な意味を持つと思うよ
俺なら、sedを使わざるをえないなら$inputに使える文字に制限を付けるかな
0088名無しさん@お腹いっぱい。
2012/12/14(金) 12:52:19.320089名無しさん@お腹いっぱい。
2012/12/14(金) 20:54:59.74相手がWebの先の人間だったりするとそういう制限は難しいんじゃ
0090名無しさん@お腹いっぱい。
2013/01/03(木) 00:00:22.31バイナリファイルAのHex値
00100000のようなものを01100000のように書き換えたいです。
駄目元で、
cat A | sed -
e 's/00100000/01100000/' > A
のようにやってみましたがダメでした。
0091名無しさん@お腹いっぱい。
2013/01/03(木) 00:02:32.45きみのsedは16進数値をかけるsedなのかい?
0092名無しさん@お腹いっぱい。
2013/01/03(木) 00:23:12.33やっぱり無理なんでしょうか。…
0093名無しさん@お腹いっぱい。
2013/01/03(木) 01:02:55.970094名無しさん@お腹いっぱい。
2013/01/04(金) 01:11:51.48個人的にはperl使うのが楽だと思うけど
0095名無しさん@お腹いっぱい。
2013/01/04(金) 10:22:05.55これ?
http://www.flat7th.org/~keizo/wiki/?page=%2B+%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E6%93%8D%E4%BD%9C
0096名無しさん@お腹いっぱい。
2013/01/05(土) 23:39:03.740097名無しさん@お腹いっぱい。
2013/01/06(日) 00:05:05.98ttp://www.in-ulm.de/~mascheck/various/ash/ash.png
0098名無しさん@お腹いっぱい。
2013/01/06(日) 00:25:20.450099名無しさん@お腹いっぱい。
2013/01/06(日) 04:34:44.00基本的に全部まとめて配布なのが
BSDの良い所の一つだよ。
でも単体取得する方法もある。
0100名無しさん@お腹いっぱい。
2013/01/06(日) 09:24:06.280101名無しさん@お腹いっぱい。
2013/01/06(日) 10:44:45.32xxdで変換したの編集してからxxdで復元
0102名無しさん@お腹いっぱい。
2013/01/07(月) 00:09:45.57svnからゲッツ、じゃね
http://svn.freebsd.org/base/head/bin/sh/
0103名無しさん@お腹いっぱい。
2013/01/07(月) 13:31:44.54うちのsedは書ける
0104名無しさん@お腹いっぱい。
2013/01/07(月) 22:27:46.05僕のケータイでも読めた。
でもインストールがわからない。
みんなどーやってインストールしてるの?
僕のケータイリナックスってやつらしいけど
客がシェル使えるよーになってないから
これインストールしたら客もシェル使えるんだ。
でもインストールがわからない。
0105名無しさん@お腹いっぱい。
2013/01/08(火) 11:07:30.16configureしてmake install
0106名無しさん@お腹いっぱい。
2013/01/08(火) 15:17:53.67baseシステムに組み込まれてるのは取り出せないと思った方がいい。
0107名無しさん@お腹いっぱい。
2013/01/08(火) 16:40:37.490108名無しさん@お腹いっぱい。
2013/01/08(火) 18:03:08.600109名無しさん@お腹いっぱい。
2013/01/12(土) 21:11:02.86を
2>&-
って書くとまずいことあるの?
おしえて先生!
0110名無しさん@お腹いっぱい。
2013/01/12(土) 22:41:52.39ほとんど手が入っていないであろう net2 のソース持ってくるってのは?
0111名無しさん@お腹いっぱい。
2013/01/13(日) 14:15:52.18writeの失敗を検出するようなコードが書いてあると困る
0112名無しさん@お腹いっぱい。
2013/01/13(日) 14:36:10.220113名無しさん@お腹いっぱい。
2013/01/13(日) 15:03:28.37int main(){
if(write(2,"hello",5) == -1){
return 1;
}
return 0;
}
こんな感じかな。
0114名無しさん@お腹いっぱい。
2013/01/19(土) 01:07:47.55>>111 エラーを返さない方が困ります
0115名無しさん@お腹いっぱい。
2013/01/19(土) 02:20:17.72それに対応してない専ブラ使うやつと、
&が何かも知らずにつっこむやつ
0116名無しさん@お腹いっぱい。
2013/01/19(土) 02:32:56.96ニヤニヤしながら傍観してるオレ。
0117名無しさん@お腹いっぱい。
2013/01/19(土) 10:36:37.19失礼
0118名無しさん@お腹いっぱい。
2013/01/19(土) 18:28:47.20たまにネットがおかしいと聞くと言われて打った
ifconfigは command not found になったりするんだよね。
0119名無しさん@お腹いっぱい。
2013/01/19(土) 18:39:44.080120名無しさん@お腹いっぱい。
2013/01/19(土) 18:50:09.03そうそうと共感してくれればいいのに。
面倒臭い人ね。
0121名無しさん@お腹いっぱい。
2013/01/19(土) 21:26:02.440122名無しさん@お腹いっぱい。
2013/01/20(日) 00:53:25.440123名無しさん@お腹いっぱい。
2013/01/20(日) 02:42:53.88誰でも知ってるような事を書いて
共感しろとは、勘違いも甚だしい
0124名無しさん@お腹いっぱい。
2013/01/20(日) 03:42:08.870125名無しさん@お腹いっぱい。
2013/01/20(日) 05:26:07.600126名無しさん@お腹いっぱい。
2013/01/20(日) 05:38:37.730127名無しさん@お腹いっぱい。
2013/01/20(日) 10:43:48.19次のシェルスクリプトで★マークに入る方法があれば教えてください。
ARG0="$0"
while [ -h "$ARG0" ]; do
ls=`ls -ld "$ARG0"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
★
ARG0="$link"
else
ARG0="`dirname $ARG0`/$link"
fi
done
処理時代はシンボリックリンクの実体を辿る処理だという事は調べて、
なんとか分かったんですが、★の処理にはいる条件がどうしても分かりません。
別に入らなくてもいいのですが、気になってしまって・・・
0128名無しさん@お腹いっぱい。
2013/01/20(日) 10:50:31.370129名無しさん@お腹いっぱい。
2013/01/20(日) 10:54:20.46解答を聞いてるんじゃないよ。
そうそう、こういう構文だと条件がわかりにくいよねぇー、
って共感してくれればいいんだけど。
0130名無しさん@お腹いっぱい。
2013/01/20(日) 11:06:43.970131127
2013/01/20(日) 11:12:54.89ありがとうございます。
絶対パスで調べて、リンクを作りなおしたら通りました。
0132127
2013/01/20(日) 11:25:51.23Linuxを使い始めたばかりで、
とりあえず適当なソフトをWebを見ながらインストールしていました。
その中でTomcatというソフトをインストールするのに、
シェルスクリプトの設置が必要と書かれており、そのサンプルが記載されていました。
しかし、サンプルの意味が全く分からなくて、そのまま使っていいのかも分からず
一から調べている最中でした。
0133名無しさん@お腹いっぱい。
2013/01/20(日) 13:47:00.29http://svn.apache.org/repos/asf/commons/proper/daemon/tags/COMMONS_DAEMON_1_0_7/src/samples/Tomcat7.sh
の事だな。特定の環境にしか存在しないreadlinkは使いたくなかったんだろ。
素人は黙ってなよ。
0134名無しさん@お腹いっぱい。
2013/01/20(日) 14:49:14.74感心感心
0135名無しさん@お腹いっぱい
2013/01/23(水) 14:41:17.73の一番簡単なスクリプトは?
0136名無しさん@お腹いっぱい。
2013/01/23(水) 14:56:34.290137名無しさん@お腹いっぱい。
2013/01/23(水) 15:51:12.07そうそう、ディレクトリが空かどうかの判断って簡単にできないよねぇー
って共感してくれればいいんだけど。
0138名無しさん@お腹いっぱい。
2013/01/23(水) 16:51:23.230139名無しさん@お腹いっぱい。
2013/01/23(水) 17:03:26.940140名無しさん@お腹いっぱい。
2013/01/23(水) 19:43:01.34さぁ、お前のハードリンクを数えろ
0141名無しさん@お腹いっぱい。
2013/01/23(水) 20:37:43.990142名無しさん@お腹いっぱい。
2013/01/23(水) 21:01:24.460143名無しさん@お腹いっぱい。
2013/01/23(水) 21:27:00.12>>141 は、ディレクトリのハードリンク数が2かどうかで空ディレクトリを判断しても、
それは「サブディレクトリ数+2」の値でしかないから、
内部のディレクトリ数が0で通常ファイルだけ存在する場合まで
空ディレクトリと誤判定してしまう、と主張しているようだ。
要するに、空ディレクトリ≠葉(leaf)ディレクトリ
0144名無しさん@お腹いっぱい。
2013/01/23(水) 21:31:31.38ゆえに判定式は定数式。
0145名無しさん@お腹いっぱい。
2013/01/23(水) 21:56:03.020146名無しさん@お腹いっぱい。
2013/01/23(水) 23:08:40.40消してみればいいんだしね。
0147名無しさん@お腹いっぱい。
2013/01/23(水) 23:09:52.410148名無しさん@お腹いっぱい。
2013/01/24(木) 01:17:26.13共感できない。
0149名無しさん@お腹いっぱい。
2013/01/24(木) 05:53:53.020150名無しさん@お腹いっぱい。
2013/01/24(木) 08:38:20.390151名無しさん@お腹いっぱい。
2013/01/24(木) 08:43:24.58すでに>>143が解説済み。
0152名無しさん@お腹いっぱい。
2013/01/24(木) 09:15:47.01rmdirはどのディレクトリも削除できないのでは?
0153名無しさん@お腹いっぱい。
2013/01/24(木) 09:35:00.860154名無しさん@お腹いっぱい。
2013/01/24(木) 11:20:22.52空ディレクトリは.と..以外のファイル/ディレクトリが無いディレクトリのこと
0155名無しさん@お腹いっぱい。
2013/01/24(木) 18:41:29.19プロセスを終了
を5秒ごとに繰り返すコマンド書いてくださいな
0156名無しさん@お腹いっぱい。
2013/01/24(木) 18:47:02.120157名無しさん@お腹いっぱい。
2013/01/24(木) 18:51:36.355秒ごとに繰り返したりしたいこと多いよね、共感します。
0158名無しさん@お腹いっぱい。
2013/01/24(木) 21:04:28.31プロセスを終了 って、どのプロセスでもいい?
0159名無しさん@お腹いっぱい。
2013/01/24(木) 21:33:59.04while sleep 5;do pkill a.app;/a.app &;done
ほんとはpid拾うべきか。$?だっけ。
0160名無しさん@お腹いっぱい。
2013/01/25(金) 01:43:15.600161名無しさん@お腹いっぱい。
2013/01/25(金) 11:02:15.89だとするとopen -a /a.appだろうけど、まあapplescriptで書いた方がいいよ。
ジェントルに終了させられるし。
0162名無しさん@お腹いっぱい。
2013/01/25(金) 11:31:59.01#!/usr/bin/osascriptって書けないんだよね…。
0163名無しさん@お腹いっぱい。
2013/01/25(金) 11:46:54.65そういうLisp系のインタープリタある。(そもそもLisp系は行頭の#がちと特殊だが)
0164名無しさん@お腹いっぱい。
2013/01/25(金) 13:38:52.292行目以降を使うスクリプトを書いてそれをシェバングにしたら?
0165名無しさん@お腹いっぱい。
2013/01/25(金) 14:09:28.74残念。
シェバングに指定できるのはバイナリだけ。(スクリプトじゃ駄目)
0166名無しさん@お腹いっぱい。
2013/01/25(金) 16:53:20.52じゃあperlかなんかで1行に凝縮させればおk
■ このスレッドは過去ログ倉庫に格納されています