シェルスクリプト総合 その19
レス数が1000を超えています。これ以上書き込みはできません。
0001シェルスクリプトライター
2011/12/10(土) 20:06:40.38スクリプトのお勉強・自慢・腕試しなどにどうぞ。
□お約束
・特記なき場合は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 でトレースしましょう。
前スレ
シェルスクリプト総合 その18
http://hibari.2ch.net/test/read.cgi/unix/1308195527/
次スレは >>970 で。
0002名無しさん@お腹いっぱい。
2011/12/10(土) 22:26:58.70今日も元気にワンタイマーしてますか?
0003名無しさん@お腹いっぱい。
2011/12/10(土) 23:02:37.12マジ質問ですいません。ワンタイマーって何ですか?
0004名無しさん@お腹いっぱい。
2011/12/10(土) 23:18:47.000005名無しさん@お腹いっぱい。
2011/12/11(日) 00:11:26.910006名無しさん@お腹いっぱい。
2011/12/11(日) 16:42:39.401000 :名無しさん@お腹いっぱい。 :sage :2011/12/11(日) 16:41:38.19
-z って変数が空か入ってるかぢゃ無いのかよ
0007名無しさん@お腹いっぱい。
2011/12/11(日) 16:51:14.38変数が未設定か設定済みかをテストしたい時は、
test -z "${var+X}"
を使う。varに空文字列がセットされていても「設定済み」と判定する。
0008名無しさん@お腹いっぱい。
2011/12/11(日) 16:59:56.87でもさ、スクリプトの場合あらかじめunsetで初期化しない?
unsetを初期化と呼ぶのかどうかさえ知らんのだけど……。
0009名無しさん@お腹いっぱい。
2011/12/13(火) 15:30:20.060010名無しさん@お腹いっぱい。
2011/12/13(火) 17:16:35.400011名無しさん@お腹いっぱい。
2011/12/13(火) 18:30:59.09辿っていけば時期は分かるだろうが、PowerShellに関しては全く知らん
0012名無しさん@お腹いっぱい。
2011/12/13(火) 20:54:11.16へー << じゃなくて <<< を使うんだな。
$ cat <<<XXX
XXX
0013名無しさん@お腹いっぱい。
2011/12/16(金) 10:58:47.040014名無しさん@お腹いっぱい。
2011/12/17(土) 12:28:51.47ヒアストリングっていまいち使いどころがわからんけど。
0015名無しさん@お腹いっぱい。
2011/12/19(月) 00:03:04.76#!bash
:<<'#COMMENT'
echo $PATH
#COMMENT
0016名無しさん@お腹いっぱい。
2011/12/19(月) 00:05:06.810017名無しさん@お腹いっぱい。
2011/12/19(月) 00:10:56.53awk <<< "$*" '{
for (i = 1; i <= NF; i++) {
print $i
}
}'
0018名無しさん@お腹いっぱい。
2011/12/19(月) 06:48:52.85それはシェル内部で添付ファイル作られるから動作が無駄だな
0019名無しさん@お腹いっぱい。
2011/12/19(月) 08:25:18.78とか使えると思うけど
0020名無しさん@お腹いっぱい。
2011/12/19(月) 08:36:39.21その添付ファイル名を知る方法ってない?
終了時に自動で美しく消されるなら使い捨てのawkやsedを埋め込むのに使いたい。
mktempとか面倒だし本題からずれて見難いしさ。
0021名無しさん@お腹いっぱい。
2011/12/19(月) 09:20:27.18exec 3<< EOF
hoge
EOF
cat /dev/fd/3
とか?
0022名無しさん@お腹いっぱい。
2011/12/19(月) 10:14:15.890023名無しさん@お腹いっぱい。
2011/12/19(月) 15:54:24.34無駄無駄だけじゃ、何も進まないぜ(キリッ
0024名無しさん@お腹いっぱい。
2011/12/19(月) 16:09:37.29実際には内部でtmpファイルが作られるという動作が実行され、
コメントになっていない、ということを >>18 が言ってるんだろ?
単に書き方が無駄だということじゃなくて、
根本的にコメントになっていないということ。
0025名無しさん@お腹いっぱい。
2011/12/19(月) 17:25:20.99cshの非実行部は構文解析されるんだっけ?
0026名無しさん@お腹いっぱい。
2011/12/22(木) 23:31:09.41対処方法としてはどうすればいいでしょうか?
0027名無しさん@お腹いっぱい。
2011/12/22(木) 23:37:38.880028名無しさん@お腹いっぱい。
2011/12/23(金) 01:09:38.83iconv使えよ・・・
0029名無しさん@お腹いっぱい。
2011/12/23(金) 09:09:05.64(まあ、-sもあるとは言え)
0030名無しさん@お腹いっぱい。
2011/12/23(金) 10:17:10.53つiconv -c オプション
0031名無しさん@お腹いっぱい。
2011/12/23(金) 11:13:30.90日本語ならnkfの方がまだ分があるって気がする
0032名無しさん@お腹いっぱい。
2011/12/23(金) 11:32:03.950033名無しさん@お腹いっぱい。
2011/12/23(金) 12:23:33.56-c オプションでも解決はしないので nkfお勧め
0034名無しさん@お腹いっぱい。
2011/12/23(金) 18:10:27.100035名無しさん@お腹いっぱい。
2011/12/24(土) 02:09:13.88入れてたpythonでフィルタ書いて使ってる
0036名無しさん@お腹いっぱい。
2011/12/24(土) 02:52:14.20サーバーの設定で文字コードって指定できるんですか?
0037名無しさん@お腹いっぱい。
2011/12/24(土) 03:18:19.750038名無しさん@お腹いっぱい。
2011/12/24(土) 03:33:21.59文字化けだけは防げると思うよ。
文字化けだけは。
0039名無しさん@お腹いっぱい。
2011/12/24(土) 08:59:26.03make一発でコンパイルできるやん
# Makefileにinstall targetがないけどw
0040名無しさん@お腹いっぱい。
2011/12/24(土) 09:07:08.000041名無しさん@お腹いっぱい。
2011/12/25(日) 00:54:50.02間違っています >>39
0042名無しさん@お腹いっぱい。
2011/12/25(日) 01:07:20.68えっ!?
0043名無しさん@お腹いっぱい。
2011/12/26(月) 01:28:47.74内容は天気表示スクリプトで使いかたは第1引数に、
http://weather.yahoo.co.jp/weather/jp/13/4410/13101.html
などのYahooのかなり限定されたURLを打ち込んで使う。
[Bash] weather_yahoo - Pastebin.com
http://pastebin.com/BxfbhQFd
curlじゃなくてaria2cは好みで使ってみた。
一部文字もユニコードで絵文字部分を使っているのでフォントや文字コードによっては文字化けが発生多発する思います。
最初のHTMLからの行の抜き出しはハードコーディングしないほうがいいと思うけど、構造自体変わったら元も子もないし、面倒でやめてしまった。
0044名無しさん@お腹いっぱい。
2011/12/26(月) 07:58:45.68いちいち変数に入れずに、そのままアウトプットしちゃえばいいんじゃないの?
0045名無しさん@お腹いっぱい。
2011/12/26(月) 08:52:51.00> #! /bin/bash
出直しな。
0046名無しさん@お腹いっぱい。
2011/12/26(月) 09:05:07.670047名無しさん@お腹いっぱい。
2011/12/26(月) 09:48:59.59#! /bin/sh
wget -O - --quiet "$1" \
| sed -n '149,163p' \
| sed -r '0~2d
s/.*>([^<]+)<.*/\1/
s/晴れ/ /
s/曇り/ /
s/弱雨/ /
s/湿雪|乾雪|みぞれ/ /' \
| tr '\n' ' ' \
| awk '{ if ($7 == $8) $8 = "〃"
if ($7 == $8) $8 = "〃"
if ($6 == $7) $7 = "〃"
if ($5 == $6) $6 = "〃"
if ($4 == $5) $5 = "〃"
if ($3 == $4) $4 = "〃"
if ($2 == $3) $3 = "〃"
if ($1 == $2) $2 = "〃"
printf "|--+--+--+--+--+--+--+--|\n\
|00|03|06|09|12|15|18|21|\n\
|--+--+--+--+--+--+--+--|\n\
|%s|%s|%s|%s|%s|%s|%s|%s|\n\
|--+--+--+--+--+--+--+--|\n", $1, $2, $3, $4, $5, $6, $7, $8}'
0048名無しさん@お腹いっぱい。
2011/12/26(月) 10:29:15.477zがそんな感じになってるね。
0049名無しさん@お腹いっぱい。
2011/12/26(月) 11:44:34.940050名無しさん@お腹いっぱい。
2011/12/26(月) 11:52:54.12まあ圧縮するときにどうせ付けないといけないから結局覚えてしまうんだけど。
0051名無しさん@お腹いっぱい。
2011/12/26(月) 23:59:53.81前時刻と同じかどうかのチェックと出力はまとめて
|awk '{for (i=1;i<9;i++){printf "|%s",$i==tmp?"〃":$i;tmp=$i};print "|"}'
としたい気分、スレ違い失礼
0052名無しさん@お腹いっぱい。
2011/12/27(火) 02:06:11.940053ss
2011/12/27(火) 06:20:47.960054名無しさん@お腹いっぱい。
2011/12/30(金) 18:26:14.20a.sh -a -b c d e
=> 3
0055名無しさん@お腹いっぱい。
2011/12/30(金) 18:39:18.15#! /bin/sh
manko=0
for chinko in $@
do
if [ `echo $chinko | grep -v ^-` ] ; then
manko=`expr $manko + 1`
fi
done
echo $manko
0056名無しさん@お腹いっぱい。
2011/12/30(金) 18:52:22.91"$@" の中に特殊記号とかスペースとか入ってたら駄目。
forとかでループしたりせずに一発でできる方法を想定してます。
0057名無しさん@お腹いっぱい。
2011/12/30(金) 18:57:38.49for a in "$@";do
case "$a" in
-*)
;;
*)
n=`expr $n + 1`
;;
esac
done
echo $n
0058名無しさん@お腹いっぱい。
2011/12/30(金) 18:58:18.36ねーよ。
0059名無しさん@お腹いっぱい。
2011/12/30(金) 18:59:04.62sedで一文でできたとしても下のレイヤではいくらでもfor文回ってるだろうに。
0060名無しさん@お腹いっぱい。
2011/12/30(金) 20:54:28.27そういうのはUNIX系OSとは非常に相性が悪いので、至れり尽くせりのMFCとかを使うほうが捗るよ
0062名無しさん@お腹いっぱい。
2011/12/30(金) 21:09:20.570063名無しさん@お腹いっぱい。
2011/12/30(金) 21:14:09.510064名無しさん@お腹いっぱい。
2011/12/30(金) 23:59:08.23なんで…
0065名無しさん@お腹いっぱい。
2011/12/31(土) 00:09:53.640066名無しさん@お腹いっぱい。
2011/12/31(土) 06:39:40.520067名無しさん@お腹いっぱい。
2011/12/31(土) 08:53:32.92俺は単純なものとか、拡張する予定が無いときはつかわないなぁ
それに複雑な処理をするならば、RubyなりPerl使った方が簡単とかさ
0068名無しさん@お腹いっぱい。
2011/12/31(土) 09:07:33.56>>66 は >>54 の場合について言ってるんだろ?
0069名無しさん@お腹いっぱい。
2011/12/31(土) 15:02:13.88こんな便利なものが!
getoptsを利用すれば、そもそも -で始まるものを除いた個数を数える必要もない
ことがわかりました。これで行きます。
まさに、forとかでループしたりせずに一発でできる方法ですね。
0070名無しさん@お腹いっぱい。
2011/12/31(土) 15:39:18.970071名無しさん@お腹いっぱい。
2011/12/31(土) 15:44:42.43でもちょっと寂しいです。
0072名無しさん@お腹いっぱい。
2011/12/31(土) 16:46:43.68おおッ。気付いてませんでした
0073名無しさん@お腹いっぱい。
2011/12/31(土) 16:54:05.710074名無しさん@お腹いっぱい。
2012/01/06(金) 01:39:38.05そのプロセスを自動的に殺すようなスクリプトは書けますでしょうか?
または、あるプロセスを100秒だけ起動して、その後自動的に強制的に殺すこと
は可能でしょうか。
0075名無しさん@お腹いっぱい。
2012/01/06(金) 02:49:26.47>あるプロセスを起動して、その標準出力から100行分の入力をもらったら、
>そのプロセスを自動的に殺すようなスクリプトは書けますでしょうか?
あるプロセス | head -n 100
でいいんでねえの?
>または、あるプロセスを100秒だけ起動して、その後自動的に強制的に殺すこと
>は可能でしょうか。
あるプロセス &
sleep 100
kill -9 あるプロセスのプロセスID
でいいんでねえの?
0076名無しさん@お腹いっぱい。
2012/01/06(金) 07:22:26.85$! 使えよ
0077名無しさん@お腹いっぱい。
2012/01/06(金) 13:58:48.37上の方法はあるプロセスが101行目を出力しようとするまで生きてないか?
0078名無しさん@お腹いっぱい。
2012/01/06(金) 15:00:15.020079名無しさん@お腹いっぱい。
2012/01/06(金) 15:01:39.72困るかどうかは>>74に聞かないとわからん。
0080名無しさん@お腹いっぱい。
2012/01/06(金) 19:01:28.820081名無しさん@お腹いっぱい。
2012/01/06(金) 19:36:33.320082名無しさん@お腹いっぱい。
2012/01/06(金) 23:10:50.34そんなもん、動きゃいいんだよ
0083名無しさん@お腹いっぱい。
2012/01/06(金) 23:23:54.660084名無しさん@お腹いっぱい。
2012/01/07(土) 09:35:59.680085名無しさん@お腹いっぱい。
2012/01/07(土) 10:56:05.85ありがとうございます。
最初の問題については、たとえ延々と最初のプロセスが出力をたれ流していても、
パイプがなくなれば自動的に殺されるんですね。
後者の問題の場合、事前にプロセスIDが分からないのが問題なのですが、
シェルで、起動した命令のプロセスIDを取得する方法があるのでしょうか?
0086名無しさん@お腹いっぱい。
2012/01/07(土) 11:44:27.31だから $! だって >>76 が回答してるだろ
0087名無しさん@お腹いっぱい。
2012/01/07(土) 15:13:56.59あるプロセス &
hoge=$!; sleep 100; kill -9 $hoge
0088名無しさん@お腹いっぱい。
2012/01/07(土) 15:30:29.18変数が無駄だな
sleep 100; kill -9 $!
だけで桶。
あと、>>76 の回答でわからない人間にはサンプルを示しても無駄。
0089名無しさん@お腹いっぱい。
2012/01/07(土) 15:41:35.400090名無しさん@お腹いっぱい。
2012/01/07(土) 15:43:03.63わかってないのはオマエ sleepのプロセスIDは $! に入らない。
0091名無しさん@お腹いっぱい。
2012/01/07(土) 15:45:16.77正解者に間違った指摘する >>89 とかは書き込み自粛してくれ
0092名無しさん@お腹いっぱい。
2012/01/07(土) 15:49:41.76>>88 で桶。
009389
2012/01/07(土) 15:55:44.03すっげぇ数の訂正レスがついて嬉しい。ありがとう。
0094名無しさん@お腹いっぱい。
2012/01/07(土) 19:01:59.74自作自演(・A・)イクナイ!!
0095名無しさん@お腹いっぱい。
2012/01/07(土) 19:02:53.770096名無しさん@お腹いっぱい。
2012/01/07(土) 19:42:18.58ファイルにある特定の文字でファイルを分割したいと考えています
何とか調べて
例えばkiritoriと言う文字の箇所からsample.txtを2つに分割するのに
grep -n kiritori sample.txtで行番号がわかりますので
split -ln sampl.txtによりxaa,xabの二つのファイルに分割することがわかりました
ここでお尋ねしたいのですが
grepとsplitをまとめて処理するためにはnをsplitに引き渡す方法がわかりません
どうかよろしくお願いいたします
又他の方法が有りましたらお教えください
0097名無しさん@お腹いっぱい。
2012/01/07(土) 20:12:54.18d
}' sample.txt > xbb
0098名無しさん@お腹いっぱい。
2012/01/07(土) 21:06:49.01早速のレス有難う御座いました。
おかげでファイルを分割できるようになりました
cutで行番号のみ抜き出したり
sedは文字変換のみの認識しかなかったりで
にわかもんはあなたのスクリプト見ただけで
すごいなと言う感想のみです
たまには勉強します
有難う御座いました
0099名無しさん@お腹いっぱい。
2012/01/08(日) 17:43:52.18dateでYYYYMMを取得してきます。(例:201201)
1月から9月の場合には0を消去して、YYYYMで表示させたいのです。(例:20121)
自分でも一応下のようにして出来たのですが、もっと簡単に作る方法はないでしょうか?
lm=`date "+%Y%m"`
ll=`echo ${lm}|cut -c 1-4`
mm=`echo ${lm}|cut -c 5-6`
if [ ${mm} -lt 10 ];then
mm=`echo ${mm}|sed s/0//`
fi
lm=${ll}${mm}
echo ${lm}
0100名無しさん@お腹いっぱい。
2012/01/08(日) 17:47:39.30date +%Y-%m | sed s/-0//
0101名無しさん@お腹いっぱい。
2012/01/08(日) 17:49:53.71それ、10月以降が駄目だろw
date +%Y%m | sed 's/-0//; s/-//'
0102名無しさん@お腹いっぱい。
2012/01/08(日) 17:51:50.20自演乙 おちつけ
date +%Y-%m | sed 's/-0//; s/-//'
0103名無しさん@お腹いっぱい。
2012/01/08(日) 17:58:24.55おぉ、もう返答が。
そうか、消したい0の前に何か付け足すことで限定すれば良いんですね。
ありがとうございました。
0104名無しさん@お腹いっぱい。
2012/01/08(日) 18:03:08.42せっかくbashならdateコマンド以外、内部コマンドだけでもできるよ。
a=($(date +'%Y %m'))
echo ${a[0]}${a[1]#0}
0105名無しさん@お腹いっぱい。
2012/01/08(日) 18:57:49.32case $month in
0?) month=${month##0} ;;
esac
lm=`date +%Y$month`
or if you are using GNU date
date +%Y%-m
0106名無しさん@お腹いっぱい。
2012/01/08(日) 19:15:43.51>>105 最終行の
date +%Y%-m
が最適解だな。
ところで、>>105 前半のcase文は意味ない。場合分けせずに ${month#0}だけでよい。
0107名無しさん@お腹いっぱい。
2012/01/08(日) 19:52:34.83man dateで>>105さんのやり方がしっかり書いてありました…
お恥ずかしい。
皆様ありがとうございます。
0108名無しさん@お腹いっぱい。
2012/01/08(日) 22:51:02.00今まで expr で 0 を消してた。
0109名無しさん@お腹いっぱい。
2012/01/09(月) 08:29:51.48echo $(date +%Y)$(expr $(date +%m) + 0)
0110名無しさん@お腹いっぱい。
2012/01/09(月) 08:53:59.96expr `date +%m` : "0\?\(.\+\)"
0111名無しさん@お腹いっぱい。
2012/01/09(月) 09:00:41.79$ echo $((08+0))
-bash: 08: value too great for base (error token is "08")
0112名無しさん@お腹いっぱい。
2012/01/09(月) 09:08:48.76シェルの算術式とかでは頭の0は8進数扱いだからな。
exprなら8進数とはみなさないので、expr 08 + 0 とかやって0を消すのは常識テクニック。
0113名無しさん@お腹いっぱい。
2012/01/13(金) 10:37:37.37sed -e "s/ //g" temp.txt
↑ここに/(スラッシュ)を含む文字列を入れたいときはどうしたらいんですか?
0114名無しさん@お腹いっぱい。
2012/01/13(金) 10:46:55.510115名無しさん@お腹いっぱい。
2012/01/13(金) 11:12:47.98>>114のようにするか、区切り文字を"/"から"@"とかの他の文字に変える
純粋なsedの話しなのでスレち
ttp://toro.2ch.net/test/read.cgi/unix/1085730992/
0116名無しさん@お腹いっぱい。
2012/01/19(木) 17:43:20.44中間ファイルを作ってディレクトリ名と日付の比較を行なっての処理は一応出来たのですが、出来ればfind xargsで一発で出来る形にしたいです
中間ファイル無しで上記のような処理は実現できるでしょうか?
0117名無しさん@お腹いっぱい。
2012/01/19(木) 17:54:34.58yyyymmddHHMMSS形式なら単純な数値と考えて大小比較すればいいね。
比較するのに中間ファイルは要らない。
0118名無しさん@お腹いっぱい。
2012/01/19(木) 18:05:56.97エスパーカが足りないなw
中間ファイルは条件にマッチしたディレクトリリストのファイルかと
tarじゃなくてcpioなら Solaris findの -cpioオプションで一発かな
0119名無しさん@お腹いっぱい。
2012/01/19(木) 18:35:22.450120名無しさん@お腹いっぱい。
2012/01/19(木) 18:52:00.33-newer のたぐいはまさに中間ファイルが必要ですが
0121名無しさん@お腹いっぱい。
2012/01/19(木) 18:56:59.650122名無しさん@お腹いっぱい。
2012/01/19(木) 19:01:28.69どんな内容の中間ファイルをどのような目的で作成しているのか
それがわかれば回答する側もエスパーにならなくていいからね
0123名無しさん@お腹いっぱい。
2012/01/19(木) 19:02:52.930124名無しさん@お腹いっぱい。
2012/01/19(木) 19:04:30.79どうやって?
0125名無しさん@お腹いっぱい。
2012/01/19(木) 23:32:23.93/home/my/st/1.txt
1 暑い
2 寒い
3 少し暑い
4 少し寒い
5 すごく暑い
6 すごく寒い
/home/my/st/2.txtに書き込ませたいですのですがどう書けば良いでしょうか?
0126名無しさん@お腹いっぱい。
2012/01/19(木) 23:50:32.460127名無しさん@お腹いっぱい。
2012/01/19(木) 23:57:33.44わお
そんなに短く出来るんですね
感謝です!!
0128名無しさん@お腹いっぱい。
2012/01/20(金) 00:02:25.13調べたらこんな感じにもできそうだった。
shuf --rndom-source=1.txt -o 2.txt
0129名無しさん@お腹いっぱい。
2012/01/20(金) 00:34:25.58--random-source=/dev/random
--random-source=/dev/zeroで試してみて
0130名無しさん@お腹いっぱい。
2012/01/20(金) 01:03:57.15全行シャッフルとかしなくていいのがメリットだとか。
perl -ne '$result = $_ if rand($.)<1; END{print $result}'
0131名無しさん@お腹いっぱい。
2012/01/20(金) 01:24:54.340132名無しさん@お腹いっぱい。
2012/01/20(金) 06:30:44.02catもパイプも無駄だな。
shuf -n 1 < 1.txt > 2.txt
0133名無しさん@お腹いっぱい。
2012/01/20(金) 08:44:30.170134名無しさん@お腹いっぱい。
2012/01/20(金) 11:04:53.930135名無しさん@お腹いっぱい。
2012/01/20(金) 13:37:16.040136名無しさん@お腹いっぱい。
2012/01/20(金) 13:55:53.73POSIXにはない
0137名無しさん@お腹いっぱい。
2012/01/20(金) 19:02:11.53へどらとかならあるんじゃね?
0138名無しさん@お腹いっぱい。
2012/01/20(金) 19:09:47.870139名無しさん@お腹いっぱい。
2012/01/20(金) 19:11:08.120140名無しさん@お腹いっぱい。
2012/01/20(金) 19:58:46.800141名無しさん@お腹いっぱい。
2012/01/20(金) 22:33:57.03大手SIerじゃ5年前から常識だな
0142名無しさん@お腹いっぱい。
2012/01/20(金) 23:18:45.090143名無しさん@お腹いっぱい。
2012/01/20(金) 23:39:27.25A="`cat list.txt |tr -s \\n , |head -c -1`"
でもこれだとnが,に置換される。\\nを'\n'にすればいけたけど、バッククオートの中のエスケープって何回評価されるの?
0144名無しさん@お腹いっぱい。
2012/01/21(土) 00:28:29.06\n
0145名無しさん@お腹いっぱい。
2012/01/21(土) 01:02:25.99ユーザーアカウント名とパスワードを自動で入れてログインしたいのですが
0146名無しさん@お腹いっぱい。
2012/01/21(土) 02:12:35.16http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html#lbBA
A="$(cat list.txt |tr -s \\n , |head -c -1)"
0147名無しさん@お腹いっぱい。
2012/01/21(土) 07:43:37.27とりあえずcatが無駄。
バッククオートの中のバックスラッシュは特殊な意味を持つので、
2回評価されると考えとけばいい。
この例ではバックスラッシュ3回で回避できる。
>>146
$( )使っちゃ駄目よ。
0148名無しさん@お腹いっぱい。
2012/01/21(土) 08:02:20.86なぜ cat をわざわざ付けるかと言うと、
自分が作る全てのスクリプトや打ち込むコマンドで
ファイルを読む際には必ず cat で読む
と統一する事で、ミスる可能性を減らしてるつもり。
客に納品するスクリプトでは仕方なく削るけど。
元々のきっかけは 20 年程前に tar でファイル消してしまったことだった。
0149名無しさん@お腹いっぱい。
2012/01/21(土) 08:09:55.160150名無しさん@お腹いっぱい。
2012/01/21(土) 08:51:51.18コメントの様な物だ。
0151名無しさん@お腹いっぱい。
2012/01/21(土) 08:55:23.20の順に書きたいというだけの理由なら、
< file コマンド
と書けば良い。
0152143
2012/01/21(土) 09:25:54.14凄く参考になった。ありがとう
> バッククォートを使う古い形式の置換を用いたとき、バックスラッシュは文字通りの意味を保ちます
> が、 $, `, \ の前にある場合は例外となります。バックスラッシュが前置されていないバッククォートが
> あると、そこでコマンド置換は閉じられます。 $(command) という形式を用いたときは、括弧の間にある
> 全ての文字がコマンドとなります。特別扱いされる文字はありません。
`cmd`と$(cmd)の2つの形式で意味(処理?)が違うなんて知らなかった
> コマンド置換は入れ子にできます。バッククォート形式の時に入れ子を行うには、
> 内側のバッククォートをバックスラッシュでエスケープします。
入れ子にするときは2つの形式を組み合わせて書いてたから、これも気が付かなかった
特殊扱いの文字が$(cmd)形式ではないなら、cmdの中に)がある場合\でエスケープはできないってことか
>>147
評価回数について、ありがとう。最小3つ並べる必要があるのか
cat使っているのは、前処理があってパイプを使っているという意思表示
ときどきシーク可能か否かで挙動が変わるプログラムもありますし
0153名無しさん@お腹いっぱい。
2012/01/21(土) 10:01:25.74> $( )使っちゃ駄目よ。
爺さんや、Solarisでも/bin/shはkshになりましたよ。
というわけでもういいんじゃないか。テンプレもそろそろ修正どき。
0154名無しさん@お腹いっぱい。
2012/01/21(土) 10:17:31.18正直、その書き方は知らなかった。
0155名無しさん@お腹いっぱい。
2012/01/21(土) 10:26:19.10同じ様な経験から自分と似たような対処している全然知らない人の存在を知ると、何か和むなぁ
0156名無しさん@お腹いっぱい。
2012/01/21(土) 10:28:50.430157名無しさん@お腹いっぱい。
2012/01/21(土) 11:57:08.26なんかずれてる気がする
0158名無しさん@お腹いっぱい。
2012/01/21(土) 12:16:06.97tar xvf と tar cvf を間違えたって話か?
ふつーあらかじめ chmod -w hoge.tar やっておくから消すことはありえない。
0159名無しさん@お腹いっぱい。
2012/01/21(土) 12:33:47.900160名無しさん@お腹いっぱい。
2012/01/21(土) 13:25:25.150161名無しさん@お腹いっぱい。
2012/01/21(土) 13:29:30.84とやろうとして
tar cvf bbb ccc
とかやって、bbbを消しちゃったってことかな
0162名無しさん@お腹いっぱい。
2012/01/21(土) 13:32:21.940163名無しさん@お腹いっぱい。
2012/01/21(土) 14:11:25.85>>146 では「ファイルを読む際には必ずcatで読む」て言ってるから、
tar xvf の時の話かと。
0165名無しさん@お腹いっぱい。
2012/01/22(日) 00:51:01.40cat foo | cmd1
で、cmd1の前に前処理やりたくなった時、
cat foo | cmd0 | cmd1
と書き換え簡単。
cmd1 fooをcmd0 foo | cmd1にするのは語順置き換えがある。
transpose-wordするのは空白入り"文字列やオプション指定があるとちょっと面倒。
ファイル名をひとつしか指定できないバカコマンドで、
2つ指定したくなった時にイラっとくるから、などの理由。
0166名無しさん@お腹いっぱい。
2012/01/22(日) 01:25:14.86ファイルがないなどのエラーを捕捉し損ねる可能性があるから。
0167名無しさん@お腹いっぱい。
2012/01/22(日) 06:46:04.290168名無しさん@お腹いっぱい。
2012/01/22(日) 08:04:14.62cat foo | cmd1 ではなく、
< foo cmd1 とする。(いつもこう書く癖を付けておく)
で、cmd1の前に前処理やりたくなった時、
< foo cmd1 | cmd2
と書き換え簡単。
以上で、catを無駄に使う理由がなくなる。
0169名無しさん@お腹いっぱい。
2012/01/22(日) 09:05:11.75(| (< foo cmd1) cmd2)
とかって書くやつ
0170名無しさん@お腹いっぱい。
2012/01/22(日) 10:15:08.87流れが一方向ではないので理解しづらい。
そもそも<禁止ルールがある場合もある。
0171名無しさん@お腹いっぱい。
2012/01/22(日) 10:19:18.34俺ルールでは禁止って後だしで言われてもなあ。 w
0172名無しさん@お腹いっぱい。
2012/01/22(日) 10:30:20.87良く見ろ。流れは一方向だぞ。
流れを一方向にするために、
com1 < file | com2
を
< file com1 | com2
と並べ変えたんだが。>>170 は良く読んでなさそうだなw
0173名無しさん@お腹いっぱい。
2012/01/22(日) 11:00:43.73初心者でも読めるように cat から始めろ。
実績がないから cat から始めろ。
俺流を通す無能な上司を説得する方法も教えろください。
0174名無しさん@お腹いっぱい。
2012/01/22(日) 11:05:03.14> で、cmd1の前に前処理やりたくなった時、
> < foo cmd1 | cmd2
逆じゃね?
0175名無しさん@お腹いっぱい。
2012/01/22(日) 11:16:14.220176名無しさん@お腹いっぱい。
2012/01/22(日) 11:16:49.44で、cmd1の前に前処理やりたくなった時、
< foo cmd0 | cmd1
かな
0177名無しさん@お腹いっぱい。
2012/01/22(日) 11:22:49.700178名無しさん@お腹いっぱい。
2012/01/22(日) 11:30:36.380179名無しさん@お腹いっぱい。
2012/01/22(日) 11:38:12.780180名無しさん@お腹いっぱい。
2012/01/22(日) 11:43:57.77引用レスの最初に入力リダイレクト書くと顔文字みたい > <
0181名無しさん@お腹いっぱい。
2012/01/22(日) 12:11:08.982>&1とか使うくらいならcshでやれよ頭固いなあ
0182名無しさん@お腹いっぱい。
2012/01/22(日) 12:15:52.47だって、無能上司の部下だもの。
0183名無しさん@お腹いっぱい。
2012/01/22(日) 12:19:51.880184名無しさん@お腹いっぱい。
2012/01/22(日) 12:29:22.980185名無しさん@お腹いっぱい。
2012/01/22(日) 13:05:48.180186名無しさん@お腹いっぱい。
2012/01/22(日) 13:16:17.54< foo cmd1は使えない。
!<でも
!cmd1
でもhistoryを呼び出せない。
0187名無しさん@お腹いっぱい。
2012/01/22(日) 13:21:03.72シェルスクリプトでhistoryを使う馬鹿?
0188名無しさん@お腹いっぱい。
2012/01/22(日) 13:41:56.10全力で己の無能を告白するなよ。ドMの新しいプレーか? www
!?cmd1
で呼び出せるだろ。
0189名無しさん@お腹いっぱい。
2012/01/22(日) 14:22:29.46リダイレクトじゃ複数は無理だし、多く引数を取るコマンド、特に入出力のファイル名を
どちらも引数に取れるコマンドだと、入力だけ区別して分けられる
0190名無しさん@お腹いっぱい。
2012/01/22(日) 14:45:03.840191名無しさん@お腹いっぱい。
2012/01/22(日) 14:47:00.85パイプはそうではないという違いもあるよね
つまりcatが単に冗長で資源の無駄、というだけでなく
単純にcatではダメなケース(あるいは非常に非効率になるケース)が
厳然としてあるわけで、>>173の上司にはその点を訴えてみたらどうだろうか
stdout/stderrを何かに保存する目的でいずれにせよリダイレクトは使うだろうし
パイプのほうがリダイレクトより「初心者でも読める」というのは意味不明だ
なんかほんの少しでも合理的な理由があるのだろうか?
0192名無しさん@お腹いっぱい。
2012/01/22(日) 14:51:57.61バカな習慣を必死に言い訳すんなよ。羞恥プレー続行中か? w
複数ファイルを引数に取るのはどうすんだよ。
for f in $files ; cat $f |file -;done
こうか? スゲーぜ。 www
0193名無しさん@お腹いっぱい。
2012/01/22(日) 15:31:48.18fileは普通標準入力から読み込ませることはしないだろ?シェルスクリプトで使うこと前提だぞ、スレ的に
0194名無しさん@お腹いっぱい。
2012/01/22(日) 15:36:47.44何それ?
分割したバイナリを合体させるのに普通にcat使えるでしょ
catってfile結合コマンドだよ
0195名無しさん@お腹いっぱい。
2012/01/22(日) 16:05:46.12ありがとう。
機会ができたら、訴えてみる。
「初心者でも」っていうのは、ちょっとニュアンスが伝えにくいんだけど…気にしないで大丈夫です。
展開の順序とか考えず、コマンドを並べるならなんでもかんでもパイプを通せばいいじゃんって
新人とかへ教えるのが楽だから、そういう(ローカルな)文化になってるのかも。
0196名無しさん@お腹いっぱい。
2012/01/22(日) 16:13:11.56「ヒストリー使えないからダメ」とか言い出したのはやっぱり羞恥プレーか?
まあ、それは置いとくとして、「入力ファイルを区別できるからからcatして
パイプから流し込む」と言い出したバカをからかってるだけだよ。
入力ファイルは引数から渡した方が、
1 名前を渡せる。
2 シークも可能。
と、明らかに有利。
catはその名の通りファイルを結合する場合に使用する。
恥さらしな習慣の見苦しい言い訳まだ続ける?
0197名無しさん@お腹いっぱい。
2012/01/22(日) 16:59:14.69僕みたいなのもいるのですよ。 concatenate なんて…
0198名無しさん@お腹いっぱい。
2012/01/22(日) 17:13:08.18リダイレクトってシーク可能だったのか、知らなかった。
でもシークできるかできないかで挙動を変えるのはプログラム側だよね?
プログラムの実装でわざわざstdinがシークできるかどうかチェックするロジックって普通実装してある?
シーク前提のプログラムはそもそも標準入力から読み込もうとしないんじゃないかな。
0199名無しさん@お腹いっぱい。
2012/01/22(日) 17:37:41.83> プログラムの実装でわざわざstdinがシークできるかどうかチェックするロジックって普通実装してある?
お前のようなボンクラは知らないだろうが、必要ならばしている。
0200名無しさん@お腹いっぱい。
2012/01/22(日) 17:52:16.93fstat()で簡単に判断できるから、まともなプログラムならシーク可能かどうかは
「標準入力かどうか」ではなく、stat情報で判断する
ロジック的に1パス、シークエンシャルアクセスで行ける場合でも、
wavみたいなある程度でかいバイナリストリームを処理するソフトウエアでは
不要なチャンクをシークで飛ばせるかread()が必要かでは大違いなので
特にマルチメディア系ではシークが使える場合には使うのが普通
(そうしたプログラムがパイプで標準入力を利用可能なのも普通)
0201名無しさん@お腹いっぱい。
2012/01/22(日) 18:45:46.67ざっとbinutils、grep、awk、sedのソース漁ってみてが、無いな
0202名無しさん@お腹いっぱい。
2012/01/22(日) 18:50:17.20ボンクラがメクラ撃ちしたって当たらないって事の証明だな。
オレは一発でtailを見つけたが。w
lessもおそらくやってる。
0203名無しさん@お腹いっぱい。
2012/01/22(日) 19:00:26.75< 1GB_file wc -c # 一瞬
cat 1GB_file | wc -c # 時間かかる
0204名無しさん@お腹いっぱい。
2012/01/22(日) 19:51:25.77これは俺にとって cat やめる理由になるな。
逆に言えばここまで出てきた書き込み程度ではあまり cat やめる気がしない。
でも何故だろうな。wc はソースしっかり読んだのに気が付かなかったなあ。
0205名無しさん@お腹いっぱい。
2012/01/22(日) 20:02:12.51効率がよいだろう
・.profileとかで共通関数を定義する
・共通関数だけのスクリプトを作ってセットで使う
・がんばってシェルスクリプトに埋め込んでいく
他にある?
0206名無しさん@お腹いっぱい。
2012/01/22(日) 20:10:17.98> バイナリファイルだとcat通すと0x1dが消えたりしてファイル壊すから危険。
どこのcat?
0207名無しさん@お腹いっぱい。
2012/01/22(日) 20:11:46.67ふつうはファイル別にしてsourceする。
0208名無しさん@お腹いっぱい。
2012/01/22(日) 20:12:38.04その 2 番目は source で読み込むという意味でOK?
. functions.sh
0209名無しさん@お腹いっぱい。
2012/01/22(日) 22:52:35.96なるほどね。確かにfstatだと区別できる。とても参考になった
特に前に戻るシークしか考えてなかったから、後半はその通りだわ。酷いレベルで気付かなかった
0210名無しさん@お腹いっぱい。
2012/01/22(日) 23:23:48.64全部読んでも大した量じゃないから。
0211名無しさん@お腹いっぱい。
2012/01/23(月) 00:18:56.40wcに似たプログラムを自分で作ったことがあるんだけど、wcの方が処理が速いわけ
んでなぜwcの方が速いのかソースを調べたことがある。すげえ勉強になったよ
0212名無しさん@お腹いっぱい。
2012/01/23(月) 01:08:55.19>>208
そうさね
現状は、sourceで読み込ませてる
で、今は共通関数をfunctions.shとしてマージして使ってるんだが、対象システムで
使われてない関数も一緒になってるんで、サイズが無駄に大きくなってる
しゃあねえのかなぁ
0213名無しさん@お腹いっぱい。
2012/01/23(月) 01:33:25.920214名無しさん@お腹いっぱい。
2012/01/24(火) 00:19:15.61postgresユーザに切り替えてからpsqlでselect文(time列から現在時刻の一ヶ月前からのデータだけをとる)
叩きたいんだけど
TIME=1
sudo su - postgres -c 'psql -d データベース名 -c "select time from データベース名 where time > current_timestamp + '-${TIME} months';"'
どうにもうまくいかない…ファイルとかにsql書いてやるのじゃなくて1行でやりたいんだけど。。
0215名無しさん@お腹いっぱい。
2012/01/24(火) 01:28:32.12かなぁ
0216名無しさん@お腹いっぱい。
2012/01/24(火) 07:25:52.83>>ファイルとかにsql書いてやるのじゃなくて1行でやりたいんだけど。。
意味不明。
0217名無しさん@お腹いっぱい。
2012/01/24(火) 08:10:02.57ありがとうやってみる。
>>216
別ファイル?にして呼び出すということでしょうか。すみません初心者なので
0218名無しさん@お腹いっぱい。
2012/01/24(火) 09:34:29.11PGPASSWORD=xxxx
export PGUSER PGPASSWORD
pgsql -d foo -A -q -c "SELECT * FROM hoge";
こんな感じでいけるんじゃないの?
0219名無しさん@お腹いっぱい。
2012/01/24(火) 10:45:42.00そこがわからない
0220名無しさん@お腹いっぱい。
2012/01/24(火) 11:04:18.960221名無しさん@お腹いっぱい。
2012/01/24(火) 11:09:52.37postgresのselect文の構文は知らないので、↓
select time from データベース名 where time > current_timestamp + '-1 months';
このselect文が正しい結果を返すと仮定して、
>どうにもうまくいかない…ファイルとかにsql書いてやるのじゃなくて1行でやりたいんだけど。。
この「どうにもうまくいかない」ときに、sudo su ... コマンドから
どのようなエラーメッセージが出されているのかを具体的に教えください。
0222名無しさん@お腹いっぱい。
2012/01/24(火) 11:12:29.95bashです。
0223218
2012/01/24(火) 11:18:56.48例えばMovableTypeへのアクセスだけど、これでいけたけど
psql -d foo -A -q -c "SELECT log_id,log_created_on FROM mt_log where log_created_on > current_timestamp + '-${TIME} month';"
0224名無しさん@お腹いっぱい。
2012/01/24(火) 12:06:10.33Try `su --help' for more information.
months > chg_date;': -c: line 0: unexpected EOF while looking for matching
`''months > chg_date;': -c: line 1: syntax error: unexpected end of file
0225名無しさん@お腹いっぱい。
2012/01/24(火) 12:11:56.62TIME=1
sudo su - postgres -c "psql -d データベース名 -c 'select time from テーブル
名 where current_timestamp + "-$TIME months" < time;'"
実行したのはこれです
0226名無しさん@お腹いっぱい。
2012/01/24(火) 12:17:14.76ダブルクォートの中で素のダブルクォート使っちゃ駄目。
そこでクォートが終了して別引数とみなされて su 側でエラーになってる。
0227名無しさん@お腹いっぱい。
2012/01/24(火) 12:17:51.07ユーザーを切り替えてからやるにはうしたらよいのでしょうかと
0228218
2012/01/24(火) 12:52:46.68postgres(root)でデータベースの実行をしたいだけだよね?
それを >>218で書いているわけだけど、それとも私が勘違いしているのかな
0229名無しさん@お腹いっぱい。
2012/01/24(火) 13:03:41.37------------------
#/bin/sh
TIME=1
psql -d データベース名 -c "select time from テーブル名 where current_timestamp + '-$TIME months' < time;"
------------------
# sudo su - postgres -c /path/to/doit
0230名無しさん@お腹いっぱい。
2012/01/24(火) 13:12:38.92僕が勘違いしているのだと思います
教えていただいた方法でやってみます
0231名無しさん@お腹いっぱい。
2012/01/24(火) 14:36:27.74228さんの方法で問題なくできました!
0232名無しさん@お腹いっぱい。
2012/01/25(水) 22:21:21.41$deviceには/dev/sdbとか
このスクリプトをsudoで動かすと、total_sizeが空
rootになって実行すると、容量の数字が入ります。
どうして?
0233名無しさん@お腹いっぱい。
2012/01/25(水) 23:47:33.700235名無しさん@お腹いっぱい。
2012/01/26(木) 12:35:38.390236名無しさん@お腹いっぱい。
2012/01/26(木) 20:01:15.66sudoの中で変数に代入しても、sudoを抜けたら元のシェルの変数には入ってないよw
と、ボケておこう。
0237名無しさん@お腹いっぱい。
2012/01/26(木) 20:31:33.860239名無しさん@お腹いっぱい。
2012/01/27(金) 13:27:36.890240名無しさん@お腹いっぱい。
2012/01/27(金) 15:10:58.950241名無しさん@お腹いっぱい。
2012/01/27(金) 19:32:43.61$ cat ./test.sh
#!/bin/sh
device=/dev/sda
total_size=`fdisk -l $device | grep "Disk $device" | awk '{print $5}'`
echo $total_size
$ sudo ./test.sh 2> /dev/null
21474836480
0242232
2012/01/28(土) 21:12:44.61~$ cat mksd.sh
#! /bin/sh
device=$1
echo $device
total_size=`fdisk -l $device | grep Disk | awk '{print $5}'`
echo "total_size = $total_size"
~$ sudo ./mksd.sh /dev/sdb
/dev/sdb
total_size =
~$ su
パスワード:
# ./mksd.sh /dev/sdb
/dev/sdb
total_size = 3904897024
です
0243232
2012/01/29(日) 08:51:14.17あれ、すいません見てませんでした
~$ cat mksd.sh
#! /bin/bash
device=$1
echo $device
total_size=`fdisk -l $device | grep Disk | awk '{print $5}'`
echo "total_size = $total_size"
size=$[$total_size / 2]
echo $size
saito@ubuntu:~$ mksd.sh /dev/sdb
mksd.sh: command not found
saito@ubuntu:~$ ./mksd.sh /dev/sdb
./mksd.sh: line 9: /2: syntax error: operand expected (error token is "/2")
~$ su
パスワード:
# ./mksd.sh /dev/sdb
/dev/sdb
total_size = 3904897024
1952448512
なぜ、こうなるんでしょうか?
0244名無しさん@お腹いっぱい。
2012/01/29(日) 09:09:10.62面倒だから /proc/partitions の方使えよ。こっちならroot権限要らん。
1kバイトのブロック単位だから、1024倍な。
引数は /dev/sdaじゃなく、sdaだけで指定する。
grep/awkとか使わずに内部コマンドだけで組んでみた。
$ cat hoge.sh
device=$1
while read x x blocks name && [ "$name" != "$device" ]
do :; done < /proc/partitions
total_size=$((blocks*1024))
$ ./hoge.sh sda
1000204886016
0246名無しさん@お腹いっぱい。
2012/01/29(日) 12:12:34.09まだやってたんだ。
envやsetの出力差分とか見ないのか?
0247名無しさん@お腹いっぱい。
2012/01/30(月) 08:01:56.00↓の結果を比べてみる、とか。
#! /bin/sh
result=`fdisk -l /dev/sda`
echo "$result"
0248名無しさん@お腹いっぱい。
2012/01/30(月) 20:31:06.87スクリプトの途中でread -s -n 1などとして画面をポーズしたいのですが、
標準入力にデータが渡されているため画面ポーズのためのreadにもそれが読み込まれてしまい、思ったように動作しません。
一旦ファイルディスクリプタの0番をクリアすれば良いのかと思うんですが、どのようにすれば実現できるでしょうか?
念のため、画面の一時停止はsleepなどでも可能なのは分かっていますが、
今回はreadで実現したいということでよろしくお願いします。
0249名無しさん@お腹いっぱい。
2012/01/30(月) 20:35:24.72read -s -n 1 < /dev/tty
0250名無しさん@お腹いっぱい。
2012/01/30(月) 20:51:23.68出来ました!こんな簡単な事だったんですね。
ついでに聞きたいんですが、一旦読み込まれた標準入力のクリアとかって無理なんでしょうか?
それと/dev/ttyは移植性のある?書き方なんでしょうか。
質問ばかりですみません。
0251名無しさん@お腹いっぱい。
2012/01/30(月) 20:56:36.52exec < /dev/tty
を実行すると、以降の行は標準入力が端末に戻るので
read -s -n 1
だけで行けるようになる。
/dev/ttyはどのOSでも移植性がある。
0252名無しさん@お腹いっぱい。
2012/01/30(月) 21:24:08.05なるほど、そういうテクニックがあるんですね。
勉強になりました。
どうもありがとうございました。
0253名無しさん@お腹いっぱい。
2012/01/31(火) 01:12:06.63流石に「どのOSでも」は言い過ぎではw
まあsh動く環境ならまず大丈夫だとは思うから実害はないが
0254名無しさん@お腹いっぱい。
2012/01/31(火) 06:11:03.04いいや、「どのOSでも」OK。
反論するなら反例を挙げろや、カス。
0255名無しさん@お腹いっぱい。
2012/01/31(火) 08:01:25.65じゃ MS-DOS を挙げよう。
UNIX系OS特有なんだし、少なくともPOSIXに準拠してなきゃ持ってないよ。
0256名無しさん@お腹いっぱい。
2012/01/31(火) 08:27:24.42お前ほんとにアホだなw
MS-DOS ではシェル(スクリプト)は使えない。
0257名無しさん@お腹いっぱい。
2012/01/31(火) 08:32:02.94もとの質問の >>249 read -s -n 1 < /dev/tty の readの -s -n オプションは
bash依存だが、/dev/ttyがOS依存なんて話は聞いたことがない。
テストスクリプトとして
----
#!/bin/sh
echo hoge > /dev/tty
----
があるとして、このスクリプトが「/dev/tty」が無いのが原因で動かないようなOSを
挙げてくれるかな。>>253 よ。まあ、無理だろうけどw
0258名無しさん@お腹いっぱい。
2012/01/31(火) 08:36:03.03>POSIXに準拠してなきゃ持ってないよ
/dev/ttyはPOSIX以前からあるよ
0259名無しさん@お腹いっぱい。
2012/01/31(火) 08:48:05.58もうほっとけ。
質問者の質問に自分では答えずに、
正しく回答した回答者に後から間違ったつっこみを入れる >>253 のようなアホは
いつの時代にも居るから。
0260名無しさん@お腹いっぱい。
2012/01/31(火) 09:28:37.540261名無しさん@お腹いっぱい。
2012/01/31(火) 09:39:19.39> /dev/ttyはどのOSでも移植性がある。
と言っちゃった>>253の負け。
0262名無しさん@お腹いっぱい。
2012/01/31(火) 10:03:34.610263名無しさん@お腹いっぱい。
2012/01/31(火) 10:05:33.600264名無しさん@お腹いっぱい。
2012/01/31(火) 10:09:49.20MS-DOS版の sh.exeでは /dev/tty動くぞ。sh.exe内部で解釈してるらしい。
0265名無しさん@お腹いっぱい。
2012/01/31(火) 12:57:13.51写真の同じやつ整理したくてこんなん書いたんだけど,
いかんせん遅い・・・
どうやったらもうちょっと早くなるかな?
0266名無しさん@お腹いっぱい。
2012/01/31(火) 13:33:07.43遅い原因は毎回md5sumを呼んでいるから
md5sum "$@"で求めておいて、その結果に対しての処理ならそれほど遅くない
アルゴリズムもcut -d' ' -f1してsortしてuniq -dして重複ファイルのMD5だけ列挙
そのMD5でgrepすればファイル名も分かるだろ
0267名無しさん@お腹いっぱい。
2012/01/31(火) 13:39:35.46ユニークなファイルのリスト
md5sum "$@" |sort -k 1 | uniq -w 32 |cut -d' ' -f 2
0268名無しさん@お腹いっぱい。
2012/01/31(火) 13:39:36.12何の検証もせず言ってみる
0269名無しさん@お腹いっぱい。
2012/01/31(火) 16:00:18.26md5sumコマンド起動のオーバーヘッドより、
MD5計算時間の方がはるかに長いから、
毎回md5sumを呼んでも、ファイル名引数まとめてmd5sumを呼んでも
ほとんど改善しないよw
それより、まずはファイルサイズだけ見て、
同じファイルサイズのファイルが他にない場合は無条件でユニークなファイルとして
md5sum計算対象から除外した方がよい。
0270名無しさん@お腹いっぱい。
2012/01/31(火) 16:06:28.42適当な位置で4KBくらい抜き出すのでもよさそうな
0271名無しさん@お腹いっぱい。
2012/01/31(火) 17:27:47.76そんなところで高速化図ったんじゃねーよ。
見当はずれの言いがかり付けるって惨めだぞ。w
0272名無しさん@お腹いっぱい。
2012/01/31(火) 17:43:31.60ソース読んでないだろwどのみちMac何だからそういう機能持ったアプリありそうだと思う。それ使った方がいい
0273名無しさん@お腹いっぱい。
2012/01/31(火) 18:01:40.880274名無しさん@お腹いっぱい。
2012/01/31(火) 19:11:12.350275名無しさん@お腹いっぱい。
2012/01/31(火) 19:29:02.960276名無しさん@お腹いっぱい。
2012/01/31(火) 20:30:08.94$ open -a /Application/TextEdit.app foo.txt
$ open -a /Application/Emacs.app/Contents/MacOS/Emacs foo.txt
こんなコマンド。
0277名無しさん@お腹いっぱい。
2012/01/31(火) 21:06:38.950278名無しさん@お腹いっぱい。
2012/01/31(火) 21:16:36.010279名無しさん@お腹いっぱい。
2012/02/01(水) 11:43:16.32open .
でカレントディレクトリをGUIで開かせるってのが一番使うかな
0280名無しさん@お腹いっぱい。
2012/02/01(水) 12:05:32.980281名無しさん@お腹いっぱい。
2012/02/01(水) 12:58:13.470282名無しさん@お腹いっぱい。
2012/02/01(水) 16:07:29.43さいしょから samefile なり samesame でよいのでは
0283265
2012/02/01(水) 17:06:16.13みんなありがとう!
こうかな?
0284265
2012/02/01(水) 17:09:15.950285名無しさん@お腹いっぱい。
2012/02/01(水) 18:13:12.63>>269は全然わかってないマヌケな素人だから、奴の指摘は全部無視していい。
サイズなんて調べる必要ない。
0286名無しさん@お腹いっぱい。
2012/02/01(水) 23:15:24.01man testを見てみると、以下の2つのオプションの説明があります。
1.-nオプションのところ
True if the length of string is nonzero.
2.stringオプションのところ
True if string is not the null string.
これらの違いは、何があるのでしょうか?それとも同じなのでしょうか?
出来ればサンプルスクリプトで説明していただけると助かります。
0287名無しさん@お腹いっぱい。
2012/02/02(木) 00:06:01.320288名無しさん@お腹いっぱい。
2012/02/02(木) 00:19:26.32直接引用しろ。うちでは等価って書いてある
0289名無しさん@お腹いっぱい。
2012/02/02(木) 01:32:54.28何シェルがいいですか。
0290名無しさん@お腹いっぱい。
2012/02/02(木) 01:40:36.62http://www.freebsd.org/cgi/man.cgi?query=test&apropos=0&sektion=0&manpath=FreeBSD+9.0-RELEASE&arch=default&format=html
-n string True if the length of string is nonzero.
string True if string is not the null string.
違い
test -n $nonexistent; $? <= バグ? test -z $nonexistent; $?と矛盾する
test $nonexistent; $?
0291名無しさん@お腹いっぱい。
2012/02/02(木) 03:44:03.15>>1
特記ない限り bourne shell ということは、それを選択すれば無難ということ。
Linux オンリーなら bash だろうけど。
0292名無しさん@お腹いっぱい。
2012/02/02(木) 06:26:43.33そんな貴方に、Windows Power Shell。
0293名無しさん@お腹いっぱい。
2012/02/02(木) 08:40:58.52なんだよ、矛盾するって。
0294名無しさん@お腹いっぱい。
2012/02/02(木) 08:59:55.630295名無しさん@お腹いっぱい。
2012/02/02(木) 09:17:20.91なんかUNIXのシェルより強力って書いてあるのが多いけどマジ?
0297名無しさん@お腹いっぱい。
2012/02/03(金) 10:31:06.580298名無しさん@お腹いっぱい。
2012/02/03(金) 20:58:42.500299名無しさん@お腹いっぱい。
2012/02/04(土) 08:30:04.97シェルそのものの機能は確かに強力だけど
肝心のコマンド資産がなさ過ぎて実用シェルとしてはなあ…
0300名無しさん@お腹いっぱい。
2012/02/04(土) 08:42:10.790301265
2012/02/04(土) 22:16:58.57最終的にこれで出来ました!
みなさんありがとうお(^ω^)
http://cl.ly/152U342e2o212b2B1q3j
0302名無しさん@お腹いっぱい。
2012/02/09(木) 07:27:17.71それを参考にシステムコールや動的ライブラリをロード・実行する機能を持ったシェルが作られたとしても
自分はあんまり使いたいと思わんな。そういう機能の需要と言うか必要性はあるのかどうか
0303名無しさん@お腹いっぱい。
2012/02/09(木) 14:49:30.97その手の機能が欲しいときはぶっちゃけLL使えばよくね、と俺は思ってしまう
それよりもシェルとしては以下の点がネックで、cmd.exeに比べてすら劣る
・デフォルトでスクリプトの実行が禁止されているので配布物でのスクリプト利用は
事実上不可能
・入力リダイレクトが使えない
・オブジェクトパイプラインという一見高機能なものを備えているが、代償として
バイナリデータをパイプやリダイレクトで扱えない
最後の問題が困る。外部コマンドをパイプでチェインする場合もPowerShellが
間に割って入って無駄にテキストに変換するので、データを壊すだけでなく
多分無駄に非効率でもある
XPではそれに加えて我慢がならないほど起動が遅かった(ngen使っても)ので
遊んでみようという気にすらならなかったけど
Windows7では起動時間は我慢できる範疇になったな
0304名無しさん@お腹いっぱい。
2012/02/09(木) 16:28:39.02だったらgdgd書かなきゃいい
>・デフォルトでスクリプトの実行が禁止されているので配布物でのスクリプト利用は
> 事実上不可能
うんこやん
0306名無しさん@お腹いっぱい。
2012/02/09(木) 22:51:58.68$ cat hoge
$GLOBALS['hoge']['huga']
$GLOBALShogehuga
とします。
$ grep $GLOBALS\[\'hoge\'\]\[\'huga\'\] hoge
とすると、どちらの行も引っかかってしまいます。
$GLOBALS['hoge']['huga']
だけ引っかけたいのですが、どうすればよいでしょうか、ご教示ください。
0307名無しさん@お腹いっぱい。
2012/02/09(木) 23:03:56.620308名無しさん@お腹いっぱい。
2012/02/09(木) 23:05:25.02¥$GLOBALS¥['hoge'¥]¥['huga'¥]
なので、これをシェル的にクォートする必要がある。
シングルクォートでがんばるなら
'¥$GLOBALS¥['¥''hoge'¥''¥]¥['¥''huga'¥''¥]'
正規表現として解釈されることを意図していないならfgrep使えば?
とか思ったりもする。
0309名無しさん@お腹いっぱい。
2012/02/09(木) 23:42:52.43$ grep -F "\$GLOBALS['hoge']['huga']" hoge
0310名無しさん@お腹いっぱい。
2012/02/10(金) 08:45:25.71すれ違いかもしれんが参考になった
(unix shell 人視点の評価として)
0311名無しさん@お腹いっぱい。
2012/02/10(金) 12:45:56.45すれ違いかもしれんが
> (unix shell 人視点の評価として)
こゆとき俺はこーかく
( unix shell 人視点の評価として )
0312名無しさん@お腹いっぱい。
2012/02/10(金) 13:15:55.88そう書くとunixから定義しないといけない
0313名無しさん@お腹いっぱい。
2012/02/10(金) 13:41:46.960314名無しさん@お腹いっぱい。
2012/02/10(金) 13:46:55.140315名無しさん@お腹いっぱい。
2012/02/10(金) 13:47:22.31grep の件、man もロクに読まない私にお力添えいただき、ありがとうございました。
m(__)m
0316名無しさん@お腹いっぱい。
2012/02/13(月) 21:53:21.26あるスクリプトをホームディレクトリに作ったのですが、以下の条件があります。
・他の人もそのスクリプトを実行できるようにしたい
・でもファイルの中身は他の人は見れないようにしたい。
このような場合、一般的にはどのような手法がとられるのでしょうか?
0317名無しさん@お腹いっぱい。
2012/02/13(月) 22:07:38.540318名無しさん@お腹いっぱい。
2012/02/13(月) 22:09:09.600319名無しさん@お腹いっぱい。
2012/02/13(月) 22:20:32.11中身はみられない。適当なシェルスクリプトを作って同じパーミッションにして
みたけど、実行したらPermission deniedsetuidになってしまった。 (OSXにて)
0320名無しさん@お腹いっぱい。
2012/02/13(月) 22:21:22.410321名無しさん@お腹いっぱい。
2012/02/14(火) 00:05:14.25そして、インタープリターは実行する人の権限で動作する。
したがって、スクリプトは実行する人が読むことができる。できなければ実行できない。
0322名無しさん@お腹いっぱい。
2012/02/14(火) 00:21:01.040323名無しさん@お腹いっぱい。
2012/02/14(火) 01:25:34.750324名無しさん@お腹いっぱい。
2012/02/14(火) 06:10:33.210325名無しさん@お腹いっぱい。
2012/02/14(火) 06:50:57.33ユーザーはスクリプトの実行は禁止ですが、
最近、ユーザーでも自分のホームフォルダーにスクリプトをコピーし、
X権限をすることによってスクリプトが実行できてしまうことが判明しました。
これはOSのセキュリティーボールではないのでしょうか?
ユーザーのフォルダーではたとえX権限がされていても
実行できないようにする方法はありますか?
必要ならカーネルにバッチを当てる方法も、やもうえません。
0326名無しさん@お腹いっぱい。
2012/02/14(火) 08:28:25.69> ユーザーはスクリプトの実行は禁止ですが、
なんか御幣のある言い方をしているようにも思えるが、つまりのところ特定コマンド
以外は実行させたくないんだろ?
であればログインスクリプトを制限がきつい奴にすれば出来る。
bash の rbash の項目の man page かググって調べろ。
.bashrc や .bash_profile などを個人で書き換えられないようにしておかないと意味が無かったりと
環境整備には手間がかかるとは思うが。
> ユーザーのフォルダーではたとえX権限がされていても
> 実行できないようにする方法はありますか?
以下を実行して↑に何の意味も無いことを学べ。
chmod 644 sample.sh
/bin/sh ./sample.sh
これ以上はスレチなのでここでの質問をクローズした上で、以上の情報を元に自分で調べるか
適切なスレに行って再質問されたし。
0327名無しさん@お腹いっぱい。
2012/02/14(火) 08:30:28.16かまっちゃいかんよ。
0328名無しさん@お腹いっぱい。
2012/02/14(火) 08:34:56.59http://toro.2ch.net/test/read.cgi/unix/1000022300/775-
0329名無しさん@お腹いっぱい。
2012/02/16(木) 01:53:58.030330名無しさん@お腹いっぱい。
2012/02/16(木) 02:11:23.480331名無しさん@お腹いっぱい。
2012/02/16(木) 03:11:31.800332名無しさん@お腹いっぱい。
2012/02/16(木) 15:25:59.880333名無しさん@お腹いっぱい。
2012/02/16(木) 15:26:22.530334名無しさん@お腹いっぱい。
2012/02/16(木) 15:38:01.31int main(){return system("シェルスクリプト本文");}
って書けばコンパイルできるよ。
C言語上での文字列改行を行なえば複数行も記述できる。
0335名無しさん@お腹いっぱい。
2012/02/16(木) 19:45:29.070336名無しさん@お腹いっぱい。
2012/02/19(日) 20:05:22.420337名無しさん@お腹いっぱい。
2012/02/19(日) 20:23:44.750338名無しさん@お腹いっぱい。
2012/02/19(日) 21:15:12.00これがヒントなんですか??
全然理解できへん(~_~;)
0339名無しさん@お腹いっぱい。
2012/02/19(日) 21:46:07.410340名無しさん@お腹いっぱい。
2012/02/20(月) 02:10:00.67全く理解できません。
しょっぱなにこれが有るんですが、
stty status '^T'
なんのためにあるのでしょうか?
rcファイルが読まれ始めるときは、^Cや^Hが設定されていないという事?
ですか?
さらに、
if [ -f /etc/rc.first ]
then
. /etc/rc.first
fi
という一文は
/etc/rc.firstが存在するならば、/etc/rc.firstを実行するという意味だと思うんですが、
-fオプションはググると
「file が普通のファイルならば真となる。」
とありましたが、普通ではないファイルって有るんでしょうか?
0341名無しさん@お腹いっぱい。
2012/02/20(月) 06:22:24.920342名無しさん@お腹いっぱい。
2012/02/20(月) 07:02:39.190343名無しさん@お腹いっぱい。
2012/02/20(月) 09:07:07.89UNIXではデータを書いたり読んだりするいわゆるファイルの他にも
OSが管理している資源やその他の物に名前をつけてファイルとして
扱うことができる。
デバイスファイルやディレクトリ、ソケット、シンボリックリンク、その他。
0344名無しさん@お腹いっぱい。
2012/02/20(月) 19:39:24.99「レギュラーファイル」でいいんじゃないかと思うが。
0345名無しさん@お腹いっぱい。
2012/02/20(月) 19:41:36.51「16進数のテキストデータ」はどこにあって、どういう形式なのか?
「バイナリ化」するとは具体的にどういうことか?
元の「16進数のテキストデータ」はバイナリではないのか?
Unicode文字のエスケープ表現か何かなのか?
0346名無しさん@お腹いっぱい。
2012/02/20(月) 20:17:11.46regular fileに対する確立された訳語は「通常ファイル」じゃないか。
0347名無しさん@お腹いっぱい。
2012/02/20(月) 20:39:01.78「FILEが通常、ファイルなら真になる」
通常はファイルならば真なんですね。通常じゃない時は真にならないんですか?
0348名無しさん@お腹いっぱい。
2012/02/20(月) 21:50:38.98test -f /etc/passwd && echo file || echo 'not file'
test -f /etc && echo file || echo 'not file'
0349名無しさん@お腹いっぱい。
2012/02/20(月) 22:05:43.260350名無しさん@お腹いっぱい。
2012/02/20(月) 22:38:49.99つまんねー。矢吹先生の方が数段上。
0351名無しさん@お腹いっぱい。
2012/02/22(水) 17:59:45.940352名無しさん@お腹いっぱい。
2012/02/22(水) 18:15:44.90デバイスファイルやソケット、FIFO等でも test -f は真になる。
よって、test -fをレギュラーファイルかどうかのテストに用いてはならない。
豆な。
0353名無しさん@お腹いっぱい。
2012/02/22(水) 18:24:10.830354名無しさん@お腹いっぱい。
2012/02/22(水) 20:22:31.070355名無しさん@お腹いっぱい。
2012/02/22(水) 21:02:05.15たとえばどのシェル?
0356名無しさん@お腹いっぱい。
2012/02/22(水) 21:09:08.260357名無しさん@お腹いっぱい。
2012/02/22(水) 21:16:49.10-e が追加されたのは割と最近。純正/bin/shのtestには-eがない。
0358名無しさん@お腹いっぱい。
2012/02/22(水) 22:36:40.15/bin/testとは別に /bin/sh の built-in コマンドがあるという主張?
0359名無しさん@お腹いっぱい。
2012/02/22(水) 22:41:11.670360名無しさん@お腹いっぱい。
2012/02/22(水) 23:01:26.59(ba|z)sh 辺りを /bin/sh として symlink/hardlink して使ってれば built-in だわな
ash ベースでもコンパイルの仕方によっては built-in になるし
0361名無しさん@お腹いっぱい。
2012/02/22(水) 23:40:20.000362名無しさん@お腹いっぱい。
2012/02/23(木) 00:25:07.780363340
2012/02/23(木) 00:58:08.13ところで
/etc/rcの先頭に
>stty status '^T'
が有るというのは、
rcスクリプトが読まれ始めるときは、sttyの設定がされてないので
rcスクリプトから実行されるプログラムの
ステータス情報をキーボードから^Tと入力すれば表示できるようにするため
に設定していると言う理解で良いでしょうか?
0364名無しさん@お腹いっぱい。
2012/02/23(木) 01:22:49.780365名無しさん@お腹いっぱい。
2012/02/23(木) 01:37:03.640366名無しさん@お腹いっぱい。
2012/02/23(木) 08:28:33.61デフォルトの設定がユーザを混乱させるからなんじゃないかな。
> ステータス情報をキーボードから^Tと入力すれば表示できるようにするため
多分違う、^Tを入力するとカーネルに対して、「何か」をしろという指令が非同期に飛んでいく。
カーネルはユーザーの端末に対してメッセージを出すことはしない。
「何か」が何なのかは、statusなんて機能は使ったことないから知らない。
0367名無しさん@お腹いっぱい。
2012/02/23(木) 10:49:16.920368名無しさん@お腹いっぱい。
2012/02/23(木) 11:56:49.03表示する方法、される内容はカーネル、端末依存。
0369名無しさん@お腹いっぱい。
2012/02/23(木) 12:09:58.01ああ、なるほど。googleでトップに来てる
http://freebsd.g.hatena.ne.jp/minus_zero/20070903
で実験して納得した。
rcの中でハングったりした時に、すかさずC-tするとどのプロセスが刺さってるかわかるんだな。
これはいい事を憶えた。
0370名無しさん@お腹いっぱい。
2012/02/24(金) 23:41:20.22foo.bar@example.com → foo****@example.com
ドメイン部分はそのままで、先頭3文字程度残して、残りの部分はメールアドレスの文字数が変わらないように
任意の文字で埋めたい。今は下のように変数にメールアドレスを入れて処理しているけど、ちょっと不恰好
MADR=foo.bar@example.com
MASK='*'
RC=3
DOM="${MADR##*@}"
let MC="${#MADR}"-"$RC"-"${#DOM}"-1
echo "$MADR"
echo "${MADR:0:$RC}`yes "$MASK" |tr -d '\n' |head -c"$MC"`@$DOM"
もう少し楽に処理できないでしょうか?
0371名無しさん@お腹いっぱい。
2012/02/25(土) 03:53:15.28echo foo.bar@example.com | ruby -pe '$_.sub!(/(?<=[^@]{3})[^@]*(?=@\w+)/){|s|"*"*s.size}'
perlならもっと短くできるんじゃないかなぁ。
0372名無しさん@お腹いっぱい。
2012/02/25(土) 04:08:45.24sedを使うのはいかが?
echo "user@example.com" | sed -e 's/\(...\).*@\(.*\)/\1...@\2/g'
ユーザ名が必ず3文字以上ならこれで良いはず。
ユーザ名が2文字以下だとそのまま出力される。
(元のスクリプトでも2文字以下ならそのままっぽいが。)
0373名無しさん@お腹いっぱい。
2012/02/25(土) 05:22:15.230374名無しさん@お腹いっぱい。
2012/02/25(土) 06:52:42.61あ、長さが変わらないように、か。
「長さが分からないように」と読み違えてた。すまん。
0375名無しさん@お腹いっぱい。
2012/02/25(土) 08:28:46.14不要なクォートや不要な変数も削除した。
↓
MADR=foo.bar@example.com
MASK=*
RC=3
DOM=${MADR##*@}
echo "$MADR"
echo "${MADR:0:$RC}"`echo "${MADR:$RC:${#MADR}-RC-${#DOM}-1}" | sed "s/./$MASK/g"`@"$DOM"
0376名無しさん@お腹いっぱい。
2012/02/25(土) 09:18:35.26> 大量のメールアドレスの一部分をマスクしたい。例えば
千通突っ込む気にならない。
0377名無しさん@お腹いっぱい。
2012/02/25(土) 09:27:28.61RC=3
MASK='*'
echo "$MADR" | awk -F@ -vn="$RC" -vm="$MASK" '{t=substr($1,n+1,length($1));gsub(".",m,t);print(substr($1,1,n) t "@" $2);}'
0378名無しさん@お腹いっぱい。
2012/02/25(土) 09:37:42.09標準入力から1行ずつ複数のメールアドレスを読む仕様。
gets()使うなとか、エラーチェックなしとかの突っ込みはなしな
#include <stdio.h>
#define RC 3
#define MASK '*'
int
main()
{
int i;
char buf[1024];
while (gets(buf) != NULL) {
for (i = RC; buf[i] != '@'; i++) {
buf[i] = MASK;
}
puts(buf);
}
return 0;
}
0379名無しさん@お腹いっぱい。
2012/02/25(土) 11:10:48.600380名無しさん@お腹いっぱい。
2012/02/25(土) 11:17:36.530381名無しさん@お腹いっぱい。
2012/02/25(土) 11:19:51.26>>370
>大量のメールアドレスの一部分をマスクしたい。
速度が重要という質問ですが・・
0382名無しさん@お腹いっぱい。
2012/02/25(土) 11:20:58.690383名無しさん@お腹いっぱい。
2012/02/25(土) 11:21:00.66量は多いけど時間は多少かかってもかまわないんでしょ。
0384名無しさん@お腹いっぱい。
2012/02/25(土) 11:22:45.37次の日の出社までに終わってればいい、なんてケースだと
7時間が4時間に短縮されてもあんまり意味ない。
0385名無しさん@お腹いっぱい。
2012/02/25(土) 11:52:15.99初めは>>372のように考え、どうしても長さが保存できないので何かやり方は無いかと質問しました
>>371,377
もっとさくっと書けるコマンドがあるかなと思っていたけど、やはりスクリプト言語使うしかないですか
それにしてもrubyは短く書けるんですね。今のシステムには入れていませんが勉強になります
>>375
なるほど。任意の長さの文字列を作るのにsedで置換を使う方法は思いつかなかった
それを元にすると最終的にこんな感じでしょうか?
MADR=foo.bar@example.com
MASK=*
RC=3
DOM=${MADR##*@}
MINV=${MADR:$RC:${#MADR}-RC-${#DOM}-1}
echo "$MADR"
echo "${MADR:0:$RC}${MINV//?/*}@$DOM"
これなら、外部のプログラムを呼び出さないのでそこそこ速そう
ただ、bashで動くことは確認したけど、汎用性を考えるとawkを使う>>377?
速度についてですが、何度も変換するものではないし、
寝ている間に終わればいいなと思っていたのでシェルスクリプトで十分でした
0386名無しさん@お腹いっぱい。
2012/02/25(土) 11:54:23.140387名無しさん@お腹いっぱい。
2012/02/26(日) 01:55:24.94ヽ('A`)ノ、スーパーちんぽマン参上!!
/ ( ) \
んヘヽヽ〜'
0388名無しさん@お腹いっぱい。
2012/02/26(日) 10:43:00.23# SIGQUIT (signal 3) and returns to single user after fsck.
trap : 2
trap : 3 # shouldn't be needed
という一文が有るのですが、
SIGINITとSIGQUITを無視(ignore)するならば
trap ' ' 2
trap ' ' 3
と言う書き方になるような気がするんですが、
:はどういう意味が有るのでしょうか?
0389名無しさん@お腹いっぱい。
2012/02/26(日) 10:55:51.64trap '' 2 は、
親(シェル自身)も子プロセス(外部コマンド)もSIGINTを無視する。
trap : 2 は、
親(シェル自身)はSIGINTを無視するが、子プロセス(外部コマンド)はデフォルト動作に戻
る。
あと、' ' じゃなくて '' (空文字列)な。
0390名無しさん@お腹いっぱい。
2012/02/26(日) 11:23:35.810391名無しさん@お腹いっぱい。
2012/02/26(日) 22:34:59.64>>390
:ってヌルコマンドって奴ですか?
そうすると、
親(シェル自身)はSIGINTを無視するが、子プロセス(外部コマンド)はデフォルト動作に戻る
という解釈どうして出てくるかさっぱりなので、教えてください
お願いします
0392名無しさん@お腹いっぱい。
2012/02/27(月) 01:17:55.060393名無しさん@お腹いっぱい。
2012/02/27(月) 07:26:12.43そのシグナルを無視し、子プロセスも無視するとは書かれているけど、
これだけだとわかりにくいかも。
trapで何らかのコマンドを指定すると、それはシグナルハンドラが設定されるので、
シグナルの一般仕様により、シグナルハンドラが設定されている場合の子プロセスでは
シグナル設定はデフォルトに戻る。
よって、ダミーのシグナルハンドラを設定するために、: コマンドを指定している。
0394名無しさん@お腹いっぱい。
2012/02/27(月) 13:56:39.45何が間違っているのでしょうか?
BEGIN{x = 0}
printf("%d\n",x++)
END{x=0 }
0395名無しさん@お腹いっぱい。
2012/02/27(月) 14:04:05.230396名無しさん@お腹いっぱい。
2012/02/27(月) 14:11:30.36BEGIN{}等は使わない
↓
#!/bin/awk -f
FNR==1{x=0}
{printf("%d?n",x++)}
0397名無しさん@お腹いっぱい。
2012/02/27(月) 15:17:34.24":"がnull commandなのは先頭語に出てきた場合だけ。
trapが第一引数の":"をどう解釈しようと自由。
ただnull commandからの類推で「無視するが〜」としただけ。
0398名無しさん@お腹いっぱい。
2012/02/27(月) 15:22:42.53ちがうよ。
trapは、第1引数を改めてコマンドとして解釈する(2回解釈する)ので、
結局 : は先頭に出てきたのと同じで、null command として解釈される。
(eval : の場合と似てる)
trapが:を特別に解釈しているわけではない。
たとえば、trap true 2 って書いても trap : 2 と同じ。
0399名無しさん@お腹いっぱい。
2012/02/27(月) 15:54:02.25これでSIG_IGNにすることになってる。
0400名無しさん@お腹いっぱい。
2012/02/27(月) 23:12:06.60while read hoge hage ; do
:
done <file
とかよくやるけど、1行の文字列を分割しようとして
echo "hoge hage" | read hoge hage
ってやってみても、$hoge にも $hage にも何も入らない
なんで?
0401名無しさん@お腹いっぱい。
2012/02/27(月) 23:28:41.940402名無しさん@お腹いっぱい。
2012/02/27(月) 23:29:53.910403名無しさん@お腹いっぱい。
2012/02/27(月) 23:31:57.84read hoge hage
echo hoge=$hoge hage=$hage
}
0404名無しさん@お腹いっぱい。
2012/02/27(月) 23:36:20.13おおー入った! \(@o@)/
どういう仕様になってるんだろう
サブシェル的な問題?
0405名無しさん@お腹いっぱい。
2012/02/28(火) 08:06:57.00その通りだが、そうならないシェルもある。自分なら read hoge hage <<<"hoge hage" って書く
0406名無しさん@お腹いっぱい。
2012/02/28(火) 10:45:26.990407名無しさん@お腹いっぱい。
2012/02/28(火) 11:12:25.510408名無しさん@お腹いっぱい。
2012/02/28(火) 18:54:44.50リナックスのkshは冷やすとリング使える不思議
0409400
2012/02/28(火) 22:39:16.48オイラの読んだ入門書には載ってなかったんだよなぁ
と思いながら試してみたら
Syntax error: redirection unexpected
sh -> dash なうちのDebianじゃダメみたい (・ω・` )
ステキな機能だけに残念
やっぱこういう場合はset使うべきなんですかね…
0410名無しさん@お腹いっぱい。
2012/02/28(火) 22:52:20.02一行で書きたいならセミコロン
echo hoge hage | { read hoge hage; echo hoge=$hoge hage=$hage; }
0411名無しさん@お腹いっぱい。
2012/02/29(水) 02:06:19.12xxx.sh -a test -yx
#!/bin/ksh
while getopts a:yx opt
do
case ${opt} in
a)
YY=${OPTARG}
echo "オプション[-a]の引数は${YY}だよ。"
;;
yx)
echo "オプション[-yx]があるよ。"
;;
esac
done
0412名無しさん@お腹いっぱい。
2012/02/29(水) 08:15:39.53getoptsでは、-yx は -y -x と指定したのと同じに解釈されるから無理。
0413名無しさん@お腹いっぱい。
2012/02/29(水) 10:48:10.110414名無しさん@お腹いっぱい。
2012/02/29(水) 10:50:38.33すみませんが詳しい方のみ回答をお願いします
0415名無しさん@お腹いっぱい。
2012/02/29(水) 10:54:40.480416名無しさん@お腹いっぱい。
2012/02/29(水) 11:34:25.80-y x も受けつけちゃうけど。
0417名無しさん@お腹いっぱい。
2012/02/29(水) 14:08:24.59list=`cat ./file | grep aaa`
って感じでlistにaaaを持つ行を全部放り込んでるのですが、
これらを別々の1行ずつに分割して
なおかつlistを配列にして格納する事はできますか。
具体的には、fileの中にはaaaの文字列を持つ行が5つあるのですが
それをlist[0]〜list[4]に格納したいのです。
よろしくご指導お願いしますm(_ _)m
0418名無しさん@お腹いっぱい。
2012/02/29(水) 14:10:31.36grep aaa file でよくね?
0419名無しさん@お腹いっぱい。
2012/02/29(水) 15:35:13.71IFSに改行コードのみを代入した状態で、list配列に一括代入する文法を使う。
#!/bin/bash
IFS='
'
list=(`grep aaa file`)
0420名無しさん@お腹いっぱい。
2012/02/29(水) 16:42:01.73ありがとうございます!
できました!
0421400
2012/02/29(水) 23:33:48.87>>410
パイプ通すとブレースもサブシェルで動作してるのか
外からは参照できないみたいなんですよね
いやもちろん最初の例もサブシェル作ってるんですが (;´Д`)
処理の内容にもよるけど、やっぱりグローバルで使いたいってなると
関数に括り出してバッククォートで呼んだりして結局同じようなことなのかなぁと
そんな感じの意味です
でも勉強になりましたみなさんありがとう
0422名無しさん@お腹いっぱい。
2012/03/01(木) 06:47:03.28getopt(外部コマンド)はスペース入りファイル名などの引数を正常に扱えない
などの仕様バグの固まり。getoptsを使うべし。
0423名無しさん@お腹いっぱい。
2012/03/05(月) 08:04:37.31#define HOGE MAGE
HOGE の定義値を抽出したい。
grep HOGE header.h |grep define |awk print $NF
みたいな書き方(うろ覚え)すると
キャリッジリターンも拾うわ、
タブ(スペース)数でフィールド変わるわなんですが
うまい方法ないですか?
0424名無しさん@お腹いっぱい。
2012/03/05(月) 08:12:54.29$ cat header.h
#define HOGE MAGE
$ (cat header.h; echo HOGE) | gcc -E -P -
MAGE
0425名無しさん@お腹いっぱい。
2012/03/05(月) 08:25:52.140426名無しさん@お腹いっぱい。
2012/03/05(月) 09:38:08.860427名無しさん@お腹いっぱい。
2012/03/05(月) 10:17:08.260428名無しさん@お腹いっぱい。
2012/03/05(月) 12:00:16.07けどお題はもっと単純な話なんじゃないのかな。
マクロの展開を止めたいなら、
(#define MAGE 〜があってもMAGEを出力したい場合)
awkスクリプトになってしまったが、こんな感じ。
awk '$0 ~ /^#define[ ]+HOGE/ { $1=""; $2=""; print $0 }'
[]の中はスペースとタブ
0429名無しさん@お腹いっぱい。
2012/03/05(月) 22:50:17.04あるディレクトリにある全部のファイルに対して
コンパイルをかけるスクリプトをつくりたいです。
TESTLISTには
ソース名 コンパイラオプション
が書いてあります(hoge.c 5みたいに)
---------------------------------------------
#!/bin/sh
# プログラム、コンパイルオプション一覧リストを指定
LIST=/home/shell/TESTLIST
# コンパイラのパスを設定
CCOM=/home/shell/cc.sh
# コンパイルをかける
while read ARG1 ARG2
do
${CCOM} ${ARG1} ${ARG2}
done < ${LIST}
--------------------------------------------
のような簡単な奴で良いんですが、
0430名無しさん@お腹いっぱい。
2012/03/05(月) 22:51:02.05cc.shの中に、
--------------------------------------------
if [ ${RETCD} -ne 0 ]
then
echo "コンパイルログを表示しますか?"
RCV=""
while [ `echo "${RCV}" | sed -ne '/^[ ]*[yYNn][ ]*$/p' | wc -l` -eq 0 ]
do
read RCV
done
if [ `echo "${RCV}" | sed -ne '/^[ ]*[yY][ ]*$/p' | wc -l` -ne 0 ]
then
more ${コンパイルログ}
fi
fi
-------------------------------------------
のように書いてあり、コンパイルに失敗した場合、
「コンパイルログを表示しますか?」が端末に表示されたままで、「N」や「Y」を
入力しても反応がなく、Ctr-Cで実行を打ち切っている状態です。
0431名無しさん@お腹いっぱい。
2012/03/05(月) 22:52:03.41コンパイルに失敗した場合、Ctr-Cを入力すると
次のファイルにコンパイルをかけるようにしたいのですが、
--------------------------------------------
#!/bin/sh
# プログラム、コンパイルオプション一覧リストを指定
LIST=/home/shell/TESTLIST
# コンパイラのパスを設定
CCOM=/home/shell/cc.sh
# Ctr-Cを無視するように設定(サブシェルには有効)
trap : 2
# コンパイルをかける
while read ARG1 ARG2
do
#サブシェル化
(${CCOM} ${ARG1} ${ARG2})
done < ${LIST}
---------------------------------------------
でオッケーでしょうか?
ちなみにMakeは使用不可です。また、cc.shはいじれません。
0432名無しさん@お腹いっぱい。
2012/03/06(火) 11:06:00.37この状況を何とかした方が建設的かと。
0433名無しさん@お腹いっぱい。
2012/03/06(火) 19:10:20.96> でオッケーでしょうか?
つまり俺たちにデバッグしろと言っているのか?
0434名無しさん@お腹いっぱい。
2012/03/06(火) 19:12:06.020435名無しさん@お腹いっぱい。
2012/03/06(火) 19:19:26.970436名無しさん@お腹いっぱい。
2012/03/06(火) 19:21:31.590437名無しさん@お腹いっぱい。
2012/03/06(火) 20:23:39.440438名無しさん@お腹いっぱい。
2012/03/06(火) 21:07:07.27コンパイルに失敗した場合、「N」や「Y」を入力しても反応がない原因を
教えてやる。
>>429 の while do .. done ループで、done < ${LIST} となってるので、
標準入力が ${LIST} にリダイレクトされたままになってて、
その状態で cc.sh が起動されてる。
cc.shの中でキーボードを読んでるつもりが、${LIST}を読んでしまうので、
「N」や「Y」を入力しても反応しない。
解決方法は、>>429 で、
----------------------------
exec 3< ${LIST}
while read ARG1 ARG2
do
${CCOM} ${ARG1} ${ARG2}
done 0<&3
----------------------------
とすること。標準入力をキーボードにしたまま、readには記述子3を読ませる。
0439名無しさん@お腹いっぱい。
2012/03/06(火) 21:12:06.05おいおい、そのリダイレクト方法だと結局同じ理由で駄目だよ。
標準入力を退避しておいて復帰する。
exec 3<&0
while read ARG1 ARG2
do
${CCOM} ${ARG1} ${ARG2} 0<&3
done < ${LIST}
0440名無しさん@お腹いっぱい。
2012/03/06(火) 21:17:04.64>>438 が言いたかったのは
↓じゃないかな
exec 3< ${LIST}
while read ARG1 ARG2 0<&3
do
${CCOM} ${ARG1} ${ARG2}
done
0441名無しさん@お腹いっぱい。
2012/03/06(火) 22:15:57.04> でオッケーでしょうか?
オッケーだと言う人がいたらしいよ。
ただし私は、貴方の環境と責任を共有していないので、自己責任でやって下さいね。
0442名無しさん@お腹いっぱい。
2012/03/07(水) 00:36:49.85探しています。OSはCentOS6、シェルはbashです
以下のような問題に対処したいのですが、何か手段はありますでしょうか?
以下のsampletext.txt(「\\」や「\」を含む)を、readecho.shのようにreadで読み、
echoで出力すると、「\」がエスケープか何かされているようで、表示されません
bashやechoのmanにある-Eオプションを明示的に付与してみても変化が無いようです
awkprint.shのようにawkで行うと期待した結果が出るのですが、他の処理の関係上、
できればawkは使わずに、シェルスクリプトで実現させる方法を知りたく思ってます
テキストを事前に「\\」から「\\\\」としておく等の対処はせずに済ませたいです
$ cat sampletext.txt
\\winsv\a\b\c
\\sambasv\d\e\f
$ cat readecho.sh
#! /bin/sh
while read STRING
do
echo -E "${STRING}"
done < sampletext.txt
$ ./readecho.sh
\winsvabc
\sambasvdef ←「\\」が「\」になり、「\」が消えている。NG
$ cat awkprint.sh
#! /bin/sh
cat sampletext.txt | awk '{print $0}'
$ ./awkprint.sh
\\winsv\a\b\c
\\sambasv\d\e\f ←上記のような問題はない。OK
0443名無しさん@お腹いっぱい。
2012/03/07(水) 00:42:21.68read -r
0444名無しさん@お腹いっぱい。
2012/03/07(水) 00:42:48.660445名無しさん@お腹いっぱい。
2012/03/07(水) 00:45:02.830446名無しさん@お腹いっぱい。
2012/03/07(水) 00:48:20.73情報ありがとうございました
うまくいきました
bashでもreadは「Backslash does not act as an escape character.」だそうです
なるほどreadで対処するのか...
$ cat readecho.sh
#! /bin/sh
while read -r STRING
do
echo -E ${STRING}
done < sampletext.txt
$ ./readecho.sh
\\winsv\a\b\c
\\sambasv\d\e\f
0447名無しさん@お腹いっぱい。
2012/03/07(水) 00:55:51.24> bashでもread -rは「Backslash does not act as an escape character.」だそうです
と書きたかったのか?
0448名無しさん@お腹いっぱい。
2012/03/09(金) 22:27:14.08Aを開始、
Bを開始
Bの中でAの処理中を待つことできますか?
意味わかりませんかね・・・
mkdirとかロック待ちみたいなやつです。
0449名無しさん@お腹いっぱい。
2012/03/09(金) 22:43:33.00while 文で無限ループ作って、sleep でも挟めば十分「処理待ち」になると思うけど。
0450名無しさん@お腹いっぱい。
2012/03/09(金) 22:44:29.80FreeBSDなら lockf(1)、Linuxならflock(1)を使ってなんとかしろ。
0451名無しさん@お腹いっぱい。
2012/03/09(金) 23:06:08.54ありがとうございます。
がんばってみます。
0452名無しさん@お腹いっぱい。
2012/03/09(金) 23:18:55.14なんで似てるようで違う名前なの?
0453名無しさん@お腹いっぱい。
2012/03/10(土) 00:14:30.880454名無しさん@お腹いっぱい。
2012/03/10(土) 09:50:04.490455名無しさん@お腹いっぱい。
2012/03/11(日) 03:13:24.48for FILE in `find / \( -iname "zoo*.png" -o -iname "land*.png" -o -iname "zoo*.txt -o -iname "land*.txt" \)`; do
rm -vf $FILE
echo $a
done
初心者です、スクリプト書いてみたんですが、この$aで表示される数がおかしくてこまってます。
なぜかrmコマンドでは1つも削除されておらずメッセージも表示されていないのに4と表示されるのです。
やりたい事としてはこうです↓
「zoo*.png、land*.png、zoo*.txt、land*.txtというファイル名のファイルを全て削除し、その数をカウントする」
何がおかしいのでしょうか?
0456名無しさん@お腹いっぱい。
2012/03/11(日) 04:32:12.074が表示されるのはオカルト。君もうすぐ死ぬんじゃない?
ファイルを削除して数をカウントしたいだけなら
find ほにゃらら -print0 | xargs -0 rm -v | wc -l
でよい。変数もforも必要ない。
4が出るのは君がオリジナルのスクリプトをここにコピペするときに何か端折ったせいだろう。
0457名無しさん@お腹いっぱい。
2012/03/11(日) 04:53:51.30ごめんなさい、a=$(($a + 1))が抜けてました...
にしてもこんなにコンパクトになるもんなんですね
ありがとうございました
0458名無しさん@お腹いっぱい。
2012/03/11(日) 08:05:01.28find ほにゃらら -exec rm -v {} + | wc -l
で良い。
0459名無しさん@お腹いっぱい。
2012/03/11(日) 08:11:05.46find ほにゃらら -delete -print | wc -l
0460名無しさん@お腹いっぱい。
2012/03/11(日) 08:14:18.54-exec の方が古い感覚だけどどうなんだろ?
0461名無しさん@お腹いっぱい。
2012/03/11(日) 08:17:25.43-exec ';' なら古い感覚
-exec + は新しい感覚
0462460
2012/03/11(日) 08:29:08.31+ はいま使っているマシンの中では使えない物がほとんどかも。
-exec は元々 Unix に魅せられたポイントなので、1989 年には使ってた。
xargs はネットで教えてもらって 1995 年頃から使い始めた。
けど確か元からあったかも。
0463名無しさん@お腹いっぱい。
2012/03/11(日) 08:32:05.19-exec + はSolarisでさえ使えるのに、どんな古いOS使ってるんだよ?
0464名無しさん@お腹いっぱい。
2012/03/11(日) 08:54:41.56使えないのを探す方が難しいよね。
原始人と言われたからってムキになってウソを教えるのは良くないな。
http://www.pasc.org/interps/unofficial/db/p1003.2/pasc-1003.2-210.html
| One of these extensions, which I believe is supported at least on all
| systems derived from SVR4 and on HP-UX (although in some cases it is an
| undocumented feature), is a variant of the "find -exec" primary where
| "find" does argument aggregation internally:
|
| find . -type f -exec some_command {} +
0465名無しさん@お腹いっぱい。
2012/03/11(日) 09:52:56.43確かテンプレではfind -print0 | xargs -0推奨で、スレ内議論では-exec +を使えと主張する人がいた。
0466名無しさん@お腹いっぱい。
2012/03/11(日) 10:09:06.10られていたから。質問者のためではなく回答者のためのテンプレ。
-exec {} + 構文が紹介されてからはxargsを使う意味がなくなったのか削除された。
それでもしばらくは-exec {} + を知らない原始人がいたけど、そのたびに原始人と
呼ばれて、絶滅していった。テンプレから削除されたのはこの時点(絶滅後)かも。
-exec {} + ですべてが置き換え可能とは言わないが、find+xargsが必要になること
は極めてまれ。
0467名無しさん@お腹いっぱい。
2012/03/11(日) 10:32:32.19あと、パイプで繋がってしまっているrmを画面にも出力する方法ってないんでしょうか?
0468460
2012/03/11(日) 10:44:50.32-exec は fork するから良くないと言われてた。
+ は SVR4 に入っているのなら俺のもだいたい動くね。
でも俺まだ Tower の SVR2 や SVR3 とも格闘してるから。
ファイル名の長さが 14 文字までのやつ。
0469名無しさん@お腹いっぱい。
2012/03/11(日) 10:44:55.572つの違い
-print0や xargs -0は使えないOSがある。
>パイプで繋がってしまっているrmを画面にも
tee
0470名無しさん@お腹いっぱい。
2012/03/11(日) 10:55:09.821 find -exec \; 構文ではファイル一つ毎に別プロセスが起動されるので効率が悪い。
2 そこでまとめて処理できるようxargsが作られた。初出はPWBだからかなり古い
find -print | xargs
3 ファイル名に改行入れられるとヤバいので-print0, -0が設けられた
find -print0 |xargs -0
4 そんな面倒な事しなくて済むように-exec {} + 構文が作られた
-exec \; 構文と違い、別プロセスは(MAX_ARGSを考慮して)まとめて実行される。
> あと、パイプで繋がってしまっているrmを画面にも出力する方法ってないんでしょうか?
find ほにゃらら -delete -print |tee /dev/tty| wc -l
find ほにゃらら -exec rm -v {} + |tee /dev/tty| wc -l
0471名無しさん@お腹いっぱい。
2012/03/11(日) 10:56:05.20例えば?
どっちも相当昔からある気がするけど
0472名無しさん@お腹いっぱい。
2012/03/11(日) 10:58:21.95ちょっとは自分で調べろよ。Solarisで-print0等が使えないのは常識。
0474名無しさん@お腹いっぱい。
2012/03/11(日) 11:06:35.90相当昔といえば言えなくはないが。
http://www.freebsd.org/cgi/man.cgi?query=xargs&apropos=0&sektion=0&manpath=FreeBSD+2.1.5-RELEASE&arch=default&format=html
http://www.freebsd.org/cgi/man.cgi?query=xargs&apropos=0&sektion=0&manpath=FreeBSD+2.1.6.1-RELEASE&arch=default&format=html
0475名無しさん@お腹いっぱい。
2012/03/11(日) 11:22:05.200476名無しさん@お腹いっぱい。
2012/03/11(日) 11:29:54.60SVR[23]のような骨董環境前提の回答なんか意味ない。
0477名無しさん@お腹いっぱい。
2012/03/11(日) 11:38:38.97自分はタイプ数の多いxargsは使わないけどね。
無用な-exec \;と-0無しのxargsさえ避ければ良い。
そもそも今回は-deleteが使えるならxargsも-exec +も要らないし。
0478名無しさん@お腹いっぱい。
2012/03/11(日) 11:42:53.84だから、使える方法を使えばいいってことでしょ?
結論見えてないの?
0479名無しさん@お腹いっぱい。
2012/03/11(日) 11:51:09.25できました!!ありがとうございましたm(_ _)m
0480名無しさん@お腹いっぱい。
2012/03/11(日) 15:05:46.64> 3 ファイル名に改行入れられるとヤバいので-print0, -0が設けられた
改行というか、広い意味での空白($IFS)だな。
0481名無しさん@お腹いっぱい。
2012/03/11(日) 15:27:32.53シングルクォート/ダブルクォートも解釈しちゃうという問題がある。
it_don't_mean_a_thing.mp3
とかのファイル名もそのまま通らない
0482名無しさん@お腹いっぱい。
2012/03/11(日) 20:30:34.37コロン(:)が含まれてるファイル名なんか最悪。。
FILES = $(wildcard *.mp3)
$ make hoge
Makefile:〓: *** multiple target patterns. Stop.
0483名無しさん@お腹いっぱい。
2012/03/11(日) 22:43:26.33基本的な歴史としては>>470の通りなんだが
現代においてはfindで引っかるファイル数が数十万〜数百万ということも珍しくなくなった
そしてそのような場合{} +では処理できない、というか渡された先が悲鳴を上げる
だから 5. としてxargsを-n付きで使うようになったわけ
>>481みたいな問題にもちゃんと解法はある、つーかググレカス
ゆえに{} +はファイルを渡す先が確実に処理できると確信できる場合だけ使うべきで
癖をつけるなら-print0 | xargs -0の流れが正しい
何か問題が起きてもxrgsにオプション足すだけで解決する
つーか、初期の頃はちゃんとそう説明する奴が居たはずだけどな…
0484名無しさん@お腹いっぱい。
2012/03/11(日) 23:15:55.26> 現代においてはfindで引っかるファイル数が数十万〜数百万ということも珍しくなくなった
> そしてそのような場合{} +では処理できない、というか渡された先が悲鳴を上げる
<limit.h>に従った正しいプログラムなら何の問題もないです。
> だから 5. としてxargsを-n付きで使うようになったわけ
これはあほなプログラム向けです。
0485名無しさん@お腹いっぱい。
2012/03/11(日) 23:18:50.93引数の個数に制限がある場合にはxargs -nも有効だが、そんなヘナチョコ
コマンド出会ったことない、具体的には何?
0486名無しさん@お腹いっぱい。
2012/03/11(日) 23:24:03.91その根拠は何?
http://pubs.opengroup.org/onlinepubs/009604599/utilities/find.html
> The size of any set of two or more pathnames shall be limited
> such that execution of the utility does not cause the system's {ARG_MAX}
> limit to be exceeded.
>>484
あほなプログラムの実例
http://savannah.gnu.org/bugs/?func=detailitem&item_id=16738
0487名無しさん@お腹いっぱい。
2012/03/11(日) 23:37:58.77バグがあるので -exec {} + はやめたほうがいいということになるのかな
0488名無しさん@お腹いっぱい。
2012/03/12(月) 07:42:10.36もっとも、>>483がその区別をつけられないだけかも知れないが。
0489名無しさん@お腹いっぱい。
2012/03/12(月) 17:53:31.98・悲鳴あげるヘナチョココマンドの存在は不明
・>>481のようなケースも-print0, -0で対処できるている。
0490名無しさん@お腹いっぱい。
2012/03/12(月) 18:00:08.91>>481 はそういうことを言ってるんじゃない。
>>480 が $IFSだけが問題と言っているのでは誤解を生じるので、
それだけじゃなくクォートも、と言う話。
0491名無しさん@お腹いっぱい。
2012/03/12(月) 18:05:46.84ボケ老人のタワゴトとは>>483の↓この発言。>>481の指摘は正しい。
> >>481みたいな問題にもちゃんと解法はある、つーかググレカス
0492名無しさん@お腹いっぱい。
2012/03/12(月) 18:22:03.41> 何か問題が起きてもxrgsにオプション足すだけで解決する
こっちのほうが問題では。
0493名無しさん@お腹いっぱい。
2012/03/12(月) 18:28:41.55他のfindは使ってないので知らないが。
0494名無しさん@お腹いっぱい。
2012/03/12(月) 18:29:11.30許されているいかなる文字もこれで対応でしょ。
> 何か問題が起きてもxrgsにオプション足すだけで解決する
その問題とは? >>483のボケた脳内にある悲鳴あげるコマンド
しかないのですよ。
0495名無しさん@お腹いっぱい。
2012/03/12(月) 19:10:17.940496名無しさん@お腹いっぱい。
2012/03/12(月) 19:15:52.590497名無しさん@お腹いっぱい。
2012/03/12(月) 22:17:38.36ちったぁ議論らしいことをしたいなら、前提について定義しろよ
お前ら何のOSの事を想定してんだ?Solarisか?AIXか?386BSDか?バージョンは?え?
使ってるコマンドはどこの物だ?OSについてきたコマンドか?GNUのやつか?バージョンは?え?
そこが全然明確じゃないから、いっつもいっつもループしてんのか前に進んでんだか
前にも進んでないんだか分からねえグダグダ展開になってんじゃねえか
お前らの脳内それぞれで、前提狂った状態で、全然違うOSの事で話をしてたって、
意味も価値も実りある結論も、何もありゃしねえんだよ
お前らって、本当、どうしようもないバカだよな
find . -print0 | xargs -0 -I{} mv -vb {} ../tmp
とかした時って同名なのにバックアップ取られないファイルがあったんだけど、-exec +ならちゃんとバックアップされる?
0499名無しさん@お腹いっぱい。
2012/03/12(月) 22:24:10.73バカからも得られるものはあるものさ
バカってのはこういう事を考えてるんだ、こんな風に誤解してるんだ、その程度しか知らないんだ、
じゃあ分かってない人はその辺が分かっていないのかもしれないから、ちょっと注意しよう
そんな目線での考察や気づきは、やっぱりバカからしか得られないものなのさ
0500名無しさん@お腹いっぱい。
2012/03/12(月) 22:33:58.200501名無しさん@お腹いっぱい。
2012/03/12(月) 22:37:33.62find、xargs、mvの仕様、及びファイル名の状態(空白含んでるとか、日本語ファイル名だとか)次第
どんな名前のファイルがこようがこれなら何でもOKという万能包丁は、ぶっちゃけ無い
FAQにも割とマジで"Use Samba and explorer.exe"ともある
0502名無しさん@お腹いっぱい。
2012/03/12(月) 23:04:49.76ジョブ番号とPIDが表示されるじゃないですか。
あれって表示させなくする方法ってあるんでしょうか?
時間のかかる処理をバックグラウンドで走らせて
その間に別の処理をやって、waitで同期する、
みたいなことをやるスクリプトで、邪魔なんですよね。
0503名無しさん@お腹いっぱい。
2012/03/12(月) 23:08:46.69両方使えば?っていう初心者の意見です
0504名無しさん@お腹いっぱい。
2012/03/12(月) 23:19:19.45スクリプト実行しているシェルは何?
0505名無しさん@お腹いっぱい。
2012/03/12(月) 23:21:09.67Solarisです。
0506名無しさん@お腹いっぱい。
2012/03/12(月) 23:30:30.20shは出ない
0507名無しさん@お腹いっぱい。
2012/03/12(月) 23:46:04.45>>1
0508名無しさん@お腹いっぱい。
2012/03/12(月) 23:46:40.54やってみればわかるよ
0509265
2012/03/13(火) 00:27:03.89find . -exec cp -vb ../tmp +
find: -exec: no terminating ";" or "+"
だって・・・
0510265
2012/03/13(火) 00:27:31.16find . -exec cp -vb {} ../tmp +
0511名無しさん@お腹いっぱい。
2012/03/13(火) 04:25:42.37Windows でファイルを処理しきれなかった時ばかりなので
Unix 上のコマンドじゃなく
Windows ネイティブな UNIX-Like tools が
完璧なファイル名対応出来ればいいんだけどな。
Unix 上ではそんなファイル作らない。
0512名無しさん@お腹いっぱい。
2012/03/13(火) 10:06:48.400513名無しさん@お腹いっぱい。
2012/03/13(火) 10:12:13.36> Windows でファイルを処理しきれなかった時ばかりなので
違うよ。root権限で動作するスクリプトが毒食わせられないための用心。
0514名無しさん@お腹いっぱい。
2012/03/13(火) 10:38:44.75移植性が必要ならシェルスクリプトなんて使わないよ
0515名無しさん@お腹いっぱい。
2012/03/13(火) 12:31:59.14それ以上気を遣いたいんなら、単にLL使えばよくね
Perlなら昔から標準でfind2perlとかついてくるし
0516名無しさん@お腹いっぱい。
2012/03/13(火) 23:03:21.13まぁ考え方っつっても、それは別にシェルスクリプトでしか習得できない考え方ではないけれど
0517名無しさん@お腹いっぱい。
2012/03/13(火) 23:19:15.020518名無しさん@お腹いっぱい。
2012/03/13(火) 23:27:28.51シェルスクリプト的に本末転倒なことなのさ
0519名無しさん@お腹いっぱい。
2012/03/13(火) 23:30:41.170520名無しさん@お腹いっぱい。
2012/03/13(火) 23:50:33.10だから(個人的には)シェルスクリプト GREAT! だね。
0521名無しさん@お腹いっぱい。
2012/03/14(水) 03:14:56.05cp a.txt b.txt
というシェルスクリプトが書かれた『hoge.sh』をダブルクリックで実行した場合、
普通はなんの反応もなく、コピーが実行されます。
これを、実行されたコマンドを端末に表示させることはできるでしょうか?
はじめから端末内で
bash hoge.sh
とすればいいのですが、深い階層にあって面倒なので…。
それに、この場合も何のコマンドが実行されたのかが分かりません。
0522名無しさん@お腹いっぱい。
2012/03/14(水) 06:51:12.07hoge.shに以下のように書いておく。
xterm -e sh -xc 'cp a.txt b.txt; set +x; echo -n Hit any KEY:; read key'
0523名無しさん@お腹いっぱい。
2012/03/14(水) 12:25:04.10ありがとうございました m(_ _)m
0524名無しさん@お腹いっぱい。
2012/03/14(水) 23:14:00.92-Tで渡すファイル名をソートする意味ってあるかな?
0525名無しさん@お腹いっぱい。
2012/03/15(木) 18:42:17.16遅いテープに書き込むときに、早めに参照したいファイルをアーカイブの先頭付近に書いておくと
早めに展開される
そんな特性があるので、その特性を活かすためにアーカイブするファイルの順序を指定することは、
意味がある
わざわざソートして渡してるなら、その特性を理解してないだろうから、意味ないだろう
0526名無しさん@お腹いっぱい。
2012/03/15(木) 21:04:05.76────────────────────────────────────
不定個数の整数の引数を与えて実行すると,それらの整数のGCMとLCMを計算して
表示するようなシェルスクリプトを作成せよ.使用シェルは/bin/shとする.
【実行例】
$ ./kadai15.sh 12 20 24
GCM = 4
LCM = 120
────────────────────────────────────
0527名無しさん@お腹いっぱい。
2012/03/15(木) 21:51:58.410528名無しさん@お腹いっぱい。
2012/03/15(木) 22:02:52.24gcmは最大公倍数? w
0529名無しさん@お腹いっぱい。
2012/03/15(木) 22:13:31.83Least Common Multiple
>>528 はアホ
0530名無しさん@お腹いっぱい。
2012/03/15(木) 22:20:19.95最小公約数
0531名無しさん@お腹いっぱい。
2012/03/16(金) 00:21:54.70普通の数学では gcd が圧倒的で、gcm は数学教育の教科書でしか
見たことがない。
0532名無しさん@お腹いっぱい。
2012/03/16(金) 00:26:08.560533名無しさん@お腹いっぱい。
2012/03/16(金) 00:49:16.79http://ejje.weblio.jp/content/%E6%9C%80%E5%A4%A7%E5%85%AC%E7%B4%84%E6%95%B0
0534名無しさん@お腹いっぱい。
2012/03/16(金) 01:11:00.95整数と小数の判定ってシェルでどうやんの?
0535531
2012/03/16(金) 01:13:58.150536名無しさん@お腹いっぱい。
2012/03/16(金) 05:58:58.34{
a=$1; b=$2
while [ $b != 0 ]; do
t=$(($a % $b)); a=$b; b=$t
done
echo $a
}
t=$1; shift
for i; do
gcd=`gcd $t $i`
lcm=$(($t * $i / $gcd))
t=$lcm
done
echo gcd:$gcd lcm:$lcm
0537名無しさん@お腹いっぱい。
2012/03/16(金) 07:15:25.61不正解
引数 12 20 24 の時、
gcd:12 lcm:120 と表示される。
正しくは GCM = 4
あと、/bin/shでは動かない $(( )) とか
0538名無しさん@お腹いっぱい。
2012/03/16(金) 07:43:40.34freebsd の /bin/sh で動いたが
0539名無しさん@お腹いっぱい。
2012/03/16(金) 07:54:03.72>>1
>FreeBSDユーザは/bin/shの正体がashなので注意。
それより、GCMの計算が間違ってるので結局ダメ
0540名無しさん@お腹いっぱい。
2012/03/16(金) 07:54:54.99posix 互換の /bin/sh なら実装してるんじゃね $((expression))
http://pubs.opengroup.org/onlinepubs/009695399/toc.htm
0541名無しさん@お腹いっぱい。
2012/03/16(金) 10:00:20.84Solarisも/bin/shはkshになっちゃいましたよ、おじいちゃん
0542名無しさん@お腹いっぱい。
2012/03/16(金) 10:02:48.59gcd()
{
local a b r
if [ $1 -gt $2 ]; then
a=$1; b=$2
else
a=$2; b=$1
fi
r=$(( $a % $b ))
[ $r -eq 0 ] && { echo $b; return; }
gcd $b $r
}
0543名無しさん@お腹いっぱい。
2012/03/16(金) 10:09:40.85なってねーよ。嘘書くな。
0544名無しさん@お腹いっぱい。
2012/03/16(金) 10:37:43.03なってるよ。おじいちゃん用のshは/usr/sunos/bin/shに隠居しました。
0545名無しさん@お腹いっぱい。
2012/03/16(金) 10:41:42.83なってないよ。
opensolaris ≠ solaris
あと、pdkshになってるopensolarisだとしても、
「正体はkshだから注意」ということで/bin/shのお題の回答としては不正解。
0546名無しさん@お腹いっぱい。
2012/03/16(金) 10:54:47.130547名無しさん@お腹いっぱい。
2012/03/16(金) 10:59:30.510548名無しさん@お腹いっぱい。
2012/03/16(金) 11:18:01.21すむ事だから大した問題じゃないよね。
多分、/bin/shってお題はcsh使うなカスって意味だろうね。
おじいちゃんはこんなところで重箱の隅つついてないで、外へで
てゲートボールのエースでも目指した方がいいよ。
0549名無しさん@お腹いっぱい。
2012/03/16(金) 11:18:28.78i=$1
while [ $(($1%i+$2%i)) -ne 0 ];do i=$((i-1)); done
echo $i
}
g=$1
l=$1
while [ $# -gt 1 ]; do
shift
g=`gcd $g $1`
l=$((l*$1/`gcd $l $1`))
done
echo gcd=$g lcm=$l
0550526
2012/03/16(金) 11:44:30.22>多分、/bin/shってお題はcsh使うなカスって意味だろうね。
違います。従来からの/bin/shを使えという課題です。
>大した問題じゃないよね
それでは課題として点がもらえません。
大した問題かどうかは関係なく、課題通りの答が必要です。
引続き回答をお願いします。
表示形式も含めて課題です。
0551名無しさん@お腹いっぱい。
2012/03/16(金) 12:16:37.52http://docs.oracle.com/cd/E23824_01/html/E24456/userenv-1.html
0552名無しさん@お腹いっぱい。
2012/03/16(金) 12:19:43.220553526
2012/03/16(金) 12:23:58.00課題の回答だけお願いします
0554名無しさん@お腹いっぱい。
2012/03/16(金) 12:24:33.25えっと……どこをどう読めばそうなるのかとても不思議
0555名無しさん@お腹いっぱい。
2012/03/16(金) 14:29:31.51ちったぁ自分で考えろ
0556名無しさん@お腹いっぱい。
2012/03/16(金) 14:45:01.99> The default shell, /bin/sh, is now linked to ksh93. The default user shell is the Bourne-again (bash) shell.
the default user shell ってのは useradd したときのデフォルトとかの意味だろうね。
/bin/sh は ksh93 だ。
0557526
2012/03/16(金) 14:45:06.16来週の月曜の朝10時までにお願いします。
過程とか不要です。答えだけ書いてください。
もし回答以外のことも書きたい場合はスクリプトを*で囲って
目立つようにしてください
書き方の例を示します
****************************
a = 3
x + y = 5
****************************
0558名無しさん@お腹いっぱい。
2012/03/16(金) 14:46:05.730559名無しさん@お腹いっぱい。
2012/03/16(金) 14:51:59.23「宿題は自分でやれ」
「来年はちゃんと講義聞こうな」
なし
0560名無しさん@お腹いっぱい。
2012/03/16(金) 15:38:56.290561名無しさん@お腹いっぱい。
2012/03/16(金) 18:41:04.43それって、お前も黙らなきゃいけないんじゃないか?
0562名無しさん@お腹いっぱい。
2012/03/16(金) 18:44:07.770563名無しさん@お腹いっぱい。
2012/03/16(金) 18:45:05.35#! /bin/bash
set -e
function gcd() {
local -i i j
for ((i="$1";; i--)); do
for j in "$@"; do
((j % i != 0)) && continue 2
done
echo "$i"
return
done
}
function lcm() {
local -i i=1 j
for j in "$@"; do
((i *= j / "$(gcd "$i" "$j")"))
done
echo "$i"
return
}
printf "GCM = %d\nLCM = %d\n" "$(gcd "$@")" "$(lcm "$@")"
****************************
空気を読んで? bashで。
大学生はもう春休みなはずだが、実習?
それともこれだけできれば単位が貰える系か?
# 今年は進級できるかなあ、自分。
0564名無しさん@お腹いっぱい。
2012/03/16(金) 18:47:50.70だからぁ、bashじゃ駄目だっておっしゃってますが・・
0565名無しさん@お腹いっぱい。
2012/03/16(金) 21:19:30.14> $((expression))がサポートされてなければexprに書き換えれば
> すむ事だから大した問題じゃないよね。
letは使えないの?
0566名無しさん@お腹いっぱい。
2012/03/16(金) 21:21:16.683/19の10:00まで待つと書きましたが、前倒して3/17の16:30までとします
>>557 にあるフォーマットでお願いします
0567名無しさん@お腹いっぱい。
2012/03/16(金) 21:22:56.00もちろんletも使えない。
0568名無しさん@お腹いっぱい。
2012/03/16(金) 21:41:50.80最大公約数求めるのに引数デクリメントしながらすべて割って試すとか
総当たりの非効率アルゴリズム使ってボケるんなら、
最小公倍数でもインクリメントしながら順番に割って総当たりするアルゴリズムで
ボケるべき。
0569名無しさん@お腹いっぱい。
2012/03/16(金) 21:49:10.39/bin/sh まで許せるんだ?
FreeBSD の ports で拡張機能すべて許可した v7sh では func(){}
すら Syntax error なんだが...
# 少なくとも ``#!/usr/bin/env bash'' くらいにしないと販促だ >>563
0570名無しさん@お腹いっぱい。
2012/03/16(金) 21:54:56.85バカ共の相手が面倒になったので締め切りました。
やっぱりバカしか居ないんだな。
0571名無しさん@お腹いっぱい。
2012/03/16(金) 22:25:57.270572名無しさん@お腹いっぱい。
2012/03/16(金) 22:27:13.29できたよ。GCMとLCMの計算方法が対称的になるようにしたよ。
/bin/sh純正だ。アルゴリズムはウケ狙いだけどな。
#!/bin/sh
GCM=$1
while :; do
for i in "$@"; do
if [ `expr "$i" % "$GCM"` != 0 ]; then
GCM=`expr "$GCM" - 1`
continue 2
fi
done
echo GCM = "$GCM"
break
done
LCM=$1
while :; do
for i in "$@"; do
if [ `expr "$LCM" % "$i"` != 0 ]; then
LCM=`expr "$LCM" + 1`
continue 2
fi
done
echo LCM = "$LCM"
break
done
0573名無しさん@お腹いっぱい。
2012/03/16(金) 22:28:07.310574名無しさん@お腹いっぱい。
2012/03/16(金) 23:17:57.603/17 17:00までに提出しないと単位が足りなくなるのが分かったので質問してます
レポートに貼り付けるのは私がしますので、3/17の16:30までにお願いします
また他の皆さんについても、ソースにバグがないかどうか、早急なチェックとデバッグを
期待しています
>>557 にあるフォーマットでお願いします
0575名無しさん@お腹いっぱい。
2012/03/16(金) 23:25:20.310576名無しさん@お腹いっぱい。
2012/03/16(金) 23:37:15.490577名無しさん@お腹いっぱい。
2012/03/16(金) 23:39:45.15変更がないファイルを編集後ディレクトリから削除する
シェルスクリプトを書こうとしています。
diffをディレクトリ同士で実行し同名ファイルを探し
その同名ファイルをdiffし返値が空なら削除という操作を
再帰的に階層を掘って実行すれば良いと思うのですが、
どうも何から書けばいいのか詰まってしまいました。
奇特な方居ましたらアドバイスお願いします。
0578名無しさん@お腹いっぱい。
2012/03/16(金) 23:45:20.44まず、man diffをちゃんと嫁
0579名無しさん@お腹いっぱい。
2012/03/17(土) 00:14:42.67オプションよく読んでいませんでした。
読んで出直してきます。ありがとうございました。
0580名無しさん@お腹いっぱい。
2012/03/17(土) 05:25:42.88目的に対する作業の方法が間違ってる気がする。
何のために「編集前ディレクトリと編集後ディレクトリを比較して、
変更がないファイルを編集後ディレクトリから削除する」のか
を書いた方が、適切な答えが帰ってくると思う。
0581名無しさん@お腹いっぱい。
2012/03/17(土) 07:12:42.07ひな形っぽいもの。階層が一つだけだからヒントにしかならんだろうけど。変数は出鱈目。
やりたいことのイメージは、こんなもんでしょ?
# mkdir /tmp/mae
# mkdir /tmp/ato
# MAE=/tmp/mae
# ATO=/tmp/ato
#
# touch $MAE/aaa
# touch $MAE/bbb
# cp -p $MAE/aaa $ATO/
# echo hoge > $ATO/bbb
#
# cd $ATO
# for ii in `ls`
> do
> [ -f $MAE/$ii ] && diff $ii $MAE > /dev/null 2>&1
> [ $? = 0 ] && rm $ii
> done
#
# ll $ATO
bbb
ちなみに HP-UX で検証。
ls > tmp.txt して while read LINE; do〜done < tmp.txt とか LINE=`head $NUMBER tmp.txt | tail -1` でも目的だけは達成できる感じ。
0583名無しさん@お腹いっぱい。
2012/03/17(土) 15:36:57.64こんなバカみたいな総当たりはダメだって言われちゃいました
もっと数学的な解法をアルゴリズム化したものでないとダメです
結果が正しければいいってレベルじゃないんです
100万とか1000万とか、それ位大きな値になると、ちっとも終わらないじゃないですか
期限は今日の16:40までとします
くれぐれもよろしくお願いします
0584名無しさん@お腹いっぱい。
2012/03/17(土) 16:12:07.29できたよ。100万でも1000万でも、正しく実行すればすぐ終るよ。
#!/bin/sh
while :; do
echo -n 'Enter GCM = '; read GCM
for i in "$@"; do
[ `expr "$i" % "$GCM"` != 0 ] && { echo 'Try again'; continue 2; }
done; break; done
echo GCM = "$GCM"
while :; do
echo -n 'Enter LCM = '; read LCM
for i in "$@"; do
[ `expr "$LCM" % "$i"` != 0 ] && { echo 'Try again'; continue 2; }
done; break; done
echo LCM = "$LCM"
0585名無しさん@お腹いっぱい。
2012/03/17(土) 22:26:32.20LANG=C diff -qrs a b の出力結果でなんとかする
というかバージョン管理システムを使うのが良い気がする
0586名無しさん@お腹いっぱい。
2012/03/19(月) 12:31:35.64B=$A
touch $B
とすると、"*.txt"というファイルが出来てしまうんですが
これ$Bを展開させたいときはどうすればいいんですかね
0587名無しさん@お腹いっぱい。
2012/03/19(月) 12:40:39.27本当に >>586 のとおりに実行したのなら *.txt は展開される。
展開されないのはカレントディレクトリに *.txt にマッチするファイルがないから。
すでにファイルがなければ展開しようがない。
0588586
2012/03/19(月) 12:56:05.81ヒントありがとうございます
oppai.txt がある場合⇒ oppai.txtにタッチ
oppai.txt がない場合⇒ *.txt を作成
という動きになりました
まーこれはこれで使い物になりませんわ
0589名無しさん@お腹いっぱい。
2012/03/19(月) 13:11:29.400590名無しさん@お腹いっぱい。
2012/03/19(月) 13:13:49.05もし「存在しなければ作成したくない」という意図なら、
touch -c $B で桶。
0591名無しさん@お腹いっぱい。
2012/03/19(月) 13:45:15.79エスパーすると、
A=*.txt
B=$A
mv $A /どこか
touch $B
みたいなことをやりたいのでは?
それなら、
A=`echo *.txt`
mv $A /どこか
touch $A
で桶。変数はAだけでよい。
0593名無しさん@お腹いっぱい。
2012/03/19(月) 14:28:02.200594名無しさん@お腹いっぱい。
2012/03/19(月) 15:43:16.300595名無しさん@お腹いっぱい。
2012/03/19(月) 15:45:13.28これなんでBをはさんでるの?
0596名無しさん@お腹いっぱい。
2012/03/19(月) 17:56:07.30Bに代入し直せば再解釈されて展開されると勘違いしたのだろう
0597名無しさん@お腹いっぱい。
2012/03/19(月) 19:53:24.010598名無しさん@お腹いっぱい。
2012/03/19(月) 19:56:34.87touch $B みたいにクォートなしで参照した時に初めて展開される。
0600名無しさん@お腹いっぱい。
2012/03/19(月) 20:04:56.950601名無しさん@お腹いっぱい。
2012/03/19(月) 20:08:20.980602名無しさん@お腹いっぱい。
2012/03/19(月) 21:12:40.160603名無しさん@お腹いっぱい。
2012/03/19(月) 22:06:26.63ttp://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.h
0604名無しさん@お腹いっぱい。
2012/03/20(火) 08:01:57.14のサイトに、
#!/bin/sh
read input
if [ $input = 'q' ]; then
echo QUIT
fi
と言うシェルスクリプトを参考に
if [ "$input" = 'q' ]; then
と $input をダブルクォートで囲めばよい。しかしまだ落とし穴はある。たとえば "!" を入力すると、
[: =: unexpected operator
とまたしてもエラーになってしまう。これは "$input" が "!" であるため、
if [ ! = 'q' ]; then
として扱われたからだ。
ってありますけれど、何度!を入力しても、
[: =: unexpected operator
って表示されません。
それに、
$ test !c = 'q' ; echo $?
test cd /etc = 'q' ; echo $?
test: too many arguments
とエラーが表示されます。
どのような解釈をすると、!cがtest cd /etcに置換されるのでしょうか?
0605名無しさん@お腹いっぱい。
2012/03/20(火) 09:04:17.23これはそのように解釈するtestもあるから注意しろ。くらいでいいと思う。
> どのような解釈をすると、!cがtest cd /etcに置換されるのでしょうか?
ヒストリ置換だろ。
0606名無しさん@お腹いっぱい。
2012/03/20(火) 17:36:56.09今の時代、そのエラーが出るshを使っている人、いるのかね?
0607名無しさん@お腹いっぱい。
2012/03/20(火) 17:41:15.64[ ! = ! ]
[ [ = [ ]
[ ] = ] ]
[ = = = ]
[ -f = -f ]
など、すべて文字列の比較として期待通りに動作する
0608名無しさん@お腹いっぱい。
2012/03/20(火) 17:51:22.47#!/bin/bashとか書いてるのに
0609名無しさん@お腹いっぱい。
2012/03/20(火) 19:57:58.150610名無しさん@お腹いっぱい。
2012/03/20(火) 21:45:56.600611名無しさん@お腹いっぱい。
2012/03/20(火) 23:34:08.600612名無しさん@お腹いっぱい。
2012/03/21(水) 09:04:25.40どうインジェクションするか解説お願いします
0613名無しさん@お腹いっぱい。
2012/03/21(水) 10:08:32.370614名無しさん@お腹いっぱい。
2012/03/21(水) 10:47:17.62case "$hoge" in
yes) ...;;
esac
って書くよね、ふつー。[Yy][Ee][Ss] なんかに変えるのも簡単だし。
0615名無しさん@お腹いっぱい。
2012/03/21(水) 11:14:27.91>>610はダブルクオートで囲ってるから、[コマンドの第一引数として$hogeの中身が渡るんで、そのhogeの値はそのまま[コマンドが解釈する。
どうあがいてもインジェクションなんて無理だと思うんだが。
0616名無しさん@お腹いっぱい。
2012/03/21(水) 11:26:14.79もうカンベンしてやれ。
0617名無しさん@お腹いっぱい。
2012/03/21(水) 12:19:06.390618名無しさん@お腹いっぱい。
2012/03/21(水) 13:26:55.780619名無しさん@お腹いっぱい。
2012/03/21(水) 13:38:09.350620名無しさん@お腹いっぱい。
2012/03/21(水) 14:28:05.05座布団
0621名無しさん@お腹いっぱい。
2012/03/21(水) 15:37:01.150622名無しさん@お腹いっぱい。
2012/03/21(水) 19:24:26.73$ busybox ash
$ hoge=!
$ if [ "$hoge" = 'q' ]; then echo QUIT; fi
ash: q: unknown operand
0623名無しさん@お腹いっぱい。
2012/03/21(水) 22:56:44.16に
>シェルスクリプトに制御構文が増えることを極力避けるように様々な工夫をしている。
>制御構文を避ける理由はコードが読みにくくなるためだ。
>これまで制御構文whileやforのはずし方について書いてきた。
>処理速度を高速化するためにwhileやforをコマンドに置き換えるというのは、
>それなりの効果が期待できる方法だ。
>シェルスクリプトに制御構文であるforやwhileが出てきたら、
>何か避ける方法がないか探してみるとより高速なスクリプトが書けるようになるかもしれない。
ってかいてあって、いろんな例が書いてあったり、
変なパッケージ(python製)を入れて、そのコマンドを使ったりしてるんですね。
僕は制御構文外すと逆に可読性がおちたり、
pythonで書かれたコマンドを呼び出すより、シェルスクリプトで制御構文書いた方が
早いと思うんですけど、おかしいですかね?
0624名無しさん@お腹いっぱい。
2012/03/21(水) 23:01:45.31以下のようなファイルがあるとします。
-----------------
1. aaa hello
2. bbb
3. ccc
4. ddd hello
5. ddd hello
6. eee hello
-----------------
このファイルの2行目から5行目に限定して、helloをgood byに変更したいです。
どのようなやりかたがありますでしょうか?
sedを使えばいいのかなと思うのですが。。
0625名無しさん@お腹いっぱい。
2012/03/21(水) 23:09:05.420626名無しさん@お腹いっぱい。
2012/03/21(水) 23:34:20.22うん、sedの超基本的な使い方で出来る
0627名無しさん@お腹いっぱい。
2012/03/21(水) 23:34:53.130628名無しさん@お腹いっぱい。
2012/03/21(水) 23:41:30.82そのページを見て思ったことは、xargsは便利だね、くらい
0629名無しさん@お腹いっぱい。
2012/03/22(木) 00:58:20.98シェルスクリプトに限らず、プログラム書く時に(一部の)制御構文を使わないってのは個人的に良くやる。効率とか性能とか抜きで。
ゲームの縛りプレイみたいなもんだけど、意外なテクニックを発見したりできて楽しめるよ。おすすめ。
上司や同僚に見つかったら>>623のサイトみたいな適当なウンチクで誤魔化せばOK。
0630名無しさん@お腹いっぱい。
2012/03/22(木) 01:14:19.58sed で 2行目から5行目は 2,5。
hello を good byに置換するには s/hello/good by/
接続すると 2,5s/hello/good by/
0631名無しさん@お腹いっぱい。
2012/03/22(木) 02:23:18.01BASICのころはあったけどな。
if文分岐とかで速度差が出ないようにするとかで。
今はそういうのする必要ないけど。
0632名無しさん@お腹いっぱい。
2012/03/22(木) 08:22:33.32感じるものさ
0633名無しさん@お腹いっぱい。
2012/03/22(木) 08:28:41.720634名無しさん@お腹いっぱい。
2012/03/22(木) 09:18:49.180635名無しさん@お腹いっぱい。
2012/03/22(木) 09:56:14.040636名無しさん@お腹いっぱい。
2012/03/22(木) 11:24:16.01基本動作はキューなんですが、
1 2 3
↓1を実行
2 3
1 2 3
↓2を実行
1 3
としたいです
unset 配列[N]でインデックスを詰めてくれればこんなの楽勝なのに…
0637名無しさん@お腹いっぱい。
2012/03/22(木) 11:37:02.12ファイルにしたらいい
0638名無しさん@お腹いっぱい。
2012/03/22(木) 20:00:10.46$ set -- 1 2 3 4
$ shift
$ echo $@
2 3 4
$ set -- 1 2 3 4
$ set -- $1 ${@:3}
$ echo $@
1 3 4
0639名無しさん@お腹いっぱい。
2012/03/22(木) 20:22:13.25unset array[N] で要素をunsetした後に、
array=(${array[@]}) でセットしなおせばインデックスは詰まる。
>>638 とは違って位置パラメータを壊さずに済む。
0640名無しさん@お腹いっぱい。
2012/03/22(木) 21:29:35.34かっこういい
0641名無しさん@お腹いっぱい。
2012/03/23(金) 22:05:53.20・ファイルを指定フォルダ内へコピー
・同名ファイルが存在する場合は、
既に存在するファイル名を「ファイル名 (1)」へ変更し、
既に「ファイル名 (1)」が存在しているのであれば、
それをさらに「ファイル名 (2)」へ変更し、、、(繰り返し)
というシェルスクリプトを書きたいんですが、
既に「ファイル名 (*)」が存在する場合に*の数字を
どのようにすれば知ることができますか?
*さえ知れたらexprを使えば出来るとは思うのですが...
アドバイスお願いします。
0642名無しさん@お腹いっぱい。
2012/03/23(金) 22:27:01.94逆に考える。
変数iとかに1を入れておいて、
"ファイル名($i)" が存在したら
iをインクリメントして "ファイル名($i)" にリネームする。
0643名無しさん@お腹いっぱい。
2012/03/23(金) 22:28:54.510644名無しさん@お腹いっぱい。
2012/03/23(金) 22:32:05.36i=1; while [ -f "file($i).txt" ]; do i=`expr $i + 1`; done; echo $i
0645名無しさん@お腹いっぱい。
2012/03/23(金) 22:52:22.200646名無しさん@お腹いっぱい。
2012/03/23(金) 22:56:33.590647名無しさん@お腹いっぱい。
2012/03/24(土) 01:18:46.160648名無しさん@お腹いっぱい。
2012/03/24(土) 10:30:46.53つまりアヌスを知りたいと……教えてあげよう
0649名無しさん@お腹いっぱい。
2012/03/24(土) 18:23:06.74実機が無いので試せないけど・・・
第一引数:コピー対象ファイル名(絶対パス指定)
第二引数:コピー先ディレクトリパス
#!/bin/ksh
FILE_NAMEW=`basename ${1}`
COUNT=1
TARGET_FILE=${2}/${FILE_NAME}
if [[ -e ${TARGET_FILE} ]]; then
while true
do
if [[ -e "${TARGET_FILE}(${COUNT})" ]]; then
COUNT=`expr ${COUNT} + 1`
else
cp ${1} ${TARGET_FILE}(${COUNT})
break
fi
done
else
cp ${1} ${TARGET_FILE}
fi
exit 0
0650名無しさん@お腹いっぱい。
2012/03/24(土) 18:40:54.370651名無しさん@お腹いっぱい。
2012/03/24(土) 18:48:18.47第1引数: コピー元ファイル(絶対/相対path関係なし)
第2引数: コピー先ファイル(ディレクトリではない)
#!/bin/sh
FILE=$2
if [ -f "$FILE" ]; then
i=1
while [ -f "$FILE($i)" ]; do
i=`expr $i + 1`
done
FILE="$FILE($i)"
fi
cp "$1" "$FILE"
0652641
2012/03/24(土) 21:11:20.76642さんの意見を参考に書いていたら、
651さんとほぼ同じようなものが書けました。
勉強になりました!
0653名無しさん@お腹いっぱい。
2012/03/24(土) 22:20:08.70みんなも勉強になるんだけどなぁ
0654名無しさん@お腹いっぱい。
2012/03/24(土) 22:34:45.96[ -e "$2" ]&&{ i=0; while [ -e "$2($((++i)))" ];do :;done; set "$1" "$2($i)";}
cp "$1" "$2"
0655名無しさん@お腹いっぱい。
2012/03/25(日) 10:39:31.72ってどういう風に解釈すれば良いんですか?
-- って正規表現ですか?
*はファイル名ですか?
0656名無しさん@お腹いっぱい。
2012/03/25(日) 10:59:50.45その * は glob。シェルが解釈する。
シェルが展開して rm に渡す。
-- は正規表現でも何でもなくて、ただの --。
シェルは特に何もしない。
そのまま rm に渡される。
0657名無しさん@お腹いっぱい。
2012/03/25(日) 11:00:45.800658名無しさん@お腹いっぱい。
2012/03/25(日) 11:28:39.15マッチしたときのための策だな。
0659名無しさん@お腹いっぱい。
2012/03/25(日) 11:51:49.520660名無しさん@お腹いっぱい。
2012/03/25(日) 12:14:56.30調べたらBSD系はgetopt(3)つこうてるから--大丈夫だよと書いてあったんだけど
他のUNIXはまた違うの?
0661名無しさん@お腹いっぱい。
2012/03/25(日) 12:24:48.030662名無しさん@お腹いっぱい。
2012/03/25(日) 13:38:40.680663名無しさん@お腹いっぱい。
2012/03/25(日) 13:56:37.10将来は -- が使えなくなるので注意、と書いてあるね。
0664名無しさん@お腹いっぱい。
2012/03/25(日) 18:55:04.62rm ./*
みたいにすれば引数の先頭が - になることはない。
--が使える保証がなければこっちで。
0665名無しさん@お腹いっぱい。
2012/03/25(日) 20:43:30.34で、-- が使えない ln で、-sという名前を指しているsymlinkを作ろうと、
ln -s ./-s hoge ってやると、hoge -> ./-s というsymlinkができて、
symlink自体に ./ が含まれてしまって美しくない。
-- が使えない条件で 、hoge -> -s は作れないものか。
0666名無しさん@お腹いっぱい。
2012/03/25(日) 22:24:57.35じゃあ全部スクリプトでやれよみたいな話になりかねんからダメかね
0667名無しさん@お腹いっぱい。
2012/03/25(日) 23:41:27.50昔からUnixやってる奴は普通そのやり方だよな
--指定してても、引数に./*でなく*を指定するのは違和感を感じる
0668名無しさん@お腹いっぱい。
2012/03/26(月) 06:20:04.43「◯◯◯.png」というファイルを見つけました
と表示させたいのですが、なるべくコンパクトにするにはどのようにすればいいでしょうか?
自分のやり方だとbasenameで失敗してうまく表示されません
あと、そのフォルダにpngファイルがなかった場合は何も表示しないようにしたいです。
find ${DIR}/ -name "*.png" -exec echo "「`basename {}`」というファイルを見つけました" \;
0669名無しさん@お腹いっぱい。
2012/03/26(月) 06:44:41.40find "$DIR" -name '*.png' -printf '「%f」というファイルを見つけました¥n'
0670名無しさん@お腹いっぱい。
2012/03/26(月) 07:06:33.81`basename {}`はfind実行より先に展開されてしまうので、
{}という文字列のbasenameが実行されて無意味になっているのが原因。
GNU findなら >>669 でよし。
0671名無しさん@お腹いっぱい。
2012/03/26(月) 07:46:41.98find "$DIR" -name '*.png' -exec sh -c 'for f;do echo 「`basename "$f"`」というファイルを見つけました;done' - {} +
0672名無しさん@お腹いっぱい。
2012/03/26(月) 14:20:40.93おかげさまでできました!
ありがとうございました!!
0673名無しさん@お腹いっぱい。
2012/03/27(火) 22:52:24.44開始日付と終了日付を指定したら、その間の日付を出力するスクリプトを作りたいです。
イメージとしては以下のような感じです。
$ ./hoge.sh -s 20120301 -e 20120303
20120301
20120302
20120303
以下の処理までは作ったのですが、ここから先が思いつきません。
---------------------------------------------
$ cat hoge.sh
#!/bin/sh
while getopts s:e: option
do
case $option in
"s")
start_date=$OPTARG
;;
"e")
end_date=$OPTARG
;;
*)
;;
esac
done
---------------------------------------------
よろしくご教示お願いします。
0674名無しさん@お腹いっぱい。
2012/03/27(火) 23:18:59.00perlとか使っちゃう。
0675名無しさん@お腹いっぱい。
2012/03/27(火) 23:30:44.14dateをつかってこんな感じかな
ステップ1. 今日の日付を20120301のように出力しよう
ステップ2. 20120301のような日付を、UTCエポックからの秒数に換算しよう
ステップ3. UTCエポックからの秒数を、20120301のような日付に変換しよう
ステップ4. 20120301のような日付を受け取り、その翌日の日付を出力しよう
ステップ5. ループを回して指定範囲の日付を全て出力しよう
※UTCエポックは 1970-1-1 00:00:00 UTC
0676名無しさん@お腹いっぱい。
2012/03/27(火) 23:42:28.28bash、GNU date依存
#!/bin/bash
while getopts s:e: opt; do
case "${opt}" in
's') stime=$(date -d "${OPTARG}" '+%s') ;;
'e') etime=$(date -d "${OPTARG}" '+%s') ;;
esac
done
t=${stime}
while (( ${etime} >= ${t} )); do
date -d @${t} '+%Y%m%d'
t=$(( ${t} + (60 * 60 * 24) ))
done
0677名無しさん@お腹いっぱい。
2012/03/28(水) 00:15:25.48bashならこっち
for (( t = stime; etime >= t; t += 60 * 60 * 24 )); do
date -d @${t} '+%Y%m%d'
done
0678676
2012/03/28(水) 00:53:33.920679名無しさん@お腹いっぱい。
2012/03/28(水) 06:47:17.46そんな中、何の解答にもヒントにもなってない >>675 って・・・
0680名無しさん@お腹いっぱい。
2012/03/28(水) 06:56:04.85わざわざepochからの秒数に直さなくても、日付だけで行けるよ。
#!/bin/bash
while getopts s:e: opt; do
case $opt in
s) stime=$OPTARG;;
e) etime=$OPTARG;;
esac
done
for ((t = stime; etime >= t; t=$(date -d "$t 1 day" '+%Y%m%d'))) {
date -d "$t" '+%Y%m%d'
}
0681名無しさん@お腹いっぱい。
2012/03/28(水) 07:04:16.81forループ中、dateが1回無駄になってる。せっかく$tに入ってるのでそれ使え。
for ((t = stime; t <= etime; t=$(date -d "$t 1 day" '+%Y%m%d'))) {
echo "$t"
}
0682680
2012/03/28(水) 07:10:47.880683名無しさん@お腹いっぱい。
2012/03/30(金) 14:34:15.36かっこいい方法ありますか?
0684名無しさん@お腹いっぱい。
2012/03/30(金) 14:51:40.880685名無しさん@お腹いっぱい。
2012/03/30(金) 14:55:44.65#!/bin/sh
while IFS= read -r line; do
echo "`date`: $line"
done
0686名無しさん@お腹いっぱい。
2012/03/30(金) 15:42:18.34ありがとうございます
0687名無しさん@お腹いっぱい。
2012/03/30(金) 15:44:45.94ヽ(・ω・)/ ズコー
\(.\ ノ
、ハ,,、  ̄
 ̄
0688名無しさん@お腹いっぱい。
2012/03/30(金) 16:39:16.720689名無しさん@お腹いっぱい。
2012/03/30(金) 16:44:05.09誰かパッチを送れよ。
0690名無しさん@お腹いっぱい。
2012/03/30(金) 17:35:02.11command > $(date +%Y%m%d)
って意味かとオモタ
0691名無しさん@お腹いっぱい。
2012/03/30(金) 18:02:04.91目的はロギングだな、と想像できれば、毎行にタイムスタンプつけたいんだな
ということもわかる
0692名無しさん@お腹いっぱい。
2012/03/30(金) 18:09:51.47目的はロギングだな、と想像できれば、ログファイル名毎に日付を入れたいんだな
と考えるのが自然
0693名無しさん@お腹いっぱい。
2012/03/30(金) 18:15:31.040694名無しさん@お腹いっぱい。
2012/03/30(金) 18:27:01.79touch -t YYMMDDhhmm /dev/stdout
って意味かとオモタ
0695名無しさん@お腹いっぱい。
2012/03/31(土) 01:35:03.440696名無しさん@お腹いっぱい。
2012/03/31(土) 04:56:25.930697名無しさん@お腹いっぱい。
2012/03/31(土) 17:23:45.97それだと、1900年とかそれ以前とか、32bit版の場合の2038年以降が動かないし、
GNU dateに依存するのもいやだし、
dateコマンドに頼らずに20120301等のの数字を直接操作して計算する方法ないですか?
0698名無しさん@お腹いっぱい。
2012/03/31(土) 17:42:14.02月の長さや閏年とか考えると、GNU dateかLL使うのがいいですよ。
コマンド組み合わせるのがシェルの得意なところだし。
0699名無しさん@お腹いっぱい。
2012/03/31(土) 17:47:43.69GNU date使っても epoch以前の日付には対応できないだろ、って言ってるのでは?
0700名無しさん@お腹いっぱい。
2012/03/31(土) 18:35:51.33calコマンドが表示してるのはイギリスの暦らしいね
$ cal 9 1752
September 1752
Su Mo Tu We Th Fr Sa
1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
0701名無しさん@お腹いっぱい。
2012/03/31(土) 18:48:26.54江戸時代でもそれ以前でも年表は西暦で記述されてるから無問題。
1752年の件も含め、紀元1年以降対応できれば幸いです。
紀元前までは要りません。
0702名無しさん@お腹いっぱい。
2012/03/31(土) 19:29:56.450703名無しさん@お腹いっぱい。
2012/03/31(土) 20:51:17.87↓こういうデータがあって、Common Lisp, Mathematica, Javaのライブラリがある。
Calendrical Tabulations, 1900?2200
Edward M. Reingold, Nachum Dershowitz
http://www.cambridgejapan.org/academicproduct.html?isbn=9780521782531
けどまあ元のお題についてはGNU dateかLLでやるのがいいかと。
0704名無しさん@お腹いっぱい。
2012/04/01(日) 12:21:49.60曜日はどうなのよ・・・
0705名無しさん@お腹いっぱい。
2012/04/01(日) 12:24:17.1220120301 等の数字だけ処理できればいいので、曜日は無視でいいです。
0706名無しさん@お腹いっぱい。
2012/04/01(日) 13:39:02.95曜日以外はできたのか。じゃあ早く回答してやれよ。
0707名無しさん@お腹いっぱい。
2012/04/01(日) 14:01:13.24曜日以外は標準で対応し照るじゃん
0708名無しさん@お腹いっぱい。
2012/04/01(日) 14:02:48.07epoch以前でも?
0709名無しさん@お腹いっぱい。
2012/04/01(日) 14:05:53.142011年 4月 1日 金曜日 14:04:49 JST
$ date -d "100 years ago"
1912年 4月 1日 月曜日 14:04:55 CJT
$ date -d "200 years ago"
1812年 4月 1日 月曜日 14:05:08 CJT
できてんじゃん
0710名無しさん@お腹いっぱい。
2012/04/01(日) 14:09:36.73環境依存なので却下
0711名無しさん@お腹いっぱい。
2012/04/01(日) 14:16:22.13「すべての環境」に対応するのは骨が折れると思うが
期待しているぞ
0712名無しさん@お腹いっぱい。
2012/04/01(日) 14:21:28.89>>697 の言うように、20120301等の数字を直接演算すればそもそも環境依存しない。
その演算が場合分けとかでややこしいだけで。
0713名無しさん@お腹いっぱい。
2012/04/01(日) 14:36:54.89GNU date epoch以前の閏年処理おかしいよ。
$ date -d 16000229 ← 1600年は閏年
Tue Feb 29 00:00:00 LMT 1600
$ date -d 17000229 ← 1700年は閏年
date: invalid date `17000229' ← 駄目じゃん
$ cal 2 1700
February 1700
Su Mo Tu We Th Fr Sa
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 ← 閏年だよ
0714名無しさん@お腹いっぱい。
2012/04/01(日) 16:31:55.42グレゴリオ暦で1700年は平年です
$ man cal
> グレゴリオ暦への切り替えは 1752 年の 9 月 3 日に行われたと仮定している。
$ cal 9 1752
9月 1752
日 月 火 水 木 金 土
1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
0715名無しさん@お腹いっぱい。
2012/04/01(日) 16:37:34.38gcal (GNU cal) 3.6
$ gcal 2 1600; gcal 2 1700 ; gcal 9 1752
February 1600
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29
February 1700
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28
September 1752
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
0716名無しさん@お腹いっぱい。
2012/04/01(日) 16:47:02.181700年はまだグレゴリオ暦に切り替わってないのだから、
1700年は閏歳が正しい。
別の例として、
1500年は閏歳なのだが、
calでは閏歳(正しい)
GNU dateでは平年(間違い)
いずれにしても GNU dateでこの年代の日付処理はできない。
0717名無しさん@お腹いっぱい。
2012/04/01(日) 17:25:06.621700年以前なら単純にすべて閏年にする。
1800年以降の場合は、400の倍数でない年のみ平年に戻す。
で桶?
case文バリバリでだれかシェルで組んでくれ。
0718名無しさん@お腹いっぱい。
2012/04/01(日) 17:54:49.44あまりしゃかりきにならんでええ。
日本は1872年かな。
0719名無しさん@お腹いっぱい。
2012/04/01(日) 18:04:26.310720名無しさん@お腹いっぱい。
2012/04/01(日) 18:12:40.42できた気がする。思ったより場合分け簡単だった。
1752年9月も対応
s_date=20120227 # 仮
e_date=20120305 # 仮
t=$s_date
while [ "$t" -le "$e_date" ]; do
echo "$t"
t=`expr "$t" + 1`
case $t in
????0[13578]32|????1032) t=`expr "$t" + 69`;;
????1232) t=`expr "$t" + 8869`;;
????0[469]31|????1131) t=`expr "$t" + 70`;;
????0230) t=`expr "$t" + 71`;;
17520903) t=17520914
esac
case $t in
????0229)
y=`expr "$t" / 10000`
case `expr "$y" % 4` in
0)
[ "$y" -le 1700 ] && continue
[ `expr "$y" % 400` = 0 ] && continue
[ `expr "$y" % 100` != 0 ] && continue
;;
esac
t=`expr "$t" + 72`;;
esac
done
0721名無しさん@お腹いっぱい。
2012/04/01(日) 19:24:47.68西暦999年以前がダメ。頭に0付け加える処理が必要。
0722名無しさん@お腹いっぱい。
2012/04/03(火) 07:17:19.37ありがとうございました
0723名無しさん@お腹いっぱい。
2012/04/03(火) 20:05:15.60[ -f /tmp/unko ]
よりかっこいい方法募集
0724名無しさん@お腹いっぱい。
2012/04/03(火) 20:06:28.950725名無しさん@お腹いっぱい。
2012/04/03(火) 20:20:14.400726名無しさん@お腹いっぱい。
2012/04/03(火) 20:44:46.90まず入ってるであろうコマンドのことだよ
coreutils と読み替えてもらっても結構
0727名無しさん@お腹いっぱい。
2012/04/03(火) 20:46:12.150728名無しさん@お腹いっぱい。
2012/04/03(火) 20:52:43.650729名無しさん@お腹いっぱい。
2012/04/03(火) 21:13:29.780730名無しさん@お腹いっぱい。
2012/04/03(火) 21:18:54.77< /tmp/unko 2> /dev/null && echo ある
0731名無しさん@お腹いっぱい。
2012/04/03(火) 22:18:53.410732名無しさん@お腹いっぱい。
2012/04/04(水) 10:03:23.150733名無しさん@お腹いっぱい。
2012/04/04(水) 10:04:50.22] はコマンドじゃないから
0734名無しさん@お腹いっぱい。
2012/04/04(水) 10:07:01.640735名無しさん@お腹いっぱい。
2012/04/04(水) 10:52:50.01$ test -f /tmp/unko ]
-bash: test: /tmp/unko: binary operator expected
なんかエラーでた
0736名無しさん@お腹いっぱい。
2012/04/04(水) 10:54:52.950737名無しさん@お腹いっぱい。
2012/04/04(水) 10:59:35.40なんで [ じゃだめなの?
0738名無しさん@お腹いっぱい。
2012/04/04(水) 12:05:16.44うぉぉ マジだ。 test.c ってこんなことやってんのか。
はぁー 無駄にすげぇーなー
0739名無しさん@お腹いっぱい。
2012/04/04(水) 12:15:50.420740名無しさん@お腹いっぱい。
2012/04/04(水) 12:21:38.540741名無しさん@お腹いっぱい。
2012/04/04(水) 12:40:51.61test以外でかっこいい方法で
0742名無しさん@お腹いっぱい。
2012/04/04(水) 13:12:21.670743名無しさん@お腹いっぱい。
2012/04/04(水) 13:21:55.370744名無しさん@お腹いっぱい。
2012/04/04(水) 15:21:58.49coolかどうかってことだよ
0745名無しさん@お腹いっぱい。
2012/04/04(水) 15:23:15.610746名無しさん@お腹いっぱい。
2012/04/04(水) 15:43:57.60お前2でなに言ってんだよ
0747名無しさん@お腹いっぱい。
2012/04/04(水) 16:47:37.67どういう意味?
0748名無しさん@お腹いっぱい。
2012/04/04(水) 23:21:13.48TERM=$( (echo 'console() {
term="$2"; for i do
case $i in
term=*) term=$(expr "$i" : "term=¥(.*¥)")
esac
done; echo "$term"; exit 0
}'
というシェル関数なんですが、制御構文が良くわかりません。
for 変数 in 引数1 引数2 …
do
処理
done
とはかけ離れてますし(変数も引数もない)、
case 変数 in
パターン1) 処理;;
パターン2) 処理;;
パターン3 | パターン4) 処理;;
*) 処理;;
esac
が混じってますし...
case文のどのパターンにも当てはまらない時の処理に「term=」がくっついてるし...
これってどういう風に解釈すれば良いんでしょうか?
0749名無しさん@お腹いっぱい。
2012/04/04(水) 23:30:30.61for i; do echo $i; done
とかやってみれ
0750名無しさん@お腹いっぱい。
2012/04/04(水) 23:31:20.38位置パラメータをiにセットしつつforループを回して、
$iが term=* のパターンにマッチしたとき、
そのなんたらの部分(*にマッチした部分)をexprで抜き出して
変数termにセットする。
位置パラメータ全周したらその時点の $term を出力。
というconsole関数。
0751名無しさん@お腹いっぱい。
2012/04/05(木) 12:29:39.61以下のようなテキストファイルがあって、これを読み込んで下のような結果にするスクリプトを書きたいんですがいい方法が思いつきません;
地区、支店、名前が同じものは一番右にある数値を足しこんで出力すると言うものです。
awk のgetline を使えばどうにかなりそう・・・というイメージなんですが、どなたかご教授ください(泣
テキストファイル
----------------------------
A地区 〇支店 佐藤 5
A地区 〇支店 佐藤 9
B地区 □支店 伊東 3
B地区 □支店 木村 3
B地区 □支店 木村 5
C地区 △支店 青木 4
C地区 △支店 青木 4
C地区 △支店 野村 1
----------------------------
結果
----------------------------
A地区 〇支店 佐藤 14
B地区 □支店 伊東 3
B地区 □支店 木村 8
C地区 △支店 青木 8
C地区 △支店 野村 1
----------------------------
0752名無しさん@お腹いっぱい。
2012/04/05(木) 12:39:50.77awkで、getlineを使わずに普通にできる。
ただし、数字は半角で書いてないと計算できない。
0753名無しさん@お腹いっぱい。
2012/04/05(木) 12:48:51.09あっちスレの削除依頼出してきてよ。
0754名無しさん@お腹いっぱい。
2012/04/05(木) 13:03:00.03すみません、やり方がわからないんで・・・
後で出します;
0755名無しさん@お腹いっぱい。
2012/04/05(木) 13:06:43.25getline を使わずにですか・・・
ちょっとヒントいただけますか?
0756名無しさん@お腹いっぱい。
2012/04/05(木) 13:21:01.61awk使わずにシェルだけでできるよ。
ただし、スペースは半角に、数字も半角にしてから実行すること。
標準入力から入力。
#!/bin/sh
p_district=
p_branch=
p_name=
n=0
while read district branch name val; do
if [ "$district" = "$p_district" ] &&
[ "$branch" = "$p_branch" ] &&
[ "$name" = "$p_name" ]; then
n=`expr "$n" + "$val"`
else
[ "$p_district" ] && echo "$p_district" "$p_branch" "$p_name" "$n"
p_district=$district
p_branch=$branch
p_name=$name
n=$val
fi
done
echo "$p_district" "$p_branch" "$p_name" "$n"
0757名無しさん@お腹いっぱい。
2012/04/05(木) 13:33:45.35お〜、有難うございます!大変助かります!
半角にして試して見ます。
ちなみに
$0 テキストファイル
といった具合に、テキストファイルを引数にして読み込み処理する、というようなことも出来るでしょうか?
0758名無しさん@お腹いっぱい。
2012/04/05(木) 13:35:37.33引数にしたかったら、
>>756 のしたから2行目の done のところを done < "$1" に修正すれば良い。
あと、入力ファイルはあらかじめソートされてること
0759名無しさん@お腹いっぱい。
2012/04/05(木) 13:42:26.55すごい!
自分もこんなにあっさりスクリプトが書けるようになりたいものです・・・
758 さん、有難うございました、大変勉強になりました。
0760名無しさん@お腹いっぱい。
2012/04/05(木) 13:50:38.480761名無しさん@お腹いっぱい。
2012/04/05(木) 14:44:15.710762名無しさん@お腹いっぱい。
2012/04/07(土) 17:42:25.29特定のディレクトリ以下に アクセス不能とか移動不能なものが
あるかどうかを調べたいんですが、findでいいですかね
0763名無しさん@お腹いっぱい。
2012/04/07(土) 19:40:38.64グループでOKになってるときのパターンがネックだ
これのせいでワンライナーにならん
0764名無しさん@お腹いっぱい。
2012/04/07(土) 22:52:59.06find . ! -readable | wc -l
でダメ?
0765sage
2012/04/10(火) 19:58:25.17とかやると,
[1] + suspended (tty output) ...
とかなって処理が終了しない.なぜぇ・・・
0766名無しさん@お腹いっぱい。
2012/04/10(火) 21:04:40.050767名無しさん@お腹いっぱい。
2012/04/11(水) 08:00:04.70面白いと思う
0768名無しさん@お腹いっぱい。
2012/04/12(木) 09:02:11.67はずして実行したら {1..10}.txt とかできたぞ
どうしてくれる
マジレスすると、commandの中身なによ
0769sage
2012/04/12(木) 10:33:02.930770名無しさん@お腹いっぱい。
2012/04/12(木) 19:19:17.010771名無しさん@お腹いっぱい。
2012/04/12(木) 19:30:36.07回答欲しかったらもっと具体的に "how to repeat" 書いてくれ
0772名無しさん@お腹いっぱい。
2012/04/12(木) 21:09:49.38そのcommandのプログラムがSIGTTOUをSIG_DFLに戻してしまってるんだろ。
普通ならシェル側でSIGTTOUはSIG_IGNにするからsuspendはしないようになってる。
0773名無しさん@お腹いっぱい。
2012/04/12(木) 21:25:50.42Steps to Reproduce だろ
0774名無しさん@お腹いっぱい。
2012/04/12(木) 21:34:14.02How to repeatで合ってる。というか、そんなところに突っ込んでも面白くない。
0775名無しさん@お腹いっぱい。
2012/04/12(木) 22:19:43.600776名無しさん@お腹いっぱい。
2012/04/12(木) 22:24:50.960777名無しさん@お腹いっぱい。
2012/04/12(木) 22:27:19.83「バグの再現手順」だろ? と突っ込んでるようなモン。
0778名無しさん@お腹いっぱい。
2012/04/12(木) 23:01:56.84http://www.gnu.org/software/gnats/doc/3_113_1/gnats_1.html
0779名無しさん@お腹いっぱい。
2012/04/13(金) 06:11:12.98エスパーするとzshの最近のバージョンでのバグ。
0780名無しさん@お腹いっぱい。
2012/04/13(金) 14:26:30.54で起きる奴とおんなじ.どうすればいいんだろ・・
0781名無しさん@お腹いっぱい。
2012/04/13(金) 14:34:14.580782名無しさん@お腹いっぱい。
2012/04/13(金) 14:44:26.87>>768の件.
0783名無しさん@お腹いっぱい。
2012/04/13(金) 14:44:40.34set +m
で、ジョブコントロールを無効にすれば桶。
ただ、シェルスクリプト中から起動すればデフォで set +m 状態なんだがな。
コマンドラインから直接起動してるのか。
0784名無しさん@お腹いっぱい。
2012/04/14(土) 21:01:39.51shell script書いててはまったんだけど、
ls -l /etc | sort -k4 -n
がファイルサイズでソートしてくんない。
こんな↓感じで、なんか部分的にしかソートしてくれないみたい。
http://dpaste.org/ri4On/
バグ?
理由を知ってる人がいたら教えてちょうだい。
環境: debian squeeze
$ uname -a
Linux bauhaus 3.2.0-2-rt-686-pae #1 SMP PREEMPT RT Fri Apr 13 02:23:30 JST 2012 i686 GNU/Linux
$ sort --version
sort (GNU coreutils) 8.5
0785名無しさん@お腹いっぱい。
2012/04/14(土) 21:09:58.78sort -k5 -n だろ
0786名無しさん@お腹いっぱい。
2012/04/14(土) 21:10:24.240787名無しさん@お腹いっぱい。
2012/04/14(土) 21:15:57.76> 理由を知ってる人がいたら教えてちょうだい。
使い方が間違っている。
0788名無しさん@お腹いっぱい。
2012/04/14(土) 21:18:22.790789名無しさん@お腹いっぱい。
2012/04/14(土) 21:26:12.51-k POS1[,POS2]
-K POS1[,POS2] ソートフィールド指定の POSIX 形式。今後はこちらが
推奨される。行の POS1 から POS2 までのフィールドを指定する。
POS2 を含む。 POS2 が省略されたら行末まで。 フィールドと文字位置
はそれぞれ 0 から数えはじめる。
て書いてあったんだもん。
それを何も考えず信じたのでした。
LANG=C man sort だと、
-k, --key=POS1[,POS2]
start a key at POS1 (origin 1), end it at POS2 (default end of line)
てなってるのね。
確かに -k5ならソートしてくれたよ。
なんだかスレ汚し失礼しました。
0790名無しさん@お腹いっぱい。
2012/04/14(土) 21:34:49.420791名無しさん@お腹いっぱい。
2012/04/15(日) 01:03:11.15さすが Linux とおもた。
0792名無しさん@お腹いっぱい。
2012/04/15(日) 01:13:16.430793名無しさん@お腹いっぱい。
2012/04/15(日) 01:18:04.06しとくのオススメ
0794名無しさん@お腹いっぱい。
2012/04/15(日) 01:20:40.590795名無しさん@お腹いっぱい。
2012/04/15(日) 02:33:57.03翻訳されたのが嬉しかった。
GNU bash 4.2 の翻訳
http://linuxjm.sourceforge.jp/INDEX/gnu.html#GNU_bash
0796名無しさん@お腹いっぱい。
2012/04/15(日) 11:22:51.82function foo {
foo
}
しかし当然ながら無限ループになります。
解決策としては
function foo {
`which foo`
}
という方法があります。
しかし毎回 which コマンドを起動するのがちょっと気にかかります。
別の方法として
function foo {
¥foo
}
というのを試しましたが、だめでした。¥foo はエイリアスには効くけど関数にはききませんでした。
というわけで、今のところ which コマンドを使う方法しかなさそうですが、もっといい方法があれば教えて下さい。
0797名無しさん@お腹いっぱい。
2012/04/15(日) 11:26:42.70function foo {
command foo
}
そのための「command」コマンド。
0798名無しさん@お腹いっぱい。
2012/04/15(日) 12:24:24.87bash$ help function
とか
bash$ help command
とかするとその部分の説明文だけ表示してくれる
0799名無しさん@お腹いっぱい。
2012/04/15(日) 13:24:53.76/usr/bin/foo
とかすればいいんじゃないの?
0800名無しさん@お腹いっぱい。
2012/04/15(日) 13:34:57.91最適解(>>797)が既に出てるのに、外した回答するオマエは黙ってろ。
PATHが違ったら適応できないだろw
0801名無しさん@お腹いっぱい。
2012/04/15(日) 16:01:28.21〜の方が良いと書いてあれば別だが。
0802名無しさん@お腹いっぱい。
2012/04/15(日) 16:16:51.47>>796 の質問で、わざわざ `which foo` と書いてることから、
絶対PATHで書いたのでは問題の解決にならないことは読みとれる。
質問者自信も絶対PATHを使う方法は知っている(けどそれじゃ駄目)と読みとれる。
質問の回答になってないのだから問題視されてもしょうがない。
0803名無しさん@お腹いっぱい。
2012/04/16(月) 01:51:19.72>>799みたいなトンチンカンな回答にも丁寧に答えてあげている
>>800の優しさに気づけ
0804名無しさん@お腹いっぱい。
2012/04/17(火) 15:40:51.44「command」なんて初めて知りました。完璧です。ありがとうございました。
>>802
状況としてはまったくそのとおりで、すばらしいエスパーっぷりですが、
799はそこまで敵視されるようなことを書いてるわけじゃないので、
そんなに怖がらせなくてもいいかなと思いました。
技術者同士はみんな仲良くね!戦うべき相手は別にいるよ!
0805名無しさん@お腹いっぱい。
2012/04/17(火) 16:49:46.48彼なりにイカしたレスだとお考えになっているのでしょう。
しばらくここにいれば慣れます。
0806名無しさん
2012/04/23(月) 01:47:23.080807名無しさん@お腹いっぱい。
2012/04/28(土) 14:15:07.91環境変数ならぬ環境関数みたいな
便利だと思うんだけど
0808名無しさん@お腹いっぱい。
2012/04/28(土) 14:19:23.03え? できるけど。
export -f
0809名無しさん@お腹いっぱい。
2012/04/29(日) 08:45:26.54bash乙
0810名無しさん@お腹いっぱい。
2012/04/29(日) 09:44:51.95/ \
/ _ノ ヽ、_ \
/ o゚⌒ ⌒゚o \ 不毛な言い争いがまた始まるお…
| (__人__) |
\ ` ⌒´ /
0811名無しさん@お腹いっぱい。
2012/04/29(日) 10:46:16.860812名無しさん@お腹いっぱい。
2012/04/29(日) 17:13:31.08ほんとだ、bashだとexport -fでできるのね
zshだと駄目なんだけどオプションが違うんだろうか
0813名無しさん@お腹いっぱい。
2012/04/29(日) 17:16:47.950814名無しさん@お腹いっぱい。
2012/04/29(日) 18:14:30.17そうなんだぁ・・・
いっそbashに戻ろうかな
0815名無しさん@お腹いっぱい。
2012/05/06(日) 03:50:24.36質問です。
複数のコマンドの実行結果をソートしたいですが、うまくいきません。例えば、
イメージ的には以下のような感じ。
{
cat FILE_A
find PATH1 -print
find PATH2 -print
find PATH3 -print
} | sort > FILE_A
以下を試しました
find PATH1 -print >> FILE_A
find PATH2 -print >> FILE_A
find PATH3 -print >> FILE_A
cat FILE_A | sort > FILE_A
こうすると最後の FILE_A のファイルに結果がすべて出力されず尻切れになり
ます。
0816名無しさん@お腹いっぱい。
2012/05/06(日) 03:59:02.05$ cat <(find PATH1) <(find PATH2) <(find PATH3) | sort
$ cat < FILE_A | sort > FILE_A
が失敗するのはまあそんなものだと思っておけばいい。
同じファイルから読み込んで出力するのは失敗する。
$ cat < FILE_A | sort > FILE_B
ならおk
0817名無しさん@お腹いっぱい。
2012/05/06(日) 04:09:18.13みたいな手もあるが、間違えたら泣ける。
0818名無しさん@お腹いっぱい。
2012/05/06(日) 04:15:04.88find PATH1 PATH2 PATH3 | sort
でいいよな。
0819名無しさん@お腹いっぱい。
2012/05/06(日) 05:15:17.42> cat FILE_A | sort > FILE_A
マルチタスクな OS では普通パイプやリダイレクトの際に前後の
プロセスが同時に起動する。
ファイルを読むプロセスが終了するのを待ってファイルを書くプ
ロセスが起動する訳ではない。
なので、上記の場合は最後に書き込むファイル名を変更しなければならない。
0820名無しさん@お腹いっぱい。
2012/05/06(日) 14:36:51.94cat FILE_A > "$TEMP"
find PATH1 -print >> "$TEMP"
find PATH2 -print >> "$TEMP"
find PATH3 -print >> "$TEMP"
sort "$TEMP" > FILE_A
0821名無しさん@お腹いっぱい。
2012/05/06(日) 14:53:36.250822名無しさん@お腹いっぱい。
2012/05/06(日) 15:27:35.80http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html#sort-invocation
cat FILE_A | sort -o FILE_A
0823名無しさん@お腹いっぱい。
2012/05/06(日) 16:20:24.14catとパイプが無駄です。
sort -o FILE_A FILE_A
0824名無しさん@お腹いっぱい。
2012/05/06(日) 17:20:10.080825名無しさん@お腹いっぱい。
2012/05/06(日) 18:55:31.700826名無しさん@お腹いっぱい。
2012/05/06(日) 19:22:02.880827名無しさん@お腹いっぱい。
2012/05/06(日) 19:23:49.290828名無しさん@お腹いっぱい。
2012/05/07(月) 19:19:08.780829名無しさん@お腹いっぱい。
2012/05/07(月) 21:03:44.73対話的コマンドでもexpectでなんとかなる
0830名無しさん@お腹いっぱい。
2012/05/07(月) 21:11:42.22そういう意味じゃなくて、シェルスクリプト中で su -c hoge とかしないで
root権限の動作をさせたいという質問かとエスパー。
0831名無しさん@お腹いっぱい。
2012/05/07(月) 21:16:30.15昔あったsuidperlみたいなののbash版を探してみたけどないみたいだし。
sudersに対象となるスクリプトに対してNOPASSWDを設定するぐらいしか思いつかないや。
0832名無しさん@お腹いっぱい。
2012/05/08(火) 02:00:49.38できます
コマンドラインを実行するだけのプログラムを作って
setuidするば
0833名無しさん@お腹いっぱい。
2012/05/08(火) 07:52:21.31>>831
0834名無しさん@お腹いっぱい。
2012/05/09(水) 13:22:49.97ここに書いてあるシェルスクリプトを動かしてみたんですが、
Syntax error: "do" unexpectedと返されてしまいます
ヒントだけでもいいんで教えてください。
0835名無しさん@お腹いっぱい。
2012/05/09(水) 13:28:11.27bash -x secrets.sh
0836名無しさん@お腹いっぱい。
2012/05/09(水) 13:29:47.52わからないなら黙ってろ
0837835
2012/05/09(水) 13:30:45.770838名無しさん@お腹いっぱい。
2012/05/09(水) 15:17:41.550839名無しさん@お腹いっぱい。
2012/05/10(木) 06:54:48.810840名無しさん@お腹いっぱい。
2012/05/14(月) 22:36:21.02function chdir {
if [ -r "$1" -a -d "$1" -o "$1" = "" ] ; then
local i
for i in 8 7 6 5 4 3 2 1 0 ; do
dirstack[$i+1]=${dirstack[$i]}
done
dirstack[0]=`pwd`
\cd $1
fi
pwd
}
function ds {
echo "p:"`pwd`
local i
for i in 0 1 2 3 4 5 6 7 8 9 ; do
echo "$i:${dirstack[$i]}"
done
}
bash用のをcsh(tcshですが)に書き換えてもらえないでしょうか。
0841名無しさん@お腹いっぱい。
2012/05/14(月) 22:36:59.98dirstack[10]=`pwd`
\cd ${dirstack[0]}
local i
for i in 0 1 2 3 4 5 6 7 8 9 ; do
dirstack[$i]=${dirstack[$i+1]}
done
pwd
}
function nd {
dirstack[10]=`pwd`
\cd ${dirstack[9]}
local i
for i in 8 7 6 5 4 3 2 1 0 ; do
dirstack[$i+1]=${dirstack[$i]}
done
dirstack[0]=${dirstack[10]}
pwd
}
0842名無しさん@お腹いっぱい。
2012/05/15(火) 09:15:03.980843名無しさん@お腹いっぱい。
2012/05/15(火) 16:36:43.46体に馴染んでるんで…すいません
0844名無しさん@お腹いっぱい。
2012/05/16(水) 16:34:35.79デフォルトのBourne Shellではチルダ展開がないようなので、posix shellにて
チルダ展開が必要な場合がある、ファイル名に空白等を含んだものが、パラメータに入っているとして、
file_name="~/src/te st"
echo "${file_name}をチルダ展開しlsします。\n"
ls -l "$( eval echo -n ${file_name} )"
0845名無しさん@お腹いっぱい。
2012/05/16(水) 16:40:45.810846名無しさん@お腹いっぱい。
2012/05/16(水) 17:10:41.70例が悪い。その1番下の行の
ls -l "$( eval echo -n ${file_name} )"
だって、複数の空白が空白1個にまとめられちゃうし、
$ < > 等の記号が含まれると ${file_name} (クォートなし)の展開と
evalの展開で大変なことになるぞ。
0847名無しさん@お腹いっぱい。
2012/05/16(水) 17:30:39.54でも考えても、これくらいしか思いつかなかったので、
いい加減にして、聞いた方が早いかと書き込んだんだよ。
0848名無しさん@お腹いっぱい。
2012/05/16(水) 17:34:06.75その他の空白とか * $ < > とかの解釈はさせないって方法がないんだよな。
sedでチルダを $HOME に書き換えろ。
0849名無しさん@お腹いっぱい。
2012/05/16(水) 17:46:31.95file_name="~/src/te st * $ < >"
ls -l "${file_name/\~/$HOME}"
0850名無しさん@お腹いっぱい。
2012/05/16(水) 18:49:13.65ls -l "$( echo -n "${file_name}" | sed s#^~#$HOME# )"
0851844
2012/05/16(水) 21:00:34.05ls -l "$( [ "${file_name%%/*}" = "~" ] && echo "$HOME/${file_name#~/}" || echo "${file_name}" )"
if [ "${file_name%%/*}" = "~" ]
then ls -l "$HOME/${file_name#~/}"
else ls -l "${file_name}"
fi
0852名無しさん@お腹いっぱい。
2012/05/18(金) 05:23:42.76test.sh: syntax error at line 2: `(' unexpected
とエラーが出てきて使用できません。空白、頭にfunctionを付ける等いろいろ試してみましたがやはり変わらず・・・
UNIX version 7の頃のshには関数がないということでしょうか?
0853名無しさん@お腹いっぱい。
2012/05/18(金) 05:27:04.290854名無しさん@お腹いっぱい。
2012/05/18(金) 06:51:13.40シェル関数はないよ。
代用として、シェル関数にしたい内容をシェル変数に入れて、その変数を実行する。
func='ls -l'
$func
で ls -l が実行される。引数を渡したい時は工夫して。
0855名無しさん@お腹いっぱい。
2012/05/18(金) 07:00:59.45参考までに
1. Bourne Shell Tutorial
http://www.grymoire.com/Unix/Sh.html
The original version of the Bourne shell didn't have functions. If you wanted to perform an operation more than once, you either had to duplicate the code, or create a new shell script.
2. Linux におけるシェルの進化
http://www.ibm.com/developerworks/jp/linux/library/l-linux-shells/?cmp=dw&cpb=dwlin&ct=dwrss&cr=dwrss&ccy=jp&csr=012012
ただし、関数を定義する機能は欠けていました。
3. 知っている限りでは、ここが一番情報が多い
traditional Bourne shell family / history and development
http://www.in-ulm.de/~mascheck/bourne/
The Variants
A summary of the most important changes
? Version 7 (1979) control structures, cmd substitution, () and {}, arbitrary variable names, trap, eval, special parameter substitutions, case
? System III (1981) #, [!...], colon parameter substitution, set --
? SVR1 (1983) shift n
? SVR2 (1984) functions, built-ins: unset echo type, redirection for builtins
4. 3の下の方のSource codeにある、Nikola Vladov のマニュアルで、
man v7sh
BUGS Coexists with but doesn't understand shell functions.
5. FreeBSD Portsはよく分かりませんが、
v7sh FreeBSD
http://www.freebsdsoftware.org/shells/v7sh.html
functions aren't supported and command line input is not 8 bit clean
0856名無しさん@お腹いっぱい。
2012/05/18(金) 15:41:41.74>>855
ありがとうございます!やっぱりなかったんですね
case文で;;を使用してもcase文抜けられないのも仕様なのかなぁ
マニュアル読んだら使用できそうではあったんですけども・・・一応使用したテストスクリプト上げておきます。
#!/usr/local/bin/v7sh
case $1 in
a)
echo "A!!"
;;
b)
echo "B!!"
;;
c|d)
echo "C or D"
;;
[e-h])
echo "E kara H"
;;
*)
echo "NANIKORE?"
;;
esac
で結果が以下のようになりました。
$ test.sh a
A!!
NANIKORE?
0857名無しさん@お腹いっぱい。
2012/05/18(金) 16:34:52.98ソースあるんだから読んで解析してくれ
読みにくいってレベルじゃないけど
0858名無しさん@お腹いっぱい。
2012/05/18(金) 20:07:10.23そのままコピペしてv7shで試しましたが、こちらでは期待通りの動作でした。
$ ./v7case.sh a
A!!
$
0859名無しさん@お腹いっぱい。
2012/05/18(金) 22:31:03.13謎ですね・・・v7shなんて過去のものですから大差があるとは考えにくいですし
通常のコマンド待ち状態で ;; を打つとエラーが出ますから
case内でしか特殊な意味を持たないと思われるんですけどね・・・
0860名無しさん@お腹いっぱい。
2012/05/24(木) 17:44:12.51例えば、$HOME/work/hogeでいつも作業するのでbash起動時にそこにいて欲しい。
$HOMEを書きかえると他にも影響があり過ぎるので別の方法教えてください。
適切なスレが見つからなかったので、誘導して。
0861名無しさん@お腹いっぱい。
2012/05/24(木) 18:49:28.230862名無しさん@お腹いっぱい。
2012/05/24(木) 20:59:36.08恥ずかしいー
0863名無しさん@お腹いっぱい。
2012/05/24(木) 21:28:32.290864名無しさん@お腹いっぱい。
2012/05/25(金) 02:08:36.57-xをつけて実行してみたところ、
# bash -x secrets.sh
+ echo -n
: Invalid argument: apks.txt
+ echo -n
: Invalid argument: output.txt
secrets.sh: line 5: syntax error near unexpected toke' `do
'ecrets.sh: line 5: `do
以下のようになりました。
0865名無しさん@お腹いっぱい。
2012/05/25(金) 10:06:26.31hexdump -C secrets.sh | head
したら、0d 0aになってる所あるんじゃないの?
0866名無しさん@お腹いっぱい。
2012/05/25(金) 11:45:35.260d が付いていたとしても >>864 の Invalid argument: のエラーにはならないから、その問題じゃないな。
0867名無しさん@お腹いっぱい。
2012/05/25(金) 11:51:53.28Invalid argumentの理由はシステム依存だろうな。
0868名無しさん@お腹いっぱい。
2012/05/25(金) 13:17:54.88FATとかのファイルシステムに echo > 'hoge.txt^M' すると、
: Invalid argument
って出るよ。
0869名無しさん@お腹いっぱい。
2012/05/25(金) 16:05:55.12違うパーティションに移して実行してみました。
# bash -x secrets.sh
+ echo -n
+ echo -n
secrets.sh: line 5: syntax error near unexpected toke' `do
'ecrets.sh: line 5: `do
0870名無しさん@お腹いっぱい。
2012/05/25(金) 16:23:38.260d を消せと。
0871名無しさん@お腹いっぱい。
2012/05/25(金) 16:25:46.48だから、>>865 が言うように行末に(見えない) ^M (0d) が付いてるのが原因だって。
for hoge in hoge^M
do^M
みたいになってて、forの行では ^M がそういう文字として解釈されるから
一応エラーは出ないけど、次の do の行で、doの代わりに do^M が書いてあるから、
syntax error near unexpected token `do^M'
と出る。^Mはカーソル移動を伴うから、`do^M' の表示が乱れて
toke' `do みたいにおかしく表示されているのも説明が付く。
0872名無しさん@お腹いっぱい。
2012/05/25(金) 16:42:39.18do^Mとは
書いてありませんでした。
コピペしてるので写し間違いはないはずです。
0873名無しさん@お腹いっぱい。
2012/05/25(金) 17:00:31.790874名無しさん@お腹いっぱい。
2012/05/25(金) 17:40:27.35# bash -x secrets.sh
secrets.sh: line 2: syntax error near unexpected token `do'
secrets.sh: line 2: `do bin2xml $x.folder/AndroidManifest.xml
> $x.folder/AndroidManifest.decoded.xmldonefor x in `find . -name "AndroidManifest.decoded.xml"`do
echo "$x:" >> output.txt cat $x | grep -i host | sed 's/android:host=\"/*#*#/' | sed 's/\" \/>/#*#*/' | sed 's/\t\t\t\t\t//' >> output.txtdone'
0875名無しさん@お腹いっぱい。
2012/05/25(金) 17:49:44.95改行まで消すなよ。
bin2xmlの行が2行目に来てるし、、
0876名無しさん@お腹いっぱい。
2012/05/25(金) 17:57:33.97# hexdump -c secrets.sh | head
0000000 # ! / b i n / b a s h \r \n e c h
0000010 o - n > a p k s . t x t \r
0000020 \n e c h o - n > o u t p u
0000030 t . t x t \r \n f o r x i n
0000040 ` f i n d . - n a m e " *
0000050 . a p k " ` \r \n d o \r \n \t u n z
0000060 i p - p $ x | s t r i n
0000070 g s | g r e p - i " a n
0000080 d r o i d . p r o v i d e r . T
0000090 e l e p h o n y . S E C R E T _
0877名無しさん@お腹いっぱい。
2012/05/25(金) 18:04:28.73コマンド行のコピペのまともに出来ない人間が、
xda-developers.comなんかに手を出さないほうがいいよ。
コンピュータは向いてない。
0878名無しさん@お腹いっぱい。
2012/05/25(金) 18:19:40.540879名無しさん@お腹いっぱい。
2012/05/25(金) 18:25:56.14それと簡単なシェルスクリプトを動かしたら似たようなエラーが発生しました。
# bash test.sh aaa
: command not found
: command not found
test.sh: line 12: syntax error near unexpected token `fi'
test.sh: line 12: `fi'
0880名無しさん@お腹いっぱい。
2012/05/25(金) 18:29:43.74>>876が発狂する前に hexdump -C secrets.sh | head の出力を貼ってください
-cじゃなくて-Cでお願いします
0882名無しさん@お腹いっぱい。
2012/05/25(金) 18:38:20.98原因は出てる通り CR
で、CR取れと指示されたら CRを知らない質問者が CR LFともに取って1行にしただけ。
エラーメッセージからも裏付けられる。
0883名無しさん@お腹いっぱい。
2012/05/25(金) 18:40:31.8500000000 23 21 2f 62 69 6e 2f 62 61 73 68 0d 0a 65 63 68 |#!/bin/bash..ech|
00000010 6f 20 2d 6e 20 3e 20 61 70 6b 73 2e 74 78 74 0d |o -n > apks.txt.|
00000020 0a 65 63 68 6f 20 2d 6e 20 3e 20 6f 75 74 70 75 |.echo -n > outpu|
00000030 74 2e 74 78 74 0d 0a 66 6f 72 20 78 20 69 6e 20 |t.txt..for x in |
00000040 60 66 69 6e 64 20 2e 20 2d 6e 61 6d 65 20 22 2a |`find . -name "*|
00000050 2e 61 70 6b 22 60 0d 0a 64 6f 0d 0a 09 75 6e 7a |.apk"`..do...unz|
00000060 69 70 20 2d 70 20 24 78 20 7c 20 73 74 72 69 6e |ip -p $x | strin|
00000070 67 73 20 7c 20 67 72 65 70 20 2d 69 20 22 61 6e |gs | grep -i "an|
00000080 64 72 6f 69 64 2e 70 72 6f 76 69 64 65 72 2e 54 |droid.provider.T|
00000090 65 6c 65 70 68 6f 6e 79 2e 53 45 43 52 45 54 5f |elephony.SECRET_|
000000a0 43 4f 44 45 22 0d 0a 09 69 66 20 5b 20 24 3f 20 |CODE"...if [ $? |
000000b0 2d 65 71 20 30 20 5d 3b 20 74 68 65 6e 0d 0a 09 |-eq 0 ]; then...|
000000c0 09 65 63 68 6f 20 24 78 20 3e 3e 20 61 70 6b 73 |.echo $x >> apks|
000000d0 2e 74 78 74 0d 0a 09 66 69 0d 0a 64 6f 6e 65 0d |.txt...fi..done.|
000000e0 0a 66 6f 72 20 78 20 69 6e 20 60 63 61 74 20 61 |.for x in `cat a|
000000f0 70 6b 73 2e 74 78 74 60 0d 0a 64 6f 0d 0a 09 6d |pks.txt`..do...m|
00000100 6b 64 69 72 20 22 24 78 2e 66 6f 6c 64 65 72 22 |kdir "$x.folder"|
00000110 0d 0a 09 6d 76 20 24 78 20 24 78 2e 66 6f 6c 64 |...mv $x $x.fold|
00000120 65 72 0d 0a 64 6f 6e 65 0d 0a 66 6f 72 20 78 20 |er..done..for x |
00000130 69 6e 20 60 63 61 74 20 61 70 6b 73 2e 74 78 74 |in `cat apks.txt|
00000140 60 0d 0a 64 6f 0d 0a 09 75 6e 7a 69 70 20 2d 64 |`..do...unzip -d|
00000150 20 24 78 2e 66 6f 6c 64 65 72 20 24 78 2e 66 6f | $x.folder $x.fo|
0884名無しさん@お腹いっぱい。
2012/05/25(金) 19:00:58.48ありがとうございます。
まさにその通りでした。
一応走り出したんですが
# bash secrets.sh
unzip: can't open as, as.zip, as.ZIP
unzip: can't open an, an.zip, an.ZIP
unzip: can't open Droid.apk, Droid.apk.zip, Droid.apk.ZIP
unzip: zip flags 1 and 8 are not supported
unzip: zip flags 1 and 8 are not supported
unzip: zip flags 1 and 8 are not supported
unzip: zip flags 1 and 8 are not supported
unzip: zip flags 1 and 8 are not supported
unzip: zip flags 1 and 8 are not supported
unzip: can't open as, as.zip, as.ZIP
unzip: can't open an, an.zip, an.ZIP
unzip: can't open Droid.apk, Droid.apk.zip, Droid.apk.ZIP
とエラーを延々と吐かれました。
0885発狂寸前のなまはげ
2012/05/25(金) 21:21:23.68cygwinのまともなunzipはどこかにおらんかー!?
0886名無しさん@お腹いっぱい。
2012/05/26(土) 15:38:08.10find "${DIR}/A/" -name '*.png' -printf "$(tput bold; tput setaf 6) %f $(tput sgr0)"
find "${DIR}/B/" -name '*.png' -printf "$(tput bold; tput setaf 5) %f $(tput sgr0)"
find "${DIR2}/" -prune -name '*.png' -printf "$(tput bold; tput setaf 5) %f $(tput sgr0)"
とあるディレクトリ内にある画像ファイルをディレクトリ別に色違いで表示させたいです。
似たような単作業なのでどうにかこれを簡略化したいのですが、どうすればいいでしょうか?
0887名無しさん@お腹いっぱい。
2012/05/26(土) 17:02:55.22-pathオプションを使う。
find "$DIR" "$DIR2" \
\( -path "$DIR/A/*.png" -printf "$(tput bold; tput setaf 6) %f $(tput sgr0)" \) \
-o \( -path "$DIR/B/*.png" -printf "$(tput bold; tput setaf 5) %f $(tput sgr0)" \) \
-o \( -path "$DIR/*.png" -printf "$(tput bold; tput setaf 1) %f $(tput sgr0)" \) \
-o \( -path "$DIR2/*.png" -printf "$(tput bold; tput setaf 5) %f $(tput sgr0)" \)
OR条件の判断上、-path "$DIR/A/*.png" 等を -path "$DIR/*.png" よりも先にすること。
0888名無しさん@お腹いっぱい。
2012/05/26(土) 21:15:22.85どうせなら最初と最後にtputをまとめればもう少し簡単に
tput bold
find "$DIR" "$DIR2" \
\( -path "$DIR/A/*.png" -printf "$(tput setaf 6) %f " \) \
-o \( -path "$DIR/B/*.png" -printf "$(tput setaf 5) %f " \) \
-o \( -path "$DIR/*.png" -printf "$(tput setaf 1) %f " \) \
-o \( -path "$DIR2/*.png" -printf "$(tput setaf 5) %f " \)
tput sgr0
0889名無しさん@お腹いっぱい。
2012/05/27(日) 10:29:12.14シェルスクリプトに
echo cmd
とかいて有った場合、そのコマンドが実行される条件って有るのでしょうか?
sh /etc/weekly.local
とやると、weekly.local内の
#!/bin/sh -
cd /
echo ""; echo "Rebuilding locate database:"
echo /usr/libexec/locate.updatedb | nice -5 su -m nobody 2>/dev/null
が実行されますが、
vi hoge.sh
#!/bin/sh
cd /
echo /usr/bin/ls
と書いて、実行権限も付けた後、
sh hoge.shとやっても
/usr/bin/ls
としか表示されませんでした。
lsが実行される事を期待したのですが...
0890名無しさん@お腹いっぱい。
2012/05/27(日) 10:56:49.10echoの出力をパイプで suに食わせているから結果的に echoの内容が実行される。
同じことをやりたいなら、
echo /usr/bin/ls | sh
だな。
ところでlsが/usr/binにあるって、、Solarisかよ。
0891名無しさん@お腹いっぱい。
2012/05/27(日) 13:02:22.30ありがとうございました!
0892名無しさん@お腹いっぱい。
2012/05/28(月) 04:48:06.45探してもcatでの例しかない
どなたか有効な使い方教えてくれませんか?
0893名無しさん@お腹いっぱい。
2012/05/28(月) 06:31:40.480894名無しさん@お腹いっぱい。
2012/05/28(月) 07:42:53.98過去の使い方でもいいので出来れば教えていただけませんか?
0895名無しさん@お腹いっぱい。
2012/05/28(月) 08:17:23.20xmodmap を実行するのにファイルを用意せずに実行する例。
xmodmap - <<EOF
remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L
EOF
0896名無しさん@お腹いっぱい。
2012/05/28(月) 08:20:13.78それは echoでできるので、ヒアドキュメントの有効な使い方じゃないですね。
echo 'remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L' | xmodmap -
0897名無しさん@お腹いっぱい。
2012/05/28(月) 09:29:22.95結局のところ標準入力にデータを流しこむ手段のひとつでしかないんだから、
基本的に echo や cat と変わらん。
「それは echo でできる」と言うのならぜんぶ echo でやればいいんじゃねーの?
↓は動かないけど、
date +'%Y %m %d' | read y m d
ヒアドキュメントを使った↓は動く。
read y m d<<eod
`date +'%Y %m %d'`
eod
違いなんてこの程度のものだ。
# ksh は前者も動く。
0898名無しさん@お腹いっぱい。
2012/05/28(月) 09:38:26.36それはヒヤドキュよりもeval使った方が簡単だな。
eval `date +'y=%Y m=%m d=%d'`
0899名無しさん@お腹いっぱい。
2012/05/28(月) 10:39:52.020900名無しさん@お腹いっぱい。
2012/05/28(月) 16:14:29.700901名無しさん@お腹いっぱい。
2012/05/28(月) 18:48:35.50大昔のUNIX プログラミング環境って本にはそんな感じで書いてあった記憶が。カーニハンとロブパイクのやつね。
0902名無しさん@お腹いっぱい。
2012/05/29(火) 00:24:27.940903名無しさん@お腹いっぱい。
2012/05/29(火) 06:38:30.30複数のスクリプトをひとまとめにして、メールで送る。受け取った側で実行すると複数のファイルの出来上がり。
cat <<EOF >file1
hogehoge
hogehoge
EOF
cat <<EOF >file2
fugafuga
fugafuga
EOF
0904名無しさん@お腹いっぱい。
2012/05/29(火) 08:20:04.290905名無しさん@お腹いっぱい。
2012/05/29(火) 09:44:38.22クォートを考える必要がある場合、パイプを避ける場合ですね。
ftp << EOF
yum install $1 << CONFIRM
wall <<
vi <<
一時ファイル作りますから完成時には消しますが、ブロックコメントは便利です。
: <<'#COMMENTBLOCK'
あと
exec 3<<EOF
`${command}`
EOF
としておいて、別のところで
while read line; do; done 0<&3 3<&-
>>900 ですよね。
sh -c 'lsof -a -p $$ -d0' << EOF
0906名無しさん@お腹いっぱい。
2012/05/29(火) 11:43:40.34変数の展開はしてくれるんで、別ファイルにするより便利な場面は多々ある。
0907名無しさん@お腹いっぱい。
2012/05/29(火) 17:11:18.160908名無しさん@お腹いっぱい。
2012/05/29(火) 18:26:47.270909名無しさん@お腹いっぱい。
2012/05/29(火) 18:50:14.82http://en.wikipedia.org/wiki/Shar
0910名無しさん@お腹いっぱい。
2012/05/29(火) 19:11:23.55初めて見た書式なんだけどこれってどういう意味なんです?
0911名無しさん@お腹いっぱい。
2012/05/29(火) 19:14:53.89http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html#lbBB
PIDFILE が設定されてないときは /var/run/example.pid を使う。
0912名無しさん@お腹いっぱい。
2012/05/29(火) 19:15:07.87変数PIDFILEを展開するが、もしセットされてなかった場合はデフォルトとして /var/run/example.pid を用いる。
それを pidfileという変数に代入している。
0913名無しさん@お腹いっぱい。
2012/05/29(火) 19:19:25.84$ PAGER='less -p:-' man sh
ちゃんと man に書いてはあるんだけど、
${parameter-word} そのものについては書いてなくて、
${parameter:-word} の説明とはちょっと離れたところに
: を省略した場合の動作が書いてあるんだよな。すげー探しづらい。
0914名無しさん@お腹いっぱい。
2012/05/29(火) 19:20:14.34サンクス!
勉強になりますた!
0915905
2012/05/29(火) 20:59:15.91while read line; do; done 0<&3 3<&-
でなく、
while read line; do; done 0<&3
exec 3<&-
0916名無しさん@お腹いっぱい。
2012/05/29(火) 21:09:48.080917名無しさん@お腹いっぱい。
2012/05/29(火) 21:58:40.26今はステマ用の単語でしか検索できない。
0918名無しさん@お腹いっぱい。
2012/05/30(水) 00:16:57.10以下のような文字列があります。
文字列を見ていき、文字「@」のある無しを配列に入れていきたいのですが、何かいい方法はないでしょうか。
・文字列
「△@△@△@△@△@△△@△」
空白(△)は文字「@」の前後に一つずつ入っています。
ただし、稀に連続で出現する場合があります。
?バイト目での「@」の出現有無を配列に格納したいです。
set -A ARRY △@△@△@△@△@△△@△
echo ${ARRY[11]}の結果で△を返したいのですが、
思い通りになりません。。。
シェルはkshです。よろしくお願いします。
0919名無しさん@お腹いっぱい。
2012/05/30(水) 03:18:00.71あるシェルスクリプトの中に、
rm -rf -- *;
という一文が有ったのですが、
--はどういう意味が有るのでしょうか?
0920名無しさん@お腹いっぱい。
2012/05/30(水) 07:34:45.47-で始まるファイルも消すためのオプション
0921名無しさん@お腹いっぱい。
2012/05/30(水) 08:19:35.68正確にはオプションの終わりを明示する為のものなんだけど、rmの場合は*が展開された時に-から始まるファイル名をオプションと認識しないことになるから、>>920のようにはたらく。
0922名無しさん@お腹いっぱい。
2012/05/30(水) 09:51:48.12バックグラウンドで実行させる為に以下のように書きましたが
service prog start で待機状態?になってしまいうまくいきません
daemon --pidfile=${pidfile} ${prog} ${conf} &
このようなケースではどういう風に書けばよいのでしょうか?
0923名無しさん@お腹いっぱい。
2012/05/30(水) 09:56:58.28daemon(シェル関数) 通す場合は & は要らん。
& なしで勝手に(制御端末切り離して)バックグラウンドになる。
逆に & 付けると動作がおかしくなるかも。
0924名無しさん@お腹いっぱい。
2012/05/30(水) 09:58:17.450925名無しさん@お腹いっぱい。
2012/05/30(水) 10:05:26.81man rm に載ってなかった?
0926名無しさん@お腹いっぱい。
2012/05/30(水) 10:15:58.35むむむ、それが&を抜いても制御が戻らないんです…
んー、なんでだろう
0927名無しさん@お腹いっぱい。
2012/05/30(水) 16:05:48.60その2で、sed使わないで置換できたら面白かったけど。2ch仕様の為、空白を・にしてます。
#!/bin/ksh
strings="${1:-・@・@・@・@・@・・@・}"
function・kekka・{
・・・for・((・n・=・0;・n・<・${#ARRY[@]};・n++・))・;・do
・・・・・・echo・-n・"配列${n}=${ARRY[$n]}・"
・・・done
・・・echo
}
#その1
for・((・n・=・0;・n・<・"${#strings}";・n++・))・;・do
・・・ARRY[$n]="${strings:$n:1}"
done
kekka;・echo
#その2
bufIFS=${IFS};・IFS=,
set・-A・ARRY・$(・echo・"${strings}"・|・sed・-e・'s/./&,/g'・)
IFS=${bufIFS}
kekka
0928927
2012/05/30(水) 19:17:37.42set -A ARRY ${strings//?/${.sh.match[0]},}
IFS=${bufIFS}
0929名無しさん@お腹いっぱい。
2012/05/30(水) 21:04:15.72顔文字がいっぱい。
0930名無しさん@お腹いっぱい。
2012/05/30(水) 21:55:29.14>>921
>>925
なるほど
-fというファイルが有った場合、
rm -fだと消せないので
rm -- -fとやるんですね。
0931927
2012/05/30(水) 22:47:57.45bash様で書けるのかと聞きたい。
+・)) kshすてき?
0932918
2012/05/30(水) 23:16:46.44それです!今試したらやりたいことが出来ました。
初見の機能ばかりで、いまいち詳細はよくわかってませんが^^;
シェルを見ながら使い方を覚えてみます。ありがとうございました。
0933名無しさん@お腹いっぱい。
2012/05/31(木) 02:15:46.91(cd $HOME/makedir; make)
の()は前後に空白を入れたり、;を最後のコマンドに入れたりしなくていいそうです。
{ command1; command2; .....; }
の{}は前後に空白を入れなければならないし、;を最後に入れないと行けないそうです。
なんででしょうか?
0934名無しさん@お腹いっぱい。
2012/05/31(木) 06:07:47.35{と}自体がコマンドだから。
0935名無しさん@お腹いっぱい。
2012/05/31(木) 07:20:21.59type { してみ。
0936名無しさん@お腹いっぱい。
2012/05/31(木) 10:40:58.430937名無しさん@お腹いっぱい。
2012/05/31(木) 10:47:30.140938名無しさん@お腹いっぱい。
2012/05/31(木) 11:21:46.530939933
2012/05/31(木) 22:58:07.09} is a shell keyword
type [
[ is a shell builtin
と出ました。
{ } がコマンドに近いもので、
()が文法に近いものという事はわかったのですが、
shell keywordとshell builtinって何が違うのでしょうか?
0940名無しさん@お腹いっぱい。
2012/05/31(木) 23:07:32.14コマンドだから行末もしくは ; の前までで一区切り。
shell keyword は行末とか ; を越えて働く。
0941934
2012/06/01(金) 07:49:01.20かわいそうになって来た。
これ読んでこい。
bash.cyberciti.biz/guide/Shell_commands
0942名無しさん@お腹いっぱい。
2012/06/01(金) 07:58:45.70>>941
リンク切れてた
tldp.org/LDP/abs/html/internal.html
0943名無しさん@お腹いっぱい。
2012/06/03(日) 22:27:24.72どういった動きをするんですかね?
0944名無しさん@お腹いっぱい。
2012/06/04(月) 06:49:51.27printenv HOGE HOGE=boke
みたいなことができる。
0945発狂寸前のなまはげ
2012/06/04(月) 09:34:49.32$ set -k
$ printenv HOGE HOGE=boke
boke
0946名無しさん@お腹いっぱい。
2012/06/04(月) 11:26:05.970947名無しさん@お腹いっぱい。
2012/06/04(月) 13:41:09.37>>945
0948名無しさん@お腹いっぱい。
2012/06/04(月) 13:51:59.430949名無しさん@お腹いっぱい。
2012/06/04(月) 13:57:59.74Illegal option -k
0950名無しさん@お腹いっぱい。
2012/06/04(月) 14:44:36.11これがあるとどんなときに嬉しいんだろ?
awk -v var=value ... というコマンドが実行できなくなるとか
デメリットしか思い浮かばないんだけど。
HOGE=fuga command という構文なんぞいらん、
必要なら env HOGE=fuga command でいいじゃねーか、と思ってるぐらいなのに、
さらに拡張する意義がさっぱりわからん。
0951名無しさん@お腹いっぱい。
2012/06/04(月) 17:27:54.381. まず、マニュアルを見る。もし環境変数について分からなければ、それも調べる。
bashで分からなければ、kshのマニュアルが分かりやすい。 http://uw714doc.sco.com/ja/man/html.1/ksh.1.html
> 旧式の -k オプションが設定されていると、....
2. set -k と、 set +k について試す。
$ echo a=b c
$ sh -c a=UNIX 'echo $a MAGAZINE'
>> 950 少なくとも、UNIX Version 7 の Bourne からあるようだ。Thompson shellは-t -cのみ。
http://www.tuhs.org/
>> 949 の sh は、Bourne Shell でなく、ash か dash じゃないか?
0952名無しさん@お腹いっぱい。
2012/06/06(水) 22:40:34.04既存のシェルスクリプトの動作内容の説明が課題になっているのですが
習い始めでコマンドすらまともに分からない状態なので、何が何やらさっぱりです
PCすらそんな使わないので、マニュアルみながらでも頭が弾けそうです・・
ここで質問すれば答えてもらえるでしょうか?殆ど丸投げになりそうですが。。
時間があれば1つ1つ学びながら進めたいんですが、何せ時間がないもんで;;
0953名無しさん@お腹いっぱい。
2012/06/06(水) 22:47:06.800954名無しさん@お腹いっぱい。
2012/06/06(水) 22:56:57.23お節介な誰かが課題解いてくれるっしょ
0955名無しさん@お腹いっぱい。
2012/06/06(水) 23:04:45.370956名無しさん@お腹いっぱい。
2012/06/06(水) 23:22:53.72いや>>939辺りからの流れ見てると
その答えが自分には答えになって無いほど難しく
自分の無知さで質問したら怒られそうだったので・・
0957名無しさん@お腹いっぱい。
2012/06/06(水) 23:25:33.740959名無しさん@お腹いっぱい。
2012/06/06(水) 23:41:54.35report6.tex から report6.dvi を作成する.
report6.dvi から report6.pdf を作成する.
xdvi により report6.dvi の内容を表示する.
report6.tex, report6.dvi, report6.pdfの各ファイルサイズを出力する。
というものです;;まだまだ動作説明とか沢山あるのに
オンラインマニュアルを参照しつつ3時間ほど悪戦苦闘しましたが
1つも進まず、正直泣きたい気分です。。。
既存のシェルは文長くなりすぎて書き込めませんが
0960名無しさん@お腹いっぱい。
2012/06/06(水) 23:48:43.77makeかomakeあたりで書くところだろという突っ込みはなし?
0961名無しさん@お腹いっぱい。
2012/06/06(水) 23:54:29.88dvipdfmx report6.dvi
xdvi report6.dvi
wc -c report6.tex, report6.dvi, report6.pdf
0962名無しさん@お腹いっぱい。
2012/06/07(木) 00:10:59.080963名無しさん@お腹いっぱい。
2012/06/07(木) 00:14:59.00本当にありがとう御座います。
それだけの物でもマニャアル読みながらだと中々書けない
以下の様なスクリプトの動作説明が8つぐらいあるのすが
#!/bin/sh
# remember - an easy command-line based memory pad
# search the results with 'remindme'
rememberfile="$HOME/.remember"
if [ $# -eq 0 ] ; then
echo "Enter note, end with ^D "
#ヒント:下記の cat の入力は標準入力です。入力の終了は空行で ^D を押します
cat - >> $rememberfile
else
echo "$@" >> $rememberfile
fi
人に聞かずにやるには限界です。。1歩も前に進まない。。
0964749
2012/06/07(木) 00:26:41.76動作説明ってこんな感じでいいのか?
>#!/bin/sh
>
># remember - an easy command-line based memory pad
># search the results with 'remindme'
>
>rememberfile="$HOME/.remember"
ファイル指定
>
>if [ $# -eq 0 ] ; then
引数がなければ
>echo "Enter note, end with ^D "
""内の文字列を表示
>#ヒント:下記の cat の入力は標準入力です。入力の終了は空行で ^D を押します
>cat - >> $rememberfile
キー入力を$HOME/.rememberに書き込み
>else
引数があれば
>echo "$@" >> $rememberfile
引数全体を$HOME/.rememberに書き込み
>fi
0965名無しさん@お腹いっぱい。
2012/06/07(木) 00:47:25.54正にその通りです。後4つが分かれば残りはそれらを参照すれば出来るそうですのでお願いします.
#!/bin/sh
# formatdir - output a directory listing
for file in *
do
if [ -d "$file" ]
then
size=`ls -1 "$file" | wc -l | sed 's/ //g'`
if [ $size -eq 1 ]
then
echo "$file ($size entry)"
else
echo "$file ($size entries)"
fi
else
size=`ls -l "$file" | sed 's/^[^ ]*[ ]*[^ ]*[ ]*[^ ]*[ ]*[^ ]*[ ]*\([0-9]*\)[^0-9].*/\1/'`
echo "$file ($size byte)"
fi
done
0966名無しさん@お腹いっぱい。
2012/06/07(木) 00:48:39.60# checkspelling - check the spelling of a word
spell="ispell -l" # if you have ispell installed instead
# if not, just define spell=spell or
# equivalent.
# ヒント
# "ispell -l" は標準入力から入力された単語(複数)から
# スペルの間違っている単語だけを出力します。
if [ $# -lt 1 ] ; then
echo "Usage: $0 word or words" >&2
exit 1
fi
for word in $*
do
test=`echo $word | $spell`
if [ -z "$test" ] ; then
echo "$word: spelled correctly."
else
echo "$word: misspelled."
fi
done
0967名無しさん@お腹いっぱい。
2012/06/07(木) 00:50:16.01# hilow - a simple number guessing game
biggest=100 # maximum number possible
guess=0 # guessed by player
guesses=0 # number of guesses made
number=`expr $$ % $biggest` # 1 から $biggest の間の乱数を生成
while [ $guess -ne $number ]
do
echo "Guess? "
read guess # read guess で guess 変数にキーボードから入力した値が入る
if [ $guess -lt $number ]
then
echo "... bigger!"
elif [ $guess -gt $number ]
then
echo "... smaller!"
fi
guesses=`expr $guesses + 1` # guesses の値を1増やしている
done
echo "Right!! Guessed $number in $guesses guesses."
0968名無しさん@お腹いっぱい。
2012/06/07(木) 00:50:59.66# remindme - search a datafile for matching lines, or show the contents
# of the datafile if no arg is specified
rememberfile="$HOME/.remember"
if [ $# -eq 0 ] ; then
less $rememberfile
else
grep -i "$@" $rememberfile | less
fi
0969名無しさん@お腹いっぱい。
2012/06/07(木) 01:06:04.28>for file in *
カレントディレクトリ内のすべてのファイル名、ディレクトリ名について繰り返し。fileには作業対象ファイル(ディレクトリ)名が入る。
>do
>if [ -d "$file" ]
$fileがディレクトリなら
>then
>size=`ls -1 "$file" | wc -l | sed 's/ //g'`
ディレクトリ内のファイル数を数える。
>if [ $size -eq 1 ]
ファイル数が1なら
>then
>echo "$file ($size entry)"
単数形で表示
>else
ファイルが複数あれば
>echo "$file ($size entries)"
複数形で表示
>fi
>else
ディレクトリじゃなければ
>size=`ls -l "$file" | sed 's/^[^ ]*[ ]*[^ ]*[ ]*[^ ]*[ ]*[^ ]*[ ]*\([0-9]*\)[^0-9].*/\1/'`
サイズの部分を切り出して
>echo "$file ($size byte)"
表示
>fi
>done
0970名無しさん@お腹いっぱい。
2012/06/07(木) 01:15:11.97>>965
018-formatdir.sh
>>966
025-checkspelling.sh
>>967
013-hilow.sh
>>968
023-remindme.sh
0971名無しさん@お腹いっぱい。
2012/06/07(木) 01:15:32.670972970
2012/06/07(木) 01:17:17.490973名無しさん@お腹いっぱい。
2012/06/07(木) 01:17:55.21>spell="ispell -l" # if you have ispell installed instead
スペルチェックに使うコマンドの指定。
># if not, just define spell=spell or
># equivalent.
>
>if [ $# -lt 1 ] ; then
引数の数が1より小さければ
>echo "Usage: $0 word or words" >&2
標準エラー出力に表示
>exit 1
スクリプト終了、終了コード1
>fi
>
>for word in $*
すべての引数について繰り返し
>do
>test=`echo $word | $spell`
$wordをspellに渡して
>if [ -z "$test" ] ; then
spellの結果が0文字なら
>echo "$word: spelled correctly."
スペルミスしてない
>else
スペルミスがあれば
>echo "$word: misspelled."
スペルミスしてるよ。
>fi
>done
0974名無しさん@お腹いっぱい。
2012/06/07(木) 01:23:30.94仰る通りです。。
このままではいけないのでこのような質問の仕方は今回限りにします
0975名無しさん@お腹いっぱい。
2012/06/07(木) 01:34:55.83>>968
>#!/bin/sh
>
># remindme - search a datafile for matching lines, or show the contents
># of the datafile if no arg is specified
>
>rememberfile="$HOME/.remember"
>
>if [ $# -eq 0 ] ; then
引数がなければ
>less $rememberfile
$rememberfileをそのまま表示
>else
引数があれば
>grep -i "$@" $rememberfile | less
引数で検索して表示
>fi
0976名無しさん@お腹いっぱい。
2012/06/07(木) 01:35:39.56ホントだ。。。
完全にココのコピペですね;;すげぇ
まぁ動作の解読が必要な事は変わりなさそうですね・・
0977名無しさん@お腹いっぱい。
2012/06/07(木) 08:06:36.420978名無しさん@お腹いっぱい。
2012/06/07(木) 08:16:19.330979名無しさん@お腹いっぱい。
2012/06/07(木) 11:46:48.750980名無しさん@お腹いっぱい。
2012/06/07(木) 11:48:46.00使い慣れたエディタで書けばいい。
0981名無しさん@お腹いっぱい。
2012/06/07(木) 12:03:36.22簡単な文法チェックもできるエディタ限定でお願いします
0982名無しさん@お腹いっぱい。
2012/06/07(木) 12:38:03.05秀丸使ったことないけど具体的にどんなところがいいの?
vimと比較したいです。
0983名無しさん@お腹いっぱい。
2012/06/07(木) 13:24:38.07キーバインドが標準的
文法チェックが出来る
インデントも正しく出来る
0984名無しさん@お腹いっぱい。
2012/06/07(木) 18:46:33.020985名無しさん@お腹いっぱい。
2012/06/07(木) 20:33:24.170986名無しさん@お腹いっぱい。
2012/06/07(木) 21:08:20.474200円っていう価格設定と実質日本人しか使ってないってのは痛い
0987名無しさん@お腹いっぱい。
2012/06/07(木) 22:46:48.130988名無しさん@お腹いっぱい。
2012/06/07(木) 22:58:20.08母数が3桁は違うだろ…現実みようぜ…
0989名無しさん@お腹いっぱい。
2012/06/07(木) 23:22:06.040990名無しさん@お腹いっぱい。
2012/06/07(木) 23:27:56.11>1
0991名無しさん@お腹いっぱい。
2012/06/07(木) 23:38:34.250993名無しさん@お腹いっぱい。
2012/06/07(木) 23:53:51.080994名無しさん@お腹いっぱい。
2012/06/08(金) 00:36:39.22シェルスクリプト総合 その20
http://toro.2ch.net/test/read.cgi/unix/1339083351/
0996名無しさん@お腹いっぱい。
2012/06/08(金) 06:30:13.260997名無しさん@お腹いっぱい。
2012/06/08(金) 09:49:09.320998名無しさん@お腹いっぱい。
2012/06/08(金) 09:49:49.790999名無しさん@お腹いっぱい。
2012/06/08(金) 12:17:47.62俺秀丸使いだよ
1000名無しさん@お腹いっぱい。
2012/06/08(金) 12:18:03.1910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。