シェルスクリプト総合 その14
■ このスレッドは過去ログ倉庫に格納されています
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 でトレースしましょう。
前スレ落ちたみたいなのでリンク省略。
0262名無しさん@お腹いっぱい。
2009/02/25(水) 16:21:38ありがとうございます。readを使うと良いんですね。
無事目的の動作をさせることができました。
>>261
ありがとうございます。
-execはあまり使ったことがないのですが、最後の
done' dummy {} +
の意味がいまいち理解できませんでした。
よろしければ教えていただけますか?
0263名無しさん@お腹いっぱい。
2009/02/25(水) 16:26:36(途中じゃなく)頭にスペースが付いてるディレクトリ名が読めないとか
問題が残るんだな。
その点も含めて解決するとなると、>>261 の解になる。
0264名無しさん@お腹いっぱい。
2009/02/25(水) 17:34:24>(途中じゃなく)頭にスペースが付いてるディレクトリ名が読めないとか
IFS= read -r
0265名無しさん@お腹いっぱい。
2009/02/25(水) 17:36:23read -r は bash依存。
で、それやっても「改行入り」ディレクトリ名が正しく処理されない。
結局 >>261 一択。
0266名無しさん@お腹いっぱい。
2009/02/25(水) 17:48:530267名無しさん@お腹いっぱい。
2009/02/28(土) 18:54:04キーボードを読んで分岐するバッチはどう書けば医院でしょうか?
0268名無しさん@お腹いっぱい。
2009/02/28(土) 19:04:180269名無しさん@お腹いっぱい。
2009/03/01(日) 02:23:56MSDOSのバッチスクリプトしか知らない人?
バッチって、バッチ処理等の普通名詞だろう
0270名無しさん@お腹いっぱい。
2009/03/01(日) 03:26:52そもそもパスワードがかかってないか判定するすべはありますか?
0271名無しさん@お腹いっぱい。
2009/03/01(日) 06:54:24unzip -Zv *.zip | grep 'file security status'
0272名無しさん@お腹いっぱい。
2009/03/01(日) 08:06:080273名無しさん@お腹いっぱい。
2009/03/01(日) 11:17:51普通名詞のバッチ処理はユーザーからの入力待ちは行えない。必要な入力データは
あらかじめ用意しておく処理。対話処理とは対極的なもの。
ユーザーからの入力によって処理を変えたい「バッチ」というならMSDOSのバッチに他ならない。
0274名無しさん@お腹いっぱい。
2009/03/01(日) 11:20:52指定時刻までの時間を計算してsleepする。
0275名無しさん@お腹いっぱい。
2009/03/01(日) 11:27:52それはわかってますよ。その具体的なシェルを質問してるんですが。
0276名無しさん@お腹いっぱい。
2009/03/01(日) 11:29:40read t
sleep $t
command
0277名無しさん@お腹いっぱい。
2009/03/01(日) 11:32:040278名無しさん@お腹いっぱい。
2009/03/01(日) 12:34:37お前、何様のつもり?
0279名無しさん@お腹いっぱい。
2009/03/01(日) 12:42:540280名無しさん@お腹いっぱい。
2009/03/01(日) 13:14:31これってシェルスクリプトで出来るんですか?
0281名無しさん@お腹いっぱい。
2009/03/01(日) 16:28:03こういう荒らしを楽しんでる奴が最近いる。
0282名無しさん@お腹いっぱい。
2009/03/01(日) 18:03:410283名無しさん@お腹いっぱい。
2009/03/01(日) 19:27:530284名無しさん@お腹いっぱい。
2009/03/01(日) 20:10:390285名無しさん@お腹いっぱい。
2009/03/01(日) 20:44:210286名無しさん@お腹いっぱい。
2009/03/01(日) 21:02:500287名無しさん@お腹いっぱい。
2009/03/01(日) 21:03:020288名無しさん@お腹いっぱい。
2009/03/01(日) 23:21:15まさかbashのプラグインと来るなんてねえ。
0289名無しさん@お腹いっぱい。
2009/03/02(月) 09:25:51GUI とhttp通信は別コマンドじゃないかな
awkを書いたのはCSVのparseに使ってるからだろうね
0290名無しさん@お腹いっぱい。
2009/03/02(月) 15:07:180291名無しさん@お腹いっぱい。
2009/03/03(火) 10:58:08$ echo $a
echo の結果を read では変数にセットできない?
0292名無しさん@お腹いっぱい。
2009/03/03(火) 11:05:13ただ、| のうしろはサブシェルになるので、
セットしてすぐサブシェルが終了して忘れるだけ。
echo abcd def | { read a; echo $a; }
ksh だとサブシェルにならないので↑のようにしなくてもふつーに動く。
0293名無しさん@お腹いっぱい。
2009/03/03(火) 11:43:30大人しくバッククォートで実行の結果使います。
0294名無しさん@お腹いっぱい。
2009/03/04(水) 23:31:090295名無しさん@お腹いっぱい。
2009/03/05(木) 00:18:50俺はcshは分からんが。
0296名無しさん@お腹いっぱい。
2009/03/05(木) 02:03:59Perl の chomp をシェルでやりたいのです。
0297名無しさん@お腹いっぱい。
2009/03/05(木) 02:18:180298名無しさん@お腹いっぱい。
2009/03/05(木) 02:21:310299名無しさん@お腹いっぱい。
2009/03/05(木) 06:46:31b=`echo "$a"`
で桶。
0300名無しさん@お腹いっぱい。
2009/03/06(金) 00:52:11ではだめもとで。
配列の
array=( "a 1" "b 2" "b 3")
をforで1要素づつ使いたい場合
for d in ${array[@]}
do
echo $d
done
とかできますよね
これをcshでやること可能ですか?
0301名無しさん@お腹いっぱい。
2009/03/06(金) 01:36:18for d in "${array[@]}"
do
echo $d
done
こうです。
0302名無しさん@お腹いっぱい。
2009/03/06(金) 06:41:00echo $i
end
だろ。
0303名無しさん@お腹いっぱい。
2009/03/06(金) 06:48:04http://pc11.2ch.net/test/read.cgi/unix/1094041299/
>>302
それだと、要素の中のスペースで分割されてしまうからダメ。
例: "a 1" が a と 1 に別れてしまう。
0304名無しさん@お腹いっぱい。
2009/03/06(金) 09:42:48http://pc11.2ch.net/test/read.cgi/linux/1210999497/
0305名無しさん@お腹いっぱい。
2009/03/06(金) 22:26:43cshなら配列使えばいいのでは?
#!/bin/csh -f
set a = ("a 1" "b 2" "c 3");
set i=1
while ( $i <= $#a )
echo $a[$i]
@ i = $i + 1
end
0306名無しさん@お腹いっぱい。
2009/03/07(土) 00:49:25とかイコール前後にスペース付けられるあたりはcsh悪くないよね
というかスペースを許さないbashの代入がちょっとどうかと思う。
0307名無しさん@お腹いっぱい。
2009/03/07(土) 01:10:080308名無しさん@お腹いっぱい。
2009/03/07(土) 03:17:010309名無しさん@お腹いっぱい。
2009/03/07(土) 07:01:04算術式ならbashでもスペースを入れられるよ。
((i = 123))
echo $i
0310名無しさん@お腹いっぱい。
2009/03/08(日) 04:05:420311名無しさん@お腹いっぱい。
2009/03/08(日) 05:48:050312名無しさん@お腹いっぱい。
2009/03/09(月) 19:53:57echo $i
0313名無しさん@お腹いっぱい。
2009/03/10(火) 07:44:38代入したいのですがどうすればよいでしょうか?
eval "$A=B"
や
eval "$A"=B
と書くと、意図通りに代入と判断されるシェル(最近のLinuxのbashやSolarisのsh)も
有ればコマンドと判断されてcommand not foundとなってしまう
シェルもあって、困っています。
0314名無しさん@お腹いっぱい。
2009/03/10(火) 08:24:35一般的には、代入する値のスペースや記号の解釈を避けるには、
eval $A=?''代入する値'?'
と書いておけば桶。evalを含めた2回の解釈を回避するために、
シングルクォートを2回ネスティングする。
$Aの方は、中身は単純な変数名が入っているため、
裸の $A のままクォートしなくても桶。
Solarisのshで動くならそれが標準と考えて良い。
これで動かないようなシェルは捨てるべき。
0315名無しさん@お腹いっぱい。
2009/03/10(火) 08:27:12わ、なぜかこの環境から書き込むと、
半角の\が?に化ける。(なんで?)
>>313 の?はバックスラッシュに読み変えてね。
0316名無しさん@お腹いっぱい。
2009/03/10(火) 08:59:21具体的にどのシェルか言えよ
そのときだけ"$A"にスペースが入ってんじゃないの?
0317名無しさん@お腹いっぱい。
2009/03/10(火) 18:05:12ダサっ
0318名無しさん@お腹いっぱい。
2009/03/10(火) 18:37:45困っています、じゃあ独り言にしかなってないぞ。
動かない場合の代わりの方法が欲しいのか、
ネタを流してるのかハッキリしろ。
0319名無しさん@お腹いっぱい。
2009/03/10(火) 20:10:54いいでしょうか。
0320名無しさん@お腹いっぱい。
2009/03/10(火) 20:30:06last -f /tmp/wtmp
rm -f /tmp/wtmp
場所が違えば適宜探すこと。
圧縮されてたら適宜伸長すること。
11月の分が存在しなければ諦めること。
0321名無しさん@お腹いっぱい。
2009/03/11(水) 02:00:46ありがとうございます。
が、試してみたところエラーとなりました。
XX=YY形式の設定ファイルをIFS="="として、
while readで読み込んで、環境変数XX=値YYとしています。
whileブロックの外ではエラーがでないので、
IFS="="が悪さをしているのではないかとふと思いつきました。
明日試してみます。
>>316,318
bash3.2.25です。
0322名無しさん@お腹いっぱい。
2009/03/11(水) 06:29:23エラーになってあたりまえだ。
IFS="=" にすれば、コマンド上では = が消えてしまう。
XX=YY は、実際には XX YY という風に実行され、エラーになる。
これは、「シェル変数の値を変数名とするシェル変数を定義して代入」
以前の問題。
「シェル変数の値を変数名とするシェル変数を定義して代入」の問題なら、
>>314-315 の回答で合ってる。
あと、bash-3.2.25かどうかは関係ないと思うぞ。
エラーが出るなら他のシェルでもエラーになるはず。
0323名無しさん@お腹いっぱい。
2009/03/11(水) 09:45:54シェルスクリプトはOOじゃないんだよね
時代遅れだね
0324名無しさん@お腹いっぱい。
2009/03/12(木) 07:21:25PowerShell は最近生まれたものなんだから当然だろ。
比較するなら PowerShell と同時期に生まれたシェルと比較しろ。
0325名無しさん@お腹いっぱい。
2009/03/14(土) 01:53:460326名無しさん@お腹いっぱい。
2009/03/14(土) 02:09:290327名無しさん@お腹いっぱい。
2009/03/14(土) 02:14:51彼はLinux板のシェルスクリプトのところでも同じことを書いてたから。
0328名無しさん@お腹いっぱい。
2009/03/14(土) 02:20:53imagemagickのidentifyコマンド
0329名無しさん@お腹いっぱい。
2009/03/14(土) 12:03:010330名無しさん@お腹いっぱい。
2009/03/14(土) 12:32:290331名無しさん@お腹いっぱい。
2009/03/14(土) 23:02:45ありがとうございます。できました。
>>329
>>330
すいません。サイズという表現微妙でした。
解像度?1280x1024とかの値の話でした。
0332名無しさん@お腹いっぱい。
2009/03/17(火) 22:56:18while read l; do
for w in $l; do
type $w > /dev/null 2>&1 && echo $w
done
done < (ファイル) | sort | uniq
0333名無しさん@お腹いっぱい。
2009/03/18(水) 19:31:29xfceのthunarだと画像ファイルを選ぶとステータスバーにサイズを表示する。
あとImageMagickいれるならば関連付けでdisplayにすれば良い
あとはperlなりcなりでperlmagickなりmagickwandなりでやりたい放題。
但しexifはdisplayでは対応しているけれどImageMagickのライブラリーは対応していないので
libexifとかexiftool入れると良いと思う
0334名無しさん@お腹いっぱい。
2009/03/18(水) 19:32:160335328
2009/03/18(水) 20:35:040336名無しさん@お腹いっぱい。
2009/03/19(木) 01:52:23WIDTH=`identify -format '%w' image.jpg`
HEIGHT=`identify -format '%h' image.ipg`
じゃない?
0337名無しさん@お腹いっぱい。
2009/03/21(土) 00:05:33exifに手を出せばいろいろおもしろいんだから、すぐにmanとかで分かるし。
ijgのおまけの返しから削る手だってある。
ノーヒントならともかく「わかった」という喜びを与えてあげよう
それにshell script的には削って置換した方がおもろい。
選択肢が多く汎用性のあるものはいかにおもろいかが重要。
0338名無しさん@お腹いっぱい。
2009/03/22(日) 04:07:520339名無しさん@お腹いっぱい。
2009/03/22(日) 08:11:40俺がお前に聞きたいわ。
0340名無しさん@お腹いっぱい。
2009/03/22(日) 23:38:380341名無しさん@お腹いっぱい。
2009/03/25(水) 18:48:49cshでさ、cshrcで
set path = (${path} ${TOMCAT_HOME}/bin)
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${TOMCAT_HOME}/lib
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${TOMCAT_HOME}/ROOT/WEB-INF/classes
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${TOMCAT_HOME}/ctx/lib:${TOMCAT_HOME}/jdbc/lib
って設定してて、気がつくと、
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin
LD_LIBRARY_PATH=:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
みたいなことになってるけど、重複した同じパスの解消ってスクリプトで出来る?
なんだか検索で遅くなりそうだが、気にしないが現実的?
0342名無しさん@お腹いっぱい。
2009/03/25(水) 21:04:54.cshrcでは setenvしない(setenvは .loginでする)のが現実的
setenvする場合でも、以前の値が蓄積するような書き方はしないのが現実的
cshの話題は
http://pc12.2ch.net/test/read.cgi/unix/1094041299/
に書くのが現実的
0343名無しさん@お腹いっぱい。
2009/03/26(木) 00:23:22それならshでも同じことでしょ
存在しないコマンド打った場合はエラーが帰るのが多少遅くなりそうだけど・・
気持ち悪ければ、「;」を改行に変えて、sort -u して「;」戻して新たにPATHに突っ込めばよいのかもしれんけどそうすると元の順番と変わるなぁ
0344名無しさん@お腹いっぱい。
2009/03/26(木) 07:27:35>それならshでも同じことでしょ
↑
なんでやねん。アフォかw
shの .profile は「ログインシェル」しか読まない。
shって何回も打っても二重登録されない。
0345名無しさん@お腹いっぱい。
2009/03/26(木) 07:41:070346名無しさん@お腹いっぱい。
2009/03/26(木) 07:51:23はぁ? .shrc なんてファイル何者?
少なくとも/bin/shはそんなファイルを読まない。
ash bash zsh ksh も .shrcなんてファイル読まないぞw
0347名無しさん@お腹いっぱい。
2009/03/26(木) 08:00:360348名無しさん@お腹いっぱい。
2009/03/26(木) 08:04:57>>342 が回答済み
0349名無しさん@お腹いっぱい。
2009/03/26(木) 14:58:19普通に使ってたら、そんなことは起きない。
0350名無しさん@お腹いっぱい。
2009/03/26(木) 23:52:39bashしか使わんから.bashrcみたいにあると思い込んでいたよ
0351名無しさん@お腹いっぱい。
2009/03/27(金) 01:18:270352名無しさん@お腹いっぱい。
2009/03/27(金) 01:36:440353名無しさん@お腹いっぱい。
2009/03/27(金) 12:34:12スクリプトの中で変数が空かどうか調べるにはどう書けばよいでしょうか?
ご教示頂きたくm()m
0354名無しさん@お腹いっぱい。
2009/03/27(金) 12:44:24変数名 HOGE が空かどうかを調べる
(1)空文字列は空とはみなさない場合:
echo ${HOGE-'空だよ'}
---
(2)空文字列がセットされていても空とみなしたい場合:
echo ${HOGE:-'空だよ'}
0355名無しさん@お腹いっぱい。
2009/03/27(金) 12:48:45)空文字列も空と見做していいなら、
if [ -z "$HOGE" ]; then
: 空の場合の処理
fi
0356353
2009/03/27(金) 12:51:540357名無しさん@お腹いっぱい。
2009/03/27(金) 12:52:39空文字列は空ではないと考えるなら、
if [ "${HOGE+a}" ]; then
: 空の場合の処理
fi
0358名無しさん@お腹いっぱい。
2009/03/27(金) 12:56:12条件逆になってるよw
if [ -z "${HOGE+a}" ]; then
: 空の場合の処理
fi
0359353
2009/03/27(金) 15:36:18すいませんもう一個疑問が出来ました。
$1のような特殊変数には値の代入はできないのでしょうか??
0360名無しさん@お腹いっぱい。
2009/03/27(金) 15:38:120361名無しさん@お腹いっぱい。
2009/03/27(金) 15:52:22× 特殊変数
○ 位置パラメータ
代入方法 ( $1 に HOGEを代入したいなら)
set -- HOGE
ただし、$2以降のすべての位置パラメータがリセットされる
他に、「特殊パラメータ」($0 $@ $# $? など)もあって、
特殊パラメータには値は代入できない。
■ このスレッドは過去ログ倉庫に格納されています