☆シェルスクリプトを勉強するにあたって☆

このエントリーをはてなブックマークに追加
>>46
そんなメリットがあったのかー!
気がつかなかったぜ
908894 != 884:04/10/24 13:45:43
#!/bin/sh
var=""
if [ "$var" == "" ]
then
echo "-n" "true"
else
echo "-n" "false"
fi

<実行結果>
hoge$ sample.sh
truehoge$

<実行結果> var="-h"の場合
hoge$ sample.sh
falsehoge$

GNU bash, version 2.05b.0

この結果を見ると、>>901>>904氏が正しいようですが・・・・
bashで試されてもなあ。

ちゃんとした/bin/shのあるOSで>>905をよろしく。
>>901
""で囲ってあれば問題にならないのは$varがnullのときだけで。
$var=-hの場合、ビルトインコマンドであっても""の有無はコマンドには知らされないから
testはオプションと解釈する。
911从*・ 。.・从 ◆SayuminPM. :04/10/24 14:22:06
#!/bin/sh
var=""
if [ "$var" = "" ]; then
echo 'あいえれいな'
else
echo 'ハァ━━━━━━ ;´Д` ━━━━━━ン!!!!'
fi

SunOS edu 5.8 Generic_108528-19 sun4u sparc SUNW,Ultra-Enterprise
$var="!"
./hoge.sh: test: 引数が足りません。

IRIX64 ed1 6.5 10120104 IP27
$var="!"
./hoge.sh[3]: test: 引数がありません
ハァ━━━━━━ ;´Д` ━━━━━━ン!!!!

var="-h" var="" は問題いようだ
>>910
いやそれが、阿呆な使い方を許容するためにCFGを超えて面倒なことをしてるんですよ。
*BSDだとtest.cの中のisoperand()。

それでも>>905のケースには対応できてないが。
Linuxでもtest(1)は対応できない。
913894 != 884:04/10/24 14:40:33
>>909
持ってない・・・・
が、一応やってみた。
結果は「false」。
if [ =="" ]; then ... でやると「true」になるので真偽が逆転したわけか。なるほど。

>>910
var="-h"
if [ "$var" /bin/sh ]; then ... は確かに「true」になった。(/bin/shはbashへのシンボリックリンク)
[ "$var" == ""]でvar="-h"の時は、結局、[ -h =="" ]と同じになって、
「==""」の部分がファイル名として解釈され、
そんなファイルは存在しないので「false」になったわけですか。納得。

あと、var=""のときも確かにエラーにならなかった。
[ =="" ]で「true」と判定されました。両辺ともnullだから、というわけか。

うーん、勉強になるなぁ
914名無しさん@お腹いっぱい。:04/10/24 15:46:38
( ゚д゚)ポカーン
>>913
== じゃなくて =
それから、引数の間にはスペースを入れろ
916894:04/10/24 16:41:22
>>915
ご指摘ありがとうございます。
スペースの件は知っていたのですが見落としました。気をつけます。

== はあまり気にせず発端の>>884に合わせてたんですが、
reference等を見るとすべて = となっているのでこちらが
正式なのですよね。== が許されるのはまた「bashだから」
とかなのかな。
以後、= で統一します。
全部 /bin/zsh で書くヲレは勝組
シェルスクリプト書くやつは負け組
>>916
≫ == はあまり気にせず発端の>>884に合わせてたんですが、

ものすごい勢いの勝ち組だ…
ftpサーバにログインしてそこに aaa というディレクトリがなければ
それをつくるというようなスクリプトを作りたいのですが、
ディレクトリの有無を調べるにはどうしたらよいでしょうか。
curl --list-only ftp:......
でリストをつくるまではいったのですが
>>920
ftp の標準入力に実行したいコマンドをつっこんで、
ftpdのレスポンスをリダイレクトして、ファイルに落とす。
そこで、sedなんかでリターンコードを見て成功したかどうかチェック
>>920
とりあえずftp鯖とお話したいならexpectではなかろうか。
シェルには荷が重い希ガス。
つーか autoexpect で         糸冬  了   ズザザ━━━━⊂(゚Д゚⊂⌒`つ≡≡≡━━━━!!
すまん・・・
いきなりだがシェルの実行方法を教えてくれないか?

例えば
csh ファイル名
とかでそのファイルに書かれたシェルスクリプトを実行できるのだが、
ファイル名だけをコマンドラインから打って実行する方法が
あるらしいのだが、デキナイ・・ファイル名の事をそんなコマンドはネーヨ!!
とか言われて勘違いされるのだが・・・

何か設定しなければならないことあるのか?
ヒントだけでもいいからオクレ
・・・実行権つけれ
カレントディレクトりにパスが通ってないんじゃないか。
パスと押すのはオススメしないので、
./hoge とでもしろ。
alias ほげ 'csh ほげ'
928924:04/10/28 15:02:17
============================
#!/usr/bin/sh
echo test

============================

ファイルの中身が↑だと「見つかりません」とかでて
ファイルの中身を↓のようにすると、上手くいきます。
#!/usr/bin/shが悪さをしているのだと思うのですが
コマンドwhich sh で表示させたところ
/usr/bin/shだと言ってます、パスあってるよなー。
crontabでcshスクリプトを定期的に実行したいので

=============================
echo test

=============================

AIX5.1です。
/usr/bin/shだと言ってます、パスあってるよなー。
ls で確認くらいしてから書き込めヴぉけ。
ふつう sh は /bin/sh だけど。
#!がshなのに中身はcshスクリプトなの?
エスパーが必要とされている。
932924:04/10/28 15:27:22
とりあえず、ためしに作っただけです。

echoならcshでも動きますよね。

それと行頭のパスはあってます。

ちなみに/bin/shにしても結果はかわりませんでした。
/usr/bin/sh が存在する OS は少なくないぞ。

それはそれとして、Windows のエディタでスクリプトを書いて
ftp で転送するとそういうことが起きることがある。
エスパーキター!!
>>933
それです、今それをやってます!!
935920:04/10/28 15:36:28
>>921
ありがとうございます。おかげさまでなんとかつかえるものができました。
>>922
>>923
ありがとうございます。よく勉強してみます。
936924:04/10/28 16:16:06
解決しました。

933ありがとう・・。
しかしwindowsマシンで
作れないとすると・・どうすりゃいいんだ?
viエディタなんて使いたくない!!
>>936
じゃechoとリダイレクトでw
binary モーどで送ればいいじゃないの。a
というかだ。
924は勉強しろ。
いろいろと
ところでちょっと聞きたいんだけど、自分はスクリプト書くときに変数は囲め
るときはなるべく "" で囲むようにしてるんだけど変ですかね…。
941920:04/10/29 15:45:38
ls -al |
などでパイプを通ってきた文字列に"abcd"という文字列がふくまれているかどうか
テストしたいのですがどうしたらいいでしょうか?
あるいはパイプを通ってきた文字列をなにか変数に格納する方法などありましたら
おしえてください。
>>941
`
ls -al|grep abcd
>>940
いいことだと思う。

囲んでないと、
スペースを含んでたりしたときにおかしな動作になることがある。
対処方はいろいろあるんだろうけど。
945920:04/10/29 17:29:12
>>943
レスありがとうございます

ls -al | grep abc | test --(なんとか)&& echo succeed

みたいなことをやりたいのですが、このテストの部分でなにかいい方法がない
でしょうか

ls -al | grep abc > testfile ; test -s <testfile && echo exist

とファイルに落とすとうまくいくのですが、直接受け渡しはできないでしょうか。
if ls -al|grep abc  >/dev/null 2>/dev/null ; then
    echo succeed
fi
>>945
それから、testは標準入力は読まないと思うから、
test -s testfile && echo exist
だから`つかえって
var=`ls -al`
でコマンドの出力を変数に代入できる。
949945:04/10/29 18:40:19
>>946,947,948
ありがとうございます。おかげさまでスクリプトがだいぶんすっきりと
まとまっていきそうです。

ところで
if ls -al|grep abc >/dev/null 2>/dev/null ; then
echo succeed
fi

これでうまくゆくのですが、どうしてうまくゆくのかわかりません。
どこでtestしているのですか?
>/dev/null 2>/dev/null と続けて/dev/nullに上書きしているようにおもえるのですが。
if は次に記述されるコマンド(正確にはパイプライン・・コマンドをパイプで連結したもの)
のリターンコードを見てる。
testは引数の結果でリターンコード変えてるんだよ。
951945:04/10/29 19:18:45
>>950
なんどもありがとうございます。

|grep > /dev/null
のところでなにか/dev/nullに送られたかどうかをtestしているという理解でいいでしょうか?
二つ目の
2>/dev/null
は必要なものでしょうか。
>>951
chmod 000 /dev/null とかやって見れば?
>>951
>のところでなにか/dev/nullに送られたかどうかをtestしているという理解でいいでしょうか?
だめです。
grepは文字列が見つかれば0を返し、そうでなければ1を返します。
返事が返ってきた    返事が返ってきた
    ↓             ↓
鸚鵡返しに質問      ちょっと調べてみる(考えてる)
    ↓             ↓
  ありがとう         ありがとう
955945:04/10/29 21:38:00
>>953
>/dev/null 2>/dev/null を消したスクリプトで試してみて
意味が納得できました。
ほんとにありがとうございました。
コマンドラインからgrepやってみて
echo $?
とやりゃ分かる