トップページunix
1001コメント312KB

シェルスクリプト総合 その19

■ このスレッドは過去ログ倉庫に格納されています
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 で。
0793名無しさん@お腹いっぱい。2012/04/15(日) 01:18:04.06
alias man='LANG=C man'
しとくのオススメ
0794名無しさん@お腹いっぱい。2012/04/15(日) 01:20:40.59
$ man sort じゃなくて $ info sort がオヌヌメ
0795名無しさん@お腹いっぱい。2012/04/15(日) 02:33:57.03
Linuxの日本語 manと言えば、最近 bash 4.2の manが
翻訳されたのが嬉しかった。

GNU bash 4.2 の翻訳
http://linuxjm.sourceforge.jp/INDEX/gnu.html#GNU_bash
0796名無しさん@お腹いっぱい。2012/04/15(日) 11:22:51.82
コマンド foo と同名の関数 foo を作成し、後者の中から前者を呼び出そうと思っています。
function foo {
 foo
}
しかし当然ながら無限ループになります。
解決策としては
function foo {
 `which foo`
}
という方法があります。
しかし毎回 which コマンドを起動するのがちょっと気にかかります。
別の方法として
function foo {
 ¥foo
}
というのを試しましたが、だめでした。¥foo はエイリアスには効くけど関数にはききませんでした。
というわけで、今のところ which コマンドを使う方法しかなさそうですが、もっといい方法があれば教えて下さい。
0797名無しさん@お腹いっぱい。2012/04/15(日) 11:26:42.70
>>796
function foo {
 command foo
}

そのための「command」コマンド。
0798名無しさん@お腹いっぱい。2012/04/15(日) 12:24:24.87
話は変わるけど、bashには`help'という組み込み関数があって、

bash$ help function

とか

bash$ help command

とかするとその部分の説明文だけ表示してくれる
0799名無しさん@お腹いっぱい。2012/04/15(日) 13:24:53.76
単に
/usr/bin/foo
とかすればいいんじゃないの?
0800名無しさん@お腹いっぱい。2012/04/15(日) 13:34:57.91
>>799
最適解(>>797)が既に出てるのに、外した回答するオマエは黙ってろ。

PATHが違ったら適応できないだろw
0801名無しさん@お腹いっぱい。2012/04/15(日) 16:01:28.21
>>799のレスは別に問題視するようなものじゃない。
〜の方が良いと書いてあれば別だが。
0802名無しさん@お腹いっぱい。2012/04/15(日) 16:16:51.47
>>801
>>796 の質問で、わざわざ `which foo` と書いてることから、
絶対PATHで書いたのでは問題の解決にならないことは読みとれる。
質問者自信も絶対PATHを使う方法は知っている(けどそれじゃ駄目)と読みとれる。

質問の回答になってないのだから問題視されてもしょうがない。
0803名無しさん@お腹いっぱい。2012/04/16(月) 01:51:19.72
>>801
>>799みたいなトンチンカンな回答にも丁寧に答えてあげている
>>800の優しさに気づけ
0804名無しさん@お腹いっぱい。2012/04/17(火) 15:40:51.44
>>797
「command」なんて初めて知りました。完璧です。ありがとうございました。

>>802
状況としてはまったくそのとおりで、すばらしいエスパーっぷりですが、
799はそこまで敵視されるようなことを書いてるわけじゃないので、
そんなに怖がらせなくてもいいかなと思いました。
技術者同士はみんな仲良くね!戦うべき相手は別にいるよ!
0805名無しさん@お腹いっぱい。2012/04/17(火) 16:49:46.48
>>800は常駐さんのお決まりレスです。
彼なりにイカしたレスだとお考えになっているのでしょう。
しばらくここにいれば慣れます。
0806名無しさん2012/04/23(月) 01:47:23.08
検索コンプレックス
0807名無しさん@お腹いっぱい。2012/04/28(土) 14:15:07.91
関数もexportできるようにならないかなぁ
環境変数ならぬ環境関数みたいな
便利だと思うんだけど
0808名無しさん@お腹いっぱい。2012/04/28(土) 14:19:23.03
>>807
え? できるけど。

export -f
0809名無しさん@お腹いっぱい。2012/04/29(日) 08:45:26.54
>>808
bash乙
0810名無しさん@お腹いっぱい。2012/04/29(日) 09:44:51.95
      ____
     /      \
   /  _ノ  ヽ、_  \
  /  o゚⌒   ⌒゚o  \   不毛な言い争いがまた始まるお…
  |     (__人__)    |
  \     ` ⌒´     /
0811名無しさん@お腹いっぱい。2012/04/29(日) 10:46:16.86
キミの好物じゃないの
0812名無しさん@お腹いっぱい。2012/04/29(日) 17:13:31.08
>>808
ほんとだ、bashだとexport -fでできるのね
zshだと駄目なんだけどオプションが違うんだろうか
0813名無しさん@お腹いっぱい。2012/04/29(日) 17:16:47.95
zshは今誰も使ってないからバグが放置されてるんじゃないか?
0814名無しさん@お腹いっぱい。2012/04/29(日) 18:14:30.17
>>813
そうなんだぁ・・・
いっそ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
zshかbash系だとして一行で済ますなら
$ 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
(rm FILE_A; sort > FILE_A) < FILE_A
みたいな手もあるが、間違えたら泣ける。
0818名無しさん@お腹いっぱい。2012/05/06(日) 04:15:04.88
同じ条件で検索するなら
find PATH1 PATH2 PATH3 | sort
でいいよな。
0819名無しさん@お腹いっぱい。2012/05/06(日) 05:15:17.42
>>815
> cat FILE_A | sort > FILE_A
マルチタスクな OS では普通パイプやリダイレクトの際に前後の
プロセスが同時に起動する。
ファイルを読むプロセスが終了するのを待ってファイルを書くプ
ロセスが起動する訳ではない。

なので、上記の場合は最後に書き込むファイル名を変更しなければならない。
0820名無しさん@お腹いっぱい。2012/05/06(日) 14:36:51.94
TEMP=`tempfile`
cat 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.25
すみませんが添付ファイルは梨の奉公でお願いします
0822名無しさん@お腹いっぱい。2012/05/06(日) 15:27:35.80
>>815
http://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.14
>>822
catとパイプが無駄です。

sort -o FILE_A FILE_A
0824名無しさん@お腹いっぱい。2012/05/06(日) 17:20:10.08
ランダルシュワルツの不要なcat添削を思いだした
0825名無しさん@お腹いっぱい。2012/05/06(日) 18:55:31.70
cat議論はこのスレの>>147-213あたりで延々やってるな。
0826名無しさん@お腹いっぱい。2012/05/06(日) 19:22:02.88
添付ファイルを使わないのは大手SIerじゃ常識だね。
0827名無しさん@お腹いっぱい。2012/05/06(日) 19:23:49.29
思案パイプ
0828名無しさん@お腹いっぱい。2012/05/07(月) 19:19:08.78
対話方式にならないようにシェルスクリプト自信がroot権限で実行されるようにするスクリプトって作れますか?
0829名無しさん@お腹いっぱい。2012/05/07(月) 21:03:44.73
>>828
対話的コマンドでもexpectでなんとかなる
0830名無しさん@お腹いっぱい。2012/05/07(月) 21:11:42.22
>>829
そういう意味じゃなくて、シェルスクリプト中で su -c hoge とかしないで
root権限の動作をさせたいという質問かとエスパー。
0831名無しさん@お腹いっぱい。2012/05/07(月) 21:16:30.15
基本的にsuidはシェルスクリプトでは許可されてないからねえ。
昔あったsuidperlみたいなののbash版を探してみたけどないみたいだし。
sudersに対象となるスクリプトに対してNOPASSWDを設定するぐらいしか思いつかないや。
0832名無しさん@お腹いっぱい。2012/05/08(火) 02:00:49.38
>>828
できます
コマンドラインを実行するだけのプログラムを作って
setuidするば
0833名無しさん@お腹いっぱい。2012/05/08(火) 07:52:21.31
>>832
>>831
0834名無しさん@お腹いっぱい。2012/05/09(水) 13:22:49.97
http://forum.xda-developers.com/showthread.php?t=540483
ここに書いてあるシェルスクリプトを動かしてみたんですが、
Syntax error: "do" unexpectedと返されてしまいます
ヒントだけでもいいんで教えてください。

0835名無しさん@お腹いっぱい。2012/05/09(水) 13:28:11.27
-x 付けて実行してどこでエラーか見てみたら
bash -x secrets.sh
0836名無しさん@お腹いっぱい。2012/05/09(水) 13:29:47.52
>>835
わからないなら黙ってろ
08378352012/05/09(水) 13:30:45.77
あ、スレ間違えてたorz
0838名無しさん@お腹いっぱい。2012/05/09(水) 15:17:41.55
なぜかしら、回答としては合ってる気がするぞw
0839名無しさん@お腹いっぱい。2012/05/10(木) 06:54:48.81
コピペの際に文の末尾に\rが入っちゃってるとか。
0840名無しさん@お腹いっぱい。2012/05/14(月) 22:36:21.02
alias cd=chdir
function 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.98
function bd {
dirstack[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.98
pushd じゃダメなん?
0843名無しさん@お腹いっぱい。2012/05/15(火) 16:36:43.46
>>842
体に馴染んでるんで…すいません
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.81
lsに限らず、それ以外でも扱える、方法が知りたいです。
0846名無しさん@お腹いっぱい。2012/05/16(水) 17:10:41.70
>>844
例が悪い。その1番下の行の
ls -l "$( eval echo -n ${file_name} )"
だって、複数の空白が空白1個にまとめられちゃうし、
$ < > 等の記号が含まれると ${file_name} (クォートなし)の展開と
evalの展開で大変なことになるぞ。
0847名無しさん@お腹いっぱい。2012/05/16(水) 17:30:39.54
>>846 確かに、例は悪いだろうな。大変なことになる。
でも考えても、これくらいしか思いつかなかったので、
いい加減にして、聞いた方が早いかと書き込んだんだよ。
0848名無しさん@お腹いっぱい。2012/05/16(水) 17:34:06.75
シェル変数内にチルダが入っている時、チルダ展開だけやって
その他の空白とか * $ < > とかの解釈はさせないって方法がないんだよな。
sedでチルダを $HOME に書き換えろ。
0849名無しさん@お腹いっぱい。2012/05/16(水) 17:46:31.95
>>844
file_name="~/src/te st * $ < >"
ls -l "${file_name/\~/$HOME}"
0850名無しさん@お腹いっぱい。2012/05/16(水) 18:49:13.65
>>846, >>848, >>849 あああ!ありがとう。
ls -l "$( echo -n "${file_name}" | sed s#^~#$HOME# )"
08518442012/05/16(水) 21:00:34.05
しばらく考えてこうしました。
ls -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.76
v7shについて色々調べてるのですがどうしても関数を使用しようとすると

test.sh: syntax error at line 2: `(' unexpected

とエラーが出てきて使用できません。空白、頭にfunctionを付ける等いろいろ試してみましたがやはり変わらず・・・
UNIX version 7の頃のshには関数がないということでしょうか?
0853名無しさん@お腹いっぱい。2012/05/18(金) 05:27:04.29
sage忘れました。申し訳ないです。
0854名無しさん@お腹いっぱい。2012/05/18(金) 06:51:13.40
>>852
シェル関数はないよ。

代用として、シェル関数にしたい内容をシェル変数に入れて、その変数を実行する。

func='ls -l'
$func

で ls -l が実行される。引数を渡したい時は工夫して。
0855名無しさん@お腹いっぱい。2012/05/18(金) 07:00:59.45
>>852 あんまり役に立たないかも知れないですが、無いと思います。
参考までに
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
>>854
>>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
>>856 なんででしょうね?
そのままコピペしてv7shで試しましたが、こちらでは期待通りの動作でした。
$ ./v7case.sh a
A!!
$
0859名無しさん@お腹いっぱい。2012/05/18(金) 22:31:03.13
>>858
謎ですね・・・v7shなんて過去のものですから大差があるとは考えにくいですし

通常のコマンド待ち状態で ;; を打つとエラーが出ますから
case内でしか特殊な意味を持たないと思われるんですけどね・・・
0860名無しさん@お腹いっぱい。2012/05/24(木) 17:44:12.51
msysgit(windows版git)付属のbashでログイン時のディレクトリをホーム以外にしたいんだけど、どうしたらいい?
例えば、$HOME/work/hogeでいつも作業するのでbash起動時にそこにいて欲しい。
$HOMEを書きかえると他にも影響があり過ぎるので別の方法教えてください。

適切なスレが見つからなかったので、誘導して。
0861名無しさん@お腹いっぱい。2012/05/24(木) 18:49:28.23
etc/profileの最後にcd ~/work/hoge?
0862名無しさん@お腹いっぱい。2012/05/24(木) 20:59:36.08
そんな単純なことでよかったのか...
恥ずかしいー
0863名無しさん@お腹いっぱい。2012/05/24(木) 21:28:32.29
$HOME/.bash_profileの方が良いんじゃ?
0864名無しさん@お腹いっぱい。2012/05/25(金) 02:08:36.57
かなり遅れましたが>>834です
-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.31
839は読んだの?

hexdump -C secrets.sh | head
したら、0d 0aになってる所あるんじゃないの?
0866名無しさん@お腹いっぱい。2012/05/25(金) 11:45:35.26
>>865
0d が付いていたとしても >>864 の Invalid argument: のエラーにはならないから、その問題じゃないな。
0867名無しさん@お腹いっぱい。2012/05/25(金) 11:51:53.28
>のopenかwriteのエラーだろうから、
Invalid argumentの理由はシステム依存だろうな。
0868名無しさん@お腹いっぱい。2012/05/25(金) 13:17:54.88
>>866
FATとかのファイルシステムに 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.26
上の議論読んでないのかよ。
0d を消せと。
0871名無しさん@お腹いっぱい。2012/05/25(金) 16:25:46.48
>>869
だから、>>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.18
>>871
do^Mとは
書いてありませんでした。
コピペしてるので写し間違いはないはずです。
0873名無しさん@お腹いっぱい。2012/05/25(金) 17:00:31.79
もうほっとけ。
0874名無しさん@お腹いっぱい。2012/05/25(金) 17:40:27.35
\rを全部消して実行してみました。
# 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
>>874
改行まで消すなよ。
bin2xmlの行が2行目に来てるし、、
0876名無しさん@お腹いっぱい。2012/05/25(金) 17:57:33.97
よく分からないんでとりあえずhexdumpの結果上げます。
# 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.54
utf16じゃ実行できないんじゃね?
0879名無しさん@お腹いっぱい。2012/05/25(金) 18:25:56.14
ANSIです。
それと簡単なシェルスクリプトを動かしたら似たようなエラーが発生しました。
# 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
>>879
>>876が発狂する前に hexdump -C secrets.sh | head の出力を貼ってください
-cじゃなくて-Cでお願いします
08818802012/05/25(金) 18:30:52.81
>>876じゃなくて>>877
0882名無しさん@お腹いっぱい。2012/05/25(金) 18:38:20.98
もう俺の中では結論出てるよ。
原因は出てる通り CR
で、CR取れと指示されたら CRを知らない質問者が CR LFともに取って1行にしただけ。
エラーメッセージからも裏付けられる。
0883名無しさん@お腹いっぱい。2012/05/25(金) 18:40:31.85
hexdump -C secrets.sh
00000000 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
>>882
ありがとうございます。
まさにその通りでした。
一応走り出したんですが
# 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.68
このスレに必要もないzip拡張子付ける糞unzipはいるかー!?
cygwinのまともなunzipはどこかにおらんかー!?
0886名無しさん@お腹いっぱい。2012/05/26(土) 15:38:08.10
find "${DIR}/" -prune -name '*.png' -printf "$(tput bold; tput setaf 1) %f $(tput sgr0)"
find "${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
>>886
-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
>>887
どうせなら最初と最後に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.10
>>889
echoの出力をパイプで suに食わせているから結果的に echoの内容が実行される。
同じことをやりたいなら、

echo /usr/bin/ls | sh
だな。
ところでlsが/usr/binにあるって、、Solarisかよ。
0891名無しさん@お腹いっぱい。2012/05/27(日) 13:02:22.30
>>887>>888
ありがとうございました!
0892名無しさん@お腹いっぱい。2012/05/28(月) 04:48:06.45
ヒアドキュメントの有効な使い方がよくわからない…
探してもcatでの例しかない
どなたか有効な使い方教えてくれませんか?
0893名無しさん@お腹いっぱい。2012/05/28(月) 06:31:40.48
ヒアドキュメントは過去の遺物です。
■ このスレッドは過去ログ倉庫に格納されています