シェルスクリプト相談室at TECH
シェルスクリプト相談室 - 暇つぶし2ch900:デフォルトの名無しさん
08/05/24 03:42:38
>>899
まず出力結果に至るルールを書かんかい
求めたいものが直積とは限らんからな

901:デフォルトの名無しさん
08/05/24 07:53:29
A="a b"
B="c d"
for a in $A; do for b in $B; do echo $a $b; done; done

902:899
08/05/24 12:08:55
>>900
やりたいことは"シェルをテストする"ためのシェルを考えてる。
テストしたいシェルに引数を与えて出力結果を別ファイルに出力する。
シェルはkシェル。
OK?

>>901
サンク
あと、引数にスペース(空白)も含めたいんだけど
A=a b スペース(空白)
A=c d スペース(空白)

出力結果
a c
a d
a
b c
b d
b
c
d

よろしくです

903:デフォルトの名無しさん
08/05/24 12:14:32
A="a:b::"
B="c:d::"

OLDIFS=$IFS
IFS=:
for a in $A; do for b in $B; do echo $a $b; done; done
IFS=$OLDIFS

頭に蛆でもわいてるのか

904:899
08/05/24 12:37:21
>>903
おぉーはぇー
サンク!
おめ~口は悪いけど面倒見の良いエロイ椰子だな
ありがと!

905:デフォルトの名無しさん
08/05/25 07:32:25
scriptの中から呼び出されたprogramの処理が終了していることを
知るにはどうしたらいいですか?

906:デフォルトの名無しさん
08/05/25 08:09:45
kill -0 $! && echo alive

907:デフォルトの名無しさん
08/05/25 08:55:38
thx!

908:デフォルトの名無しさん
08/05/25 23:52:01
root以外で動かすスプリクト内で特定のファイルをchownで所有者を
変更したいんだけsudoもexpectも使わずにできる?

909:デフォルトの名無しさん
08/05/26 00:07:45
Linuxのようにスクリプトのsetuidを無視する環境なら、
スクリプトを呼ぶだけの実行ファイルを作ってそっちをsetuidする。


910:デフォルトの名無しさん
08/05/29 23:13:02
tarファイル内のデレクトリとかファイルをリネームできる?
あるいはリネームしながら展開できる?

911:デフォルトの名無しさん
08/05/30 01:05:16
>>910
スレ違い。アーカイバ関連のスレで訊くべし

912:デフォルトの名無しさん
08/05/30 01:17:12
この板的には、tarのフォーマットを調べて、
リネームするツールを作ろうという趣旨かも。
しかしスレ違いか。

913:デフォルトの名無しさん
08/05/30 01:42:54
特定の名前対応付けファイルにしたがって、
一旦目的のファイル/ディレクトリを展開して
mvで目的の場所にリネーム移動させるものを
つくるというスクリプトならかろうじて・・・


そこまでの意図はないと思うが。

914:デフォルトの名無しさん
08/05/30 01:51:43
ヘッダー情報だけ書き換えて展開は本物のtarにやらせれば良い。
前の勤務先で作ったときは50行(perl)くらいで出来たような気がする。

915:デフォルトの名無しさん
08/05/30 20:04:48
文字列中のスペースをエスケープシーケンス付けて"\ "に変換する
スクリプトを作りたいのですが、どうしたら良いでしょう?
sed を使うと連続スペースを
1つのスペースとして扱われてしまい上手く行きません。

"sample sample"(スペース2以上) っていう文字列を "sample\ \ sample"にしたい。

916:デフォルトの名無しさん
08/05/30 22:28:33
~$ echo "sample sample" | sed -e 's/ /\\ /g'
sample\ \ sample


917:デフォルトの名無しさん
08/05/30 22:44:45
>916
あれ、それで行きます?ってか家のCygwin上でも出来てるな
これでも出来なくて、2~3時間いろいろ試して、うんうん唸ってたんですが、
バージョンや処理系で動作がちがうとかないですよね・・・
月曜にリトライします。なんか馬鹿やったかな?

918:デフォルトの名無しさん
08/05/30 22:51:54
>>917
gが付いてなかったんじゃないのか?

919:デフォルトの名無しさん
08/05/30 23:25:04
いや、そういうのではなく、記憶が確かなら

echo "sample     sample" | sed -e 's/ /:/g'
(sampleの間は連続半角スペースね)
ってやったら、

"sample:sample" スペースを一つとして扱われた
みたいな結果しか帰ってこなかったんだけど。
何かを間違えたんだろうね多分。なにを間違えたやら。

920:デフォルトの名無しさん
08/05/31 02:59:01
ubuntu@ubuntu-desktop:~$ echo "sample sample" | sed -e 's/ */:/g'
sample:sample

921:デフォルトの名無しさん
08/05/31 03:01:29
勘違いす。>>920は消去。

922:デフォルトの名無しさん
08/05/31 03:30:54
#!/usr/bin/fontforge

仲間に入れてもらえますか?

923:デフォルトの名無しさん
08/06/04 22:42:10
相談に乗ってちゃぶ台!

任意のディレクトリ下の全てのファイルの更新日時を
フルパスで1行づつ取得したい。また更新日時をyyyymmdddHHMMSSで
取得したい。

例)
/home/usr01/aaa/bbb.txt 20080101125525
/home/usr01/aaa/ccc.tar 20080123195530
/home/usr02/ddd.txt 20070811210121
/home/usr03/eee/fff/ggg/hhh/jjj.cfg 20060301042133

よろしくお願いします、みなさん

924:デフォルトの名無しさん
08/06/04 23:14:40
簡単すぐるからパス

925:デフォルトの名無しさん
08/06/04 23:59:00
OSによっては簡単すぐるけど、一般にはそうでもないし、perlが最適だったりもする

>>923
OSを明かした方が適切な回答があるかもよ

926:デフォルトの名無しさん
08/06/05 00:09:17
> 924,925
レス、さんく
とりあえず find でフルパスは取得できよ。
あと、タイムスタンプなんだよね。
OSはAIXでkshでつ

927:デフォルトの名無しさん
08/06/05 01:22:49
AIXは、statもないし、lsに-Tもないんじゃないかな。
テキストファイルだけなら diff -c で /dev/null と比較して、
先頭の行を加工すれば何とか取得できるかもしれない。

けど、perl をすすめる。

928:デフォルトの名無しさん
08/06/05 01:39:28
>927
ありがと
よく似たコマンドでistatってのがあったけど
月表示が英語なのよ・・・

$ istat bbb
デバイス 10/8 上の Inode 89 ファイル
保護 : rw-r--r--
所有者 : 8(*****) グループ : 0(system)
リンク・カウント : 1 長さ 4 バイト

最後の更新: Thu Jun 5 01:35:24 JST 2008
最後の修正: Thu Jun 5 01:35:24 JST 2008
最後のアクセス: Thu Jun 5 01:35:24 JST 2008

929:デフォルトの名無しさん
08/06/05 02:12:17
ひとつ教えてください。
ファイルからデータを収集して
txtファイルに出力するようなシェルを作成しているのですが
整形がうまくいきません。

touch test.txt
echo "ABCDEF 1_0_2_3" >> test.txt
echo "LMN 3_2_4_5" >> test.txt

当然中身は
ABCDEF 1_0_2_3
LMN 3_2_4_5
となるんですが

ABCDEF 1_0_2_3
LMN 3_2_4_5
としたいんです。

何かいい方法ありませんか?
tabのような整形方法を考えたんですがうまく揃わないので
文字数指定する方法あれば教えていただきたいんですが。。。
(C言語のprint文での %10s のようなのができれば理想ですが)

930:デフォルトの名無しさん
08/06/05 02:12:56
ずれーたorz
番号のところが揃うようにしたいです。
ご教授ください。

931:デフォルトの名無しさん
08/06/05 02:14:20
なら、12種類しかないんだから、caseで分岐して、
一致した月の数字を返すっていう関数書けばいいんじゃ?


932:デフォルトの名無しさん
08/06/05 02:20:01
>>929
OSによっては、まさにprintfがあるけどな。

933:デフォルトの名無しさん
08/06/05 02:24:10
# echo "ABCDEF 1_0_2_3" | gawk "{printf(\"%10s %s\n\",\$1,\$2);}" > test.txt
# echo "LMN 3_2_4_5" | gawk "{printf(\"%10s %s\n\",\$1,\$2);}" >> test.txt
# cat test.txt
  ABCDEF 1_0_2_3
    LMN 3_2_4_5



934:デフォルトの名無しさん
08/06/05 02:24:20
ファイルの比較するシェルを作りたいのですが、
うまくいきません。

file_list.txt
-- 内容 --
ABC
DEF
GHI


このファイルとフォルダ内の内容が一致するかチェックしたいのですが
何かいい方法ありませんか?

ls -Rをtxtファイルに吐き出してcmpを使う方法と
read line使った後ls -Rとgrepをつかって比較する方法を思いついたのですが、
もっと綺麗な方法ってあるでしょうか?


935:デフォルトの名無しさん
08/06/05 02:25:25
busyboxにprintfあったよ・・・・・orz

936:デフォルトの名無しさん
08/06/05 02:28:49
>>932
マジですかorz
調べたりなさ杉。ありがとうございます。

>>933
今現在確認できないので研究室についたら試してみます
ありがとうございました。


937:デフォルトの名無しさん
08/06/05 02:35:12
おまえら、いいかがんシェルを作るな。シェルスクリプトを作れ。

938:デフォルトの名無しさん
08/06/05 04:38:56
Cに似たシェルスクリプト言語ってある?

939:デフォルトの名無しさん
08/06/05 08:29:08
cshでスクリプトは書くな

940:デフォルトの名無しさん
08/06/05 08:41:31
外部コマンド呼ぶのにいちいちsystem()とか、それさえなくて
fork()とexecve()を駆使しなきゃいけないようなスクリプト言語だとしたら、
かなりいや。

941:デフォルトの名無しさん
08/06/05 09:05:21
while read Filenm
do
if [ -e $Filenm ] ; then
echo $Filenm" ○"
else
echo $Filenm" ×"
fi
done <file_list.txt

942:デフォルトの名無しさん
08/06/05 20:45:57
cat file_list.txt | group { Test-Path $_ }

943:デフォルトの名無しさん
08/06/06 09:47:16
>>940
どうして?

944:デフォルトの名無しさん
08/06/06 19:28:20
インタープリタ言語はスレ違いでしたね
スレタイがシェルスクリプトだもんな
すっかり勘違いしてた

945:デフォルトの名無しさん
08/06/07 18:48:20
cpioのマルチボリューム保存で1本目が終わると
2本目の前にデバイス名の入力を施すメッセージが表示されます。
その際、そのメッセージ(多分、標準エラー出力)を表示させないで
自前の処理で「2本目の保存を行いますか?(y/n)」みたいに行いたいのです。

標準エラー出力をどう扱うかが肝だと思うのですが、良いアイデアが浮かびません。

何か良いヒントはありませんでしょうか?(Bシェル(OS:Solaris))


946:デフォルトの名無しさん
08/06/07 19:35:53
つ expect

947:デフォルトの名無しさん
08/06/16 11:34:15
#!/bin/csh -f

set s=$1
set t=$2
set f=$3

cat $f | tail +$s | head -$t

exit 0
echo ------------------

以上を改良しろ、と言われました。みなさんならどうしますか?教えて下さい。

948:デフォルトの名無しさん
08/06/16 11:47:55
#!/bin/csh -f
tail +$1 $3 | head -$2

949:デフォルトの名無しさん
08/06/16 13:01:05
rm -f /bin/csh

950:デフォルトの名無しさん
08/06/16 13:49:14
>>949
Permission denied

951:デフォルトの名無しさん
08/06/16 14:14:52
以下のスクリプトで
echo をした時に
AAAeo kakikukeko sasisuseso
AAAituteto naninuneno hahihuheho
と表示されるのですが
どうすれば
tatituteto naninuneno hahihuhehoAAA
と表示できるのでしょう?
環境は実行シェルはbashです


FUGA="'AAA'"
awk '{print;}' hoge.txt | while read LINE; do
    MOGE=`echo "$LINE" | cut -d , -f 2-`
    echo "$MOGE""$FUGA"
done

hoge.txt
a,aiueo kakikukeko sasisuseso
b,tatituteto naninuneno hahihuheho



952:デフォルトの名無しさん
08/06/16 14:55:37
>>951
やりたいことが判らん。awkを使う理由が判らん。手元で再現できん。
つーか、折角awkを使うならawk -F, '{print $2 "AAA";}'じゃいかんの?

953:951
08/06/16 15:09:30
>>952
レスありがとうございます

やりたい事としては
ファイルから1行読み込んで1行をパースし
FUGAと連結した文字列を別のコマンドを実行させたい

です

1行の内容としては
aaaaa,hogehoge mogemoge aiueo

という風に書きましたが実際には
aaaa,SQL文
という感じで半角スペースやカンマが入ります



954:デフォルトの名無しさん
08/06/16 15:16:15
>>953
他人の話をよく聞きなさいって言われたことないか?
>952をよく読んで、為すべきことを為してから出直せ。
それから、自分の書いた文章を読み返す癖をつけた方がいい。
とてもじゃないが、他人に読んでもらう文章になっていないぞ。

955:デフォルトの名無しさん
08/06/16 15:48:40
>>954
>>952に書いてある内容は理解しています

    MOGE=`echo "$LINE" | cut -d , -f 2-`

の代わりとなる部分だと言うことは解っているのですが
>>953にも書いてある通りカンマ等が入ってしまう為記述が簡単な
    MOGE=`echo "$LINE" | cut -d , -f 2-`
を選びました

951にカンマ等が複数入る可能性があるという事を
書かなかったのはすみませんでした


956:デフォルトの名無しさん
08/06/16 16:11:07
cut -d',' -f2-

957:デフォルトの名無しさん
08/06/16 16:18:10
~> L="123,uio poi"
~> LB=`echo $L | cut -d',' -f2-`
~> echo $LB
uio poi
~>

958:デフォルトの名無しさん
08/06/16 17:05:34
違ったか・・・

959:デフォルトの名無しさん
08/06/16 21:03:53
tr -d '\015' < hoge.txt | awk ...


960:デフォルトの名無しさん
08/06/17 11:26:10
#!/bin/csh -f

set com=$0

if ($#argv < 1 || $#argv > 3) then
echo Usage:$com start_line total_lines '[file_name]'
exit 1
endif
if ($#argv == 2) then
set s=$1
set t=$2
tail +$s | head -$t
else
set s=$1
set t=$2
set f=$3
cat $f | tail +$s | head -$t
endif

exit 0
echo ------------------

これだとエラーがでます。どなたか改良してください。お願いします。


961:デフォルトの名無しさん
08/06/17 11:27:38
酷いマルチ

962:デフォルトの名無しさん
08/06/17 13:28:46
bashで
while read LINE; do
echo $LINE
done < ファイル

とするとファイルに含まれてるタブ文字が
半角スペースに変換されて表示されるのですが
そのまま取り出したい場合どうすればいいのでしょう?

cat ファイル | whileやfor LINE in `cat ファイル`等はやってみました


963:デフォルトの名無しさん
08/06/17 13:57:10
echo "$LINE"


964:デフォルトの名無しさん
08/06/17 14:05:16
>>963
うまくいきました
ありがとう

そんな単純な事に気づかなかったとはorz


965:デフォルトの名無しさん
08/06/30 21:30:18
KORNシェルの質問です。よろしくお願いします。

テキストファイル

id=tanaka age=25
id=takahashi age=2           
id=suzuki age=44



id age
---------------------
id=tanaka age=25
id=takahashi age=2          
id=suzuki age=44

にしたい(体裁を整えたい)です。$@を使ってできますか?
変数wkにabc=e があったとして、=があるかどうかわかりますか?
grepやcutコマンドは変数を対象に使えませんよね・・?

966:デフォルトの名無しさん
08/06/30 21:42:13
訂正です。体裁が整ってない。
idなら10文字以下でもスペースで10文字にして(これはtypedef使いました)
=の前を見出しに出力して、=の後を----の下に書きたいんです。

id age
---------------------
tanaka    25
takahashi   2          
suzuki    44

よろしくお願いします

967:デフォルトの名無しさん
08/06/30 23:25:03
IFS="=$IFS"
FIRST=t

while read line
do
    set -- $line
    if [ "$FIRST" ]
    then
        printf "%-10s %s\n" "$1" "$3"
        echo "---------------------"
        FIRST=
    fi
    printf "%-10s %2d\n" "$2" "$4"
done

968:デフォルトの名無しさん
08/06/30 23:38:57
>>967san
有難うございます!今試せないので明日、速攻でやってみます!



969:デフォルトの名無しさん
08/07/04 23:36:23
質問させてください。
diffの結果を見易く整形するツール等はありますでしょうか。
環境はCENTOSです。よろしくお願いします。

970:969
08/07/04 23:37:57
すいません。追記します。
シェルスクリプト内で使いたいので、
ツールでもコマンド的なものだとありがたいです。

971:デフォルトの名無しさん
08/07/05 00:17:24
diff -u


972:デフォルトの名無しさん
08/07/05 00:19:45
>>969
> diffの結果を見易く整形

kwsk



973:デフォルトの名無しさん
08/07/05 01:23:42
>972
このファイルだけサイズが違いますよとか
このファイルはこっちにありませんよとかが希望です。
ls -Rlaの結果をファイルにリダイレクトしてます

974:デフォルトの名無しさん
08/07/05 07:42:01
ファイルの差分はいらないのね

find dirA -exec wc -c {}; > /tmp/A
find dirB -exec wc -c {}; > /tmp/B
diff /tmp/A /tmp/B

あるいは単純に
diff -r --brief dirA dirB 2>&1


975:デフォルトの名無しさん
08/07/07 14:20:19
私はこんなスクリプト作ってる。
--
#!/bin/sh -f
DIFF="/bin/diff -u"

lsd()
{
find $1 -type f -ls | awk '{printf("%10d %s %2s %5s %s\n", $7, $8, $9, $10, $11);}' | sort +4
}

lsd $1 | sed -e "s- $1- $2-" > /tmp/$$
lsd $2 | $DIFF /tmp/$$ -
rm /tmp/$$
--
これで一応ファイルサイズとタイムスタンプも比較できる。

976:デフォルトの名無しさん
08/07/07 23:59:08
>>975
・空白のあるファイル名の扱い
・日付の出力形式の仮定
に問題。




最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch