シェルスクリプト総合 その7
■ このスレッドは過去ログ倉庫に格納されています
0001ミスターシェル
2006/09/07(木) 13:00:11スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
0164名無しさん@お腹いっぱい。
2006/10/18(水) 11:20:16だめ。
echo ${hoge1} と echo $hoge1 は全く同じ。
echo "$hoge1" と同じなのは、echo "${hoge1}"
0165名無しさん@お腹いっぱい。
2006/10/18(水) 11:24:00zsh 使ってるんじゃない?
zsh だと、$hoge2 と書いても "$hoge2" と同じに解釈される糞仕様なので、、、
shかbashでやってみろ。
0166名無しさん@お腹いっぱい。
2006/10/18(水) 11:41:140167名無しさん@お腹いっぱい。
2006/10/18(水) 11:44:17どうしたの?
0168名無しさん@お腹いっぱい。
2006/10/18(水) 13:51:26ファイルに ID,ファイル名,1,sed7s/(正規表現)正規表現/正規表現/',と並べてます
for LINE in ${LINE} ; do
IFS=','
FILE="$1"
SW="$2"
CMD="$3"
case $SW in
"0" )
コピーするだけ。;;
"1" )
cat $FILE | $CMD" > hogehoge ;;
esac
done <ファイル
echo "$hoge1" | grep "$keyword"
done <FILE
どやってみたのですがうまくいきません。
設定ファイル上にかかれた正規表現や変数を含むコマンドを実行するには
どうしたらよいのでしょうか?
0169名無しさん@お腹いっぱい。
2006/10/18(水) 13:52:49>echo "$hoge1" | grep "$keyword"
>done <FILE
0170名無しさん@お腹いっぱい。
2006/10/18(水) 14:30:50EAST,01,blue,192.168.1.1,3:1
EAST,03,blue,192.168.1.1,3:2
EAST,05,green,192.168.1.2,3:3
EAST,03,green,192.168.1.2,3:8
EAST,05,red,192.168.1.3,3:12
syslog02# cat 2ch_sh
#!/usr/local/bin/bash
IFS=$'';SORT=(`cat $1 | sort -t, -k3`)
IFS=$'';UNIQ=(`cat $1 | sort -t, -k3 | awk -F , '{print $3 }' | uniq`)
for keyword in "$UNIQ"
do
echo "$SORT" | grep "$keyword"
echo test (本当はここでファイルを作成したい)
done
------------
0171名無しさん@お腹いっぱい。
2006/10/18(水) 14:33:46syslog02# ./2ch_sh list.txt
EAST,01,blue,192.168.1.1,3:1
EAST,03,blue,192.168.1.1,3:2
test
EAST,05,green,192.168.1.2,3:3
EAST,03,green,192.168.1.2,3:8
test
EAST,05,red,192.168.1.3,3:12
test
【現実】
syslog02# ./2ch_sh list.txt
EAST,01,blue,192.168.1.1,3:1
EAST,03,blue,192.168.1.1,3:2
EAST,05,green,192.168.1.2,3:3
EAST,03,green,192.168.1.2,3:8
EAST,05,red,192.168.1.3,3:12
test
0172名無しさん@お腹いっぱい。
2006/10/18(水) 19:00:48全然駄目。shの文法を読み直す。set -xで動作を追跡することを憶える。
その上で判らない場合に出直しなさい。
条件もダメダメだし。(sed7sってなんだよ。'が閉じてねーぞ)
> ファイルに ID,ファイル名,1,sed7s/(正規表現)正規表現/正規表現/',と並べてます
0173名無しさん@お腹いっぱい。
2006/10/18(水) 20:25:31/backup/apl -mtime +6 -exec rm {} \;
上記のようい週次バックアップしています。
これを、直近のデータのみリストアする場合、
(最新のデータのみで、あとはいらない)
どのような表現を使えばいいのでしょうか?
0174名無しさん@お腹いっぱい。
2006/10/18(水) 21:20:47それでできるはず。ちゃんとbash使ってる?
0175名無しさん@お腹いっぱい。
2006/10/18(水) 22:02:08for keyword in "$UNIQ"
でそもそも複数行一括で処理するような気がする
0176名無しさん@お腹いっぱい。
2006/10/18(水) 22:04:510177名無しさん@お腹いっぱい。
2006/10/19(木) 03:50:14file
--------------------------------------------------
hoge:0:
hoge:1:sed "s/a\\(b\\)c\\(de\\)f/x\\1y\\2z/":
hoge:1:sed 's/a\(b\)c\(de\)f/x\1y\2z/':
-------------------------------------------------
hoge
------------------------------------------------
abcdef
------------------------------------------------
#!/bin/sh
while read LINE ;do
IFS=':'
set -- ${LINE}
FILE=$1
SW=$2
CMD=$3
case $SW in
"0" )
echo HOGE ;;
"1" )
cat $FILE | $CMD >hogehogehoge;;
esac
done <file
0178名無しさん@お腹いっぱい。
2006/10/19(木) 03:51:43+ read LINE
+ IFS=:
+ set -- hoge 0
+ FILE=hoge
+ SW=0
+ CMD=
+ case $SW in
+ echo HOGE
HOGE
+ read LINE
+ IFS=:
+ set -- hoge 1 'sed "s/a\(b\)c\(de\)f/x\1y\2z/"' ' '
+ FILE=hoge
+ SW=1
+ CMD='sed "s/a\(b\)c\(de\)f/x\1y\2z/"'
+ case $SW in
+ cat hoge
+ 'sed "s/a\(b\)c\(de\)f/x\1y\2z/"'
./hogehoge: line 13: sed "s/a\(b\)c\(de\)f/x\1y\2z/": No such file or directory
0179名無しさん@お腹いっぱい。
2006/10/19(木) 03:52:19+ IFS=:
+ set -- hoge 1 'sed '\''s/a(b)c(de)f/x1y2z/'\''' ' '
+ FILE=hoge
+ SW=1
+ CMD='sed '\''s/a(b)c(de)f/x1y2z/'\'''
+ case $SW in
+ cat hoge
+ 'sed '\''s/a(b)c(de)f/x1y2z/'\'''
./hogehoge: line 13: sed 's/a(b)c(de)f/x1y2z/': No such file or directory
+ read LINE
+ IFS=:
+ set --
+ FILE=
+ SW=
+ CMD=
+ case $SW in
+ read LINE
0180名無しさん@お腹いっぱい。
2006/10/19(木) 03:53:51どう改善すればよいのでしょうか
./hogehoge: line 13: sed "s/a\(b\)c\(de\)f/x\1y\2z/": No such file or directory
0181名無しさん@お腹いっぱい。
2006/10/19(木) 11:10:31そのエラーメッセージの意味がわかるように中学からやり直す。
0182名無しさん@お腹いっぱい。
2006/10/19(木) 11:22:15訳してみましたが、意味がわかりません。
0183名無しさん@お腹いっぱい。
2006/10/19(木) 12:18:27cat $FILE | $CMD >hogehogehoge;;
$CMDの部分に実行できるコマンドを代入するほうほうはないでしょうか?
0184名無しさん@お腹いっぱい。
2006/10/19(木) 12:38:08お約束の、catが無駄です。
0185名無しさん@お腹いっぱい。
2006/10/19(木) 12:41:53ないと言っているのがそのエラーメッセージ。
「sed」コマンドに引数「"s/a\(b\)c\(de\)f/x\1y\2z/"」を与えるのがやりたい
ことだろうがそうはなっていないわけだ。
で、どうしてそういうことになってるかは >>162 で引用されているシェルの
マニュアルの単語分割のところをよく読め。特にお前さんの場合はIFSを
いじっているのでそこらへんも効いている。
0186名無しさん@お腹いっぱい。
2006/10/19(木) 14:15:13eval はどうよ
0187名無しさん@お腹いっぱい。
2006/10/19(木) 14:32:12よくわからずに eval 使うより
>>185 あたりを理解するのが先だな。
0188名無しさん@お腹いっぱい。
2006/10/19(木) 23:37:29↓ 日本語訳
貝???
0189名無しさん@お腹いっぱい。
2006/10/20(金) 02:09:28ありがとう。 Cygwinでは改行コードで怒られます。
#!/bin/sh
IFS=','
while read FILE SW CMD
do
case $SW in
"0" )
echo HOGE ;;
"1" )
cat $FILE | eval $CMD >hogehogehoge;;
esac
done <file
file
-------------------
hoge,0,
hoge,1,sed 's/a\\(b\\)c\\(de\\)f/x\\1y\\2z/',
-------------------
hoge
--------------------
abcdef
------------------
hogehogehoge
------------------
xbydez
-------------------
0190名無しさん@お腹いっぱい。
2006/10/20(金) 02:12:15という事でしょうか。
0191名無しさん@お腹いっぱい。
2006/10/20(金) 08:31:26ちょっと違います。
0192名無しさん@お腹いっぱい。
2006/10/20(金) 09:37:21かなり違います。
0193名無しさん@お腹いっぱい。
2006/10/20(金) 11:11:24つ <
0194名無しさん@お腹いっぱい。
2006/10/20(金) 15:21:56無駄ではないかもしれない。
0195名無しさん@お腹いっぱい。
2006/10/20(金) 16:21:00その可能性はあり得ない。
>>189 で
while read FILE SW CMD
↑
って書いてるから。よってやはり「catが無駄です」
0196名無しさん@お腹いっぱい。
2006/10/21(土) 18:07:530197名無しさん@お腹いっぱい。
2006/10/21(土) 19:36:020198名無しさん@お腹いっぱい。
2006/10/23(月) 04:40:19シェルスクリプトならでは、という美しいサンプルはどの辺に行けば見れますか?
0199名無しさん@お腹いっぱい。
2006/10/23(月) 06:36:280200名無しさん@お腹いっぱい。
2006/10/23(月) 08:28:020201名無しさん@お腹いっぱい。
2006/10/23(月) 11:14:520202名無しさん@お腹いっぱい。
2006/10/23(月) 13:45:430203名無しさん@お腹いっぱい。
2006/10/23(月) 16:20:35unalias vi
という行を追加しました。というのは、ディフォルトのviだと、文字が緑ではなく、いろんな色でカラフルに
表示されるので、unaliasしてみたら、緑一色で表示できたので。
これでviは快適に使えるようになったのですが、別の問題が起こりました。
それは、bashを起動して別のシェルを動かした場合に.bashrcがもう一度実行されるので、
既にviはunaliasされているにもかかわらず、再度unaliasしようとして以下の警告が表示されます。
bash: line 49: unalias: vi: not found
警告が出ても、処理は問題なくできるので、気にしなければ、いいのですが、
でも気になるので、何か良い解決方法を教えてください
よろしく。
0204名無しさん@お腹いっぱい。
2006/10/23(月) 16:42:00単に
alias vi=
の行を.bashrcから削除すりゃいいのでは、と思ったが、
/etc/のどこかで定義されてるのかねぇ。
alias | grep '^alias vi=' >/dev/null && unalias vi
0205名無しさん@お腹いっぱい。
2006/10/23(月) 16:44:520206名無しさん@お腹いっぱい。
2006/10/23(月) 16:46:31~/.bash_profile に書けば?
0207名無しさん@お腹いっぱい。
2006/10/23(月) 16:48:110208名無しさん@お腹いっぱい。
2006/10/23(月) 16:49:48続きはこっちで。
くだらねえ質問はここに書き込め! Part 133
http://pc8.2ch.net/test/read.cgi/linux/1160894184/
0209名無しさん@お腹いっぱい。
2006/10/23(月) 16:53:27お前頭いいな
0210名無しさん@お腹いっぱい。
2006/10/23(月) 18:12:39それするくらいなら、
unalias vi 2> /dev/null
でいいじゃん。メッセージを捨てるだけ。
0211名無しさん@お腹いっぱい。
2006/10/23(月) 18:44:40この方法で解決しました。
ありがとございます。
0212名無しさん@お腹いっぱい。
2006/10/24(火) 10:14:07>>165
> zsh だと、$hoge2 と書いても "$hoge2" と同じに解釈される糞仕様なので、、、
setopt SH_WORD_SPLIT あるいは明示的に${=hoge2}とする。
0213名無しさん@お腹いっぱい。
2006/10/25(水) 16:35:32第二フィールドがhh:mm:ss
第三フィールドが""で囲まれたアカウント名
となっている。
「アカウント名が重複しているものは、その最新日付のみを残して、
他の重複行はすべて削除」
という具合にしたい。
uniqを使えばいいのかもわからないが、やっぱりわからない。
どうすればいいだろう。
08/11/2006 14:29:50 "yamamoto"
03/03/2006 06:40:53 "yamada"
05/17/2005 07:45:07 "yamada"
07/13/2005 04:18:04 "yamada"
07/13/2005 13:17:56 "yamada"
08/04/2005 11:03:05 "yamada"
08/11/2005 05:54:56 "yamada"
08/11/2004 07:58:53 "yamada"
12/07/2005 13:54:19 "yamada"
12/22/2005 00:26:49 "yamada"
08/05/2005 02:48:41 "kinosita"
08/05/2005 11:49:58 "kinosita"
08/05/2004 11:51:45 "kinosita"
08/06/2005 04:55:50 "kinosita"
02/21/2005 16:34:40 "akie"
02/21/2006 17:20:21 "akie"
02/21/2006 17:22:56 "akie"
02/21/2005 17:41:45 "akie"
02/21/2005 17:47:14 "akie"
0214名無しさん@お腹いっぱい。
2006/10/25(水) 16:40:07こんなんシェルスクリプトでやりたくないな。
perl かなんかで。
0215名無しさん@お腹いっぱい。
2006/10/25(水) 16:43:130216名無しさん@お腹いっぱい。
2006/10/25(水) 16:54:59シェルで簡単にできるよ。
ちょっとパイプが多段だけど。
↓
while read dt tm user
do
echo $dt $tm `date +%s -d "$dt $tm"` $user
done | sort -nr | uniq -3 | while read dt tm sec user
do
echo $dt $tm $user
done
ポイントは、dateで単純な秒数に変換する前処理をしてから
フィールドスキップして uniq すること。
その後で秒数フィールドを削除して元に戻してる。
GNU dateが必要かも知れない。
perl とか 連想配列とか言ってる香具師は弱もの。
0217名無しさん@お腹いっぱい。
2006/10/25(水) 16:59:540218名無しさん@お腹いっぱい。
2006/10/25(水) 17:04:25perlなどでやったほうがお手軽なんですね。
覚えがあるのがshellだけなので、やむをえず・・・。
Cygwinじゃdate -dでエラーになるので、FreeBSDで試してみます。
0219名無しさん@お腹いっぱい。
2006/10/25(水) 17:08:53こんな俗物に頼る方が、頭がヨワイ。
0220名無しさん@お腹いっぱい。
2006/10/25(水) 17:13:4208/11/2006 14:29:50
を、
2006/08/11 14:29:50
に変換する前処理を入れれば、
date使わなくても >>216 の方法で行けるよ。
>>216 って短時間に良くこんなシェルスクリプト組めますね。
さてはかなりのプロと見た。
0221名無しさん@お腹いっぱい。
2006/10/25(水) 17:33:44>done | sort -nr | uniq -3 | while read dt tm sec user
sort -k 3 -nrだろう
0222名無しさん@お腹いっぱい。
2006/10/25(水) 17:36:56まちがえた
0223名無しさん@お腹いっぱい。
2006/10/25(水) 17:37:14それだと名前の順序が変わるから
> その最新日付のみを残して、他の重複行はすべて削除
を満たさない。
それと、uniq ではスキップするフィールドを指定するんだから uniq -2 だし、
uniq が削除するのは連続した場合だから名前フィールドでの sort も必要。
0224名無しさん@お腹いっぱい。
2006/10/25(水) 17:38:32いや、uniq -3 は合ってるよ。1フィールドを追加してるから。
0225名無しさん@お腹いっぱい。
2006/10/25(水) 17:41:18あ、そうか。ゴメン。
0226名無しさん@お腹いっぱい。
2006/10/25(水) 17:44:00sort -nr | uniq -3 で最新日付だけ残して
最後に頭のフィールドを削除するのが奇麗だな。
0227名無しさん@お腹いっぱい。
2006/10/25(水) 17:46:13頭のフィールドはuserだろう
0228名無しさん@お腹いっぱい。
2006/10/25(水) 17:54:12確かに。時間毎にユーザーがバラバラな場合も考慮するとそうだな。
0229名無しさん@お腹いっぱい。
2006/10/25(水) 18:24:51sed 's,^[[:space:]]*\([0-9][0-9]*\)[[:space:]]*\([0-9][0-9]*\)/\([0-9][0-9]*\)/\([0-9][0-9]*\)[[:space:]]*\([^[:space:]][^[:space:]]*\)[[:space:]]*\(.*\),\6 \4/\2/\3 \5 \1 \6,' | \
sort -r | uniq -4 | sort +3n | \
sed 's,^\([^[:space:]]*\)[[:space:]]*\([0-9][0-9]*\)/\([0-9][0-9]*\)/\([0-9][0-9]*\)[[:space:]]*\([^[:space:]][^[:space:]]*\).*,\4/\2/\3 \5 \1,'
0230名無しさん@お腹いっぱい。
2006/10/25(水) 19:17:160231名無しさん@お腹いっぱい。
2006/10/25(水) 19:25:04シェルスクリプトでの回答例が出ている後でそんなこと言っても,みっともないだけw
0232名無しさん@お腹いっぱい。
2006/10/25(水) 19:28:24while read dt tm user; do
echo $dt $tm $user `date +%s -d "$dt $tm"` $user
done |sort -k 3 -r |uniq -4 |cut -d" " -f 1-3
0233名無しさん@お腹いっぱい。
2006/10/25(水) 19:38:07date の -d オプションは標準ではない
入力ファイルの順序が保存されてない
0234名無しさん@お腹いっぱい。
2006/10/25(水) 20:08:50dateを使わない方法は >>220 が示している。
入力ファイルの順序は、もともとの質問では問うていない。
0235名無しさん@お腹いっぱい。
2006/10/25(水) 20:30:23> dateを使わない方法は >>220 が示している。
>>219-220 抜かしたらまとめにならんだろ。
> 入力ファイルの順序は、もともとの質問では問うていない。
元の質問は「他の重複行はすべて削除」ね。入力ファイルから重複行を削除した
ものは当然に入力ファイルの順序が保存されてる。
順序を変えていいのは順序は問わないと明記されてる場合だけ。
0236名無しさん@お腹いっぱい。
2006/10/25(水) 20:44:28各ユーザ毎に最新時刻の行だけを抜き出したら、
それらの行全体が時刻順にソートされていた方が都合がいいだろう。
そういう意味でも、たまたま入力された順序にユーザーが並ぶ必要は全くない。
0237名無しさん@お腹いっぱい。
2006/10/25(水) 21:17:5009/09/2001 00:00:00 "name"
09/10/2001 00:00:00 "name"
0238名無しさん@お腹いっぱい。
2006/10/26(木) 00:59:01抽出させたい文字列が二つあります。
一回の sed で二つの出力を二つの変数に入れるのにはどうしたらいいですか?
なんか read を使えばできそうな感じなのですが、
なかなか難しくてできていません。
0239名無しさん@お腹いっぱい。
2006/10/26(木) 01:48:30sed でどう出力するのか分からんけど
パイプを使って代入しても意味が無いから気をつけろ。
sed '処理' | read a b
とかやっても a や b の中身はパイプの中でしか
参照できない。
0240名無しさん@お腹いっぱい。
2006/10/26(木) 01:53:16とかかね?
0241名無しさん@お腹いっぱい。
2006/10/26(木) 02:09:020242238
2006/10/26(木) 03:53:46サブプロセスの中の変数にしか影響を与えない場合が
あるとかなんとかで(>>239 さんの言ってることですね)、
exec 使ってリダイレクションをかえるとかそういうのに挑戦しましたが
生半可な知識ではたちうちできず、
結局別の方法で逃げました。
>>240 さんの方法は今回は使えませんでしたが勉強になりました。
いやー難しい。
0243名無しさん@お腹いっぱい。
2006/10/26(木) 08:14:10不思議だ
0244名無しさん@お腹いっぱい。
2006/10/26(木) 09:40:15改良してまとめた
while read dt tm user; do
printf "%s %015d %s\n" $user `date +%s -d "$dt $tm"` $user;
done |sort -nr |uniq -2 |while read user sec user1; do
echo `date "+%m/%d/%Y %T" -d "1970-01-01 00:00:00 UTC $sec sec"` $user;
done;
0245名無しさん@お腹いっぱい。
2006/10/26(木) 10:32:492 回目の read はいらんだろ。変換前の値もつけとけばいい。
しかし、なんで標準外の date の -d オプションにこだわるんだ?
while read dt tm user; do
tmp=${dt%/*}; x=${tmp#*/}
echo $user ${dt##*/}/${dt%%/*}/$x $tm $dt $tm $user
done | sort -r | uniq -f 5 | cut -d ' ' -f 4-
入力順も保存したいなら
cat -n |
while read num dt tm user; do
tmp=${dt%/*}; x=${tmp#*/}
echo $user ${dt##*/}/${dt%%/*}/$x $tm $num $dt $tm $user
done | sort -r | uniq -f 6 | sort -nk 4 | cut -d ' ' -f 5-
0246名無しさん@お腹いっぱい。
2006/10/27(金) 22:48:53一方にしか存在しないフィールドはそのまま出力し、
それ以外は第二フィールドを B に変更したいのです。
例えば次のようなファイルを:
foo 0
bar 0
--
foo 1
qux 1
次のように:
foo 1
bar 0
qux 1
順序は不同なのでソートしちゃっても構いません。
どのような方法があるでしょうか?
0247名無しさん@お腹いっぱい。
2006/10/27(金) 23:33:05uniq
uniq -d
を使って適当に。
0248名無しさん@お腹いっぱい。
2006/10/28(土) 17:24:58join(1) あたりで出来るかと思ったんですが、いまいち上手くいかないorz
もう少し頑張ってみます。
0249名無しさん@お腹いっぱい。
2006/10/28(土) 20:20:34sed -e "s/\([^ ]*\).*/& \1/;" |sort -r |uniq -3 |cut -d" " -f 1,3
0250名無しさん@お腹いっぱい。
2006/10/29(日) 08:35:390251名無しさん@お腹いっぱい。
2006/10/29(日) 09:16:24美容版の糞コテ「たお」は自慢大好き
その自慢もたいしたこと無いのに得意気で
見ててとても痛い糞コテ
批判に対しては必ず長レスで的外れに噛み付いてくる
とっても哀れなやつ
http://life7.2ch.net/test/read.cgi/diet/1158326490
0252名無しさん@お腹いっぱい。
2006/10/30(月) 16:26:50mm=80; nn=3;
pp=`printf "%0${nn}d" 0`;
for ((aa=0; aa<$mm; aa++)); do
bb[$aa]=$pp$aa;
done;
for ((aa=-$nn; aa<0; aa++)); do
for ((aa1=0; aa1<$mm; aa1++)); do
echo -n ${bb[$aa1]:$aa:1};
done;
echo;
done;
0253名無しさん@お腹いっぱい。
2006/10/30(月) 18:29:51脈絡なく何を言いたいかわからんが、
zsh依存乙。
bashですら動かない依存スクリプトは、Bourne-sh互換に書き直して出直すこと。
0255名無しさん@お腹いっぱい。
2006/10/31(火) 01:16:24俺の環境ではこうなったが、これでいいのか?
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000001111111111222222222233333333334444444444555555555566666666667777777777
01234567890123456789012345678901234567890123456789012345678901234567890123456789
$ bash --version
GNU bash, version 3.1.17(9)-release (i686-pc-cygwin)
0256名無しさん@お腹いっぱい。
2006/11/01(水) 17:56:320257名無しさん@お腹いっぱい。
2006/11/01(水) 18:10:02文字列でパイプライン組み立ててevalしる
0258名無しさん@お腹いっぱい。
2006/11/02(木) 09:32:240259名無しさん@お腹いっぱい。
2006/11/05(日) 01:14:11たとえば
% hoge /usr/local/bin
bin
% hoge ~/etc
etc
% pwd
/usr/local/bin
% hoge ..
local
みたいな。
0260名無しさん@お腹いっぱい。
2006/11/05(日) 01:18:310261名無しさん@お腹いっぱい。
2006/11/05(日) 01:23:010262名無しさん@お腹いっぱい。
2006/11/05(日) 01:37:000263名無しさん@お腹いっぱい。
2006/11/05(日) 13:35:39% echo $hoge:r
/usr/local/bin/allneeded
% echo $hoge:t
allneeded
csh/tcsh/zsh だがね。sh だったら basename だろ?
■ このスレッドは過去ログ倉庫に格納されています