ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

#!/bin/shコミュの初心者の質問

  • mixiチェック
  • このエントリーをはてなブックマークに追加
あまりシェル知らないのですが、便利そうなので勉強している初心者です

質問なのですが、
あるシェルスクリプト1で
NUM=100
と定義したものを別のスクリプト2で
$NUMのところに1の時の値を代入したいのですが、
どうすればいいんでしょうか?

検索しても、キーワードがちょっとわかりません。
教えて頂けると大変助かります。よろしくおねがいします

コメント(26)

単純な方法として、
引数として渡してあげるんじゃだめですかね。

二つのスクリプトの関係性がわからないので
これがベストかどうかはわかりませんが…
二つのスクリプトの関係がわからないのでなんともいえませんな。

スクリプト1の中からスクリプト2を呼び出すなら、引数として渡すのが一番らくでしょう。
引数として扱うのが面倒ならexportして環境変数にしてやるといいかも。

スクリプト1の終了直後にスクリプト2が実行される場合…
むしろまとめちゃったほうがいいのではないんでしょうか。

まったく別個に動くものの場合は、一旦ファイルに出力するなどしてやらないと
引渡しは出来ないかと。
>裕夜さん

コメントありがとうございます。
引数で調べたらわかりました!
超初心者なものでして。。。

ありがとうございます
特定のファイル以外をワイルドカードで指定する方法を教えてください。

% ls -1
all_data.cgi
backup.php
enq_data.cgi
index.html
%

上記で、「backup.php 以外」を指定する際、
ls -1 [^b]*
で実現できましたが、この指定だと b で始まる全ファイルが
対象になってしまいます。(今回はb 始まりは1ファイルだったが)
例えば 「back*php 以外」と指定するにはどうしたら良いのでしょうか?
>h2
ありがとうございます。納得です。
前者はあまり汎用性ないですね。

実際には ls じゃ無くて chmod とかで使いたいのですが、その場合は xargs との
連携かな!?それだと(ちょっとだけ)面倒臭いなぁ。
まぁ仕方ないか...
zshだと確かそう言う機能があったなあと調べてみると、

setopt EXTENDED_GLOB
しておくと、
ls -1 *~back*php
で、back*php以外のファイル名にマッチします。

だからといってzshを常用するかというと「うーむ」ですが。
はじめまして。
学校の課題で、シェルスクリプトを書いています。
習い始めてから1ヶ月目のの初心者です。
お時間がありましたら、お力添え願います。

スクリプトは長いので、下のアドレスに貼り付けてあります。
編集可能になっておりますので、編集箇所をコピペして回答いただけると幸いです。

http://channyd2.web.fc2.com/myshellscript1.htm

私が悩んでいるところは、27から35行目のところです。
ここに、
if [ -h "$sym" ]; then
if [ -e "$sym" ]; then
if [ -f "$sym" ]; then
echo "symlink to file"
elif [ -d "$sym" ]; then
echo "symlink to directory"
else
echo "symlink to other"
fi
else
echo "broken symlink"
fi
else
echo "not symlink"
fi
を組み込みたいのですが、うまく出来ません。
ifステートメントの書き方が悪いのか、実行したときにエラーが出てしまいます。
説明不足、不明なところがあればお知らせください。
何卒よろしくお願いします。
>>9
> 実行したときにエラーが出てしまいます。

まず、どのようなエラーが出たかが重要です。でたらめなメッセージを返しているわけではありません。ようするに、エラーメッセージが出たなら、それを示すべきってことです。
ぱっとみる限りですが…
20行目〜25行目をこんな感じにしたいのかな?ホントは。
と思うのですが、どうでしょう。
if [ "$1" = -f ]; then
  filename="$2"
  if [ ! -e "$filename" ]; then
    echo "$filename" doesn\'t exist. >&2
    exit
  fi
fi

22行目のifに対するfiがないのが原因かと。
スクリプトは害がなければインデントするほうが見やすいですよ。

個人の主義主張の現れる部分なので強要はしませんが。

あとは、-uと、-fの部分をそれぞれ関数化すると見やすいかもしれません。
たとえば、こんな感じですね。
--------------------------------------------------------------------
function OPTION_F {
  filename=$1 ←ここでの$1(第一引数)はコマンドラインではなく関数の引数になります)
  (中略)
}

function OPTION_U {
  login=$1
  (中略)
}

case $1 in
  -f)
    OPTION_F $2;;
  -u)
    OPTION_U $2;;
  *)
    echo "Unknown Parameter";;
esac
--------------------------------------------------------------------

本業がKorn Shellなんで、Bashの細かいことまでは詳しくないので
イメージとしてとらえてもらえればと思います。
>ふゆねこさん
コメントありがとうございます。
./chk: line 98: unexpected EOF while looking for matching `"'
./chk: line 103: syntax error: unexpected end of file
とのエラーが返ってきました。
初めに質問させていただいたときに貼ったスクリプトは完成されたものであって、その時はエラーが出なかったのです。
埋め込みをしたかった箇所を、完成したスクリプトに足すと、上記のようなエラーが出てしまいました。
まだ勉強し始めたばかりなので、何がなんだかよくわかっておりませんげっそり
またお世話になることがありましたら、よろしくご指導ください。

>裕夜さん
詳細なコメントありがとうございました。
まだcaseやesacは習っていませんが、わかるような感じがします。
elifやelseを使うより、簡単なのかしら?
インデントの件、たしかにそうだと思います。
なんとか無事スクリプトも出来上がりました。
またこちらで質問させていただくことがあると思います。
機会がありましたら、ご教授くださいますようよろしくお願いします。

http://channyd2.web.fc2.com/myshellscript2.htm
はじめまして。

教えてください!

oracleのV$SYSSTAT
から

physical reads
physical reads direct
physical reads direct (lob)

をぬきだし
evalを使用してキャッシュヒット率を計算して
ファイルに保存するというプログラムを作成しています

ファイルに保存はわかるのですが
evalを使用してキャッシュヒット率の計算方法がわかりません...

どなたかご教授お願いします><



初めまして、質問です。
PostgreSQLのインストール・PostgreSQLユーザー作成(root)するスクリプトを作ろうとしています。
BASHを使わないのなら、
# su - postgres
# createuser -sdr root
# exit
とするだけなのですが、スクリプト内ではsu出来ないようで困っています。
解決策をご存知の方がいらっしゃいましたらご教示お願いします!
> 16

evalを使用しての計算というのが僕にはわからないのですが・・・
exprのことでしょうか?

的外れなこと言ってたらすみません。

ただ、シェルスクリプト内で計算するなら計算したい数値を変数に読み込んで、
exprコマンドやら(( ))で計算させるといった感じしか思いつかないですねぇ。

個人的には入り組んだ計算をシェルでしたいのならawkがオススメですが、
そのへんの話は微妙にこのコミュの話ではないかなぁ・・・



> 18

シェルスクリプト内に
su - postgres
createuser -sdr root
exit
と書いて出来なくて困っているのでしょうか?

であれば、suをmanして-cオプションを調べれば解決すると思います。

上記のように書いた場合のシェルスクリプトの動きとしては、
su - postgres
が実行されるタイミングでpostgresユーザのログインシェルが起動してしまうのです。

で、exitするとシェルスクリプトの後続処理が再開されると。

そんな感じの動きをするので上記のような3行をシェルスクリプト内に書いても
期待する動きはしてくれません。

こっちも的外れなこと言ってたらすいません。

あてずっぽうで答えてますw
>>19
# su - -c 'createuser -sdr root' postgres
とする事で解決できました!
ありがとうございました!
vi は使わずに、
tr '"' '\012' <A >B
でどうですか?
sedとawkも置いときますね。

$ echo 'http://asdf.jpg"http://sjopw.jpg"http://jdopsa.jpg"' | sed 's/"/\
/g'
$ echo 'http://asdf.jpg"http://sjopw.jpg"http://jdopsa.jpg"' | awk 'BEGIN{RS="\""}{print}'
主に bash を使っています。
コマンド履歴を呼び出した後のカーソル移動について教えて下さい。

例えば上矢印で直前コマンドを呼び出します。
この状態で ^a は先頭移動。^e は行末移動ですよね。
ここで単語(空白区切り)単位でカーソルを移動するにはどうしたら良いですか?

^w だと後ろから単語単位で消えていきますね。
聞きたいのは「消えないで移動」する方法です。
マニュアルの

8.4.1 Commands For Moving

に、こうあります。

`forward-word (M-f)'
Move forward to the end of the next word. Words are composed of
letters and digits.

`backward-word (M-b)'
Move back to the start of the current or previous word. Words are
composed of letters and digits.


要は Emacs と同じですね。
M-f は ESC を一回押してから、f を一回押す、2ストロークコマンドです。
使いにくければ、他のキーにバインドするのもありでしょう。

ログインすると、残り7件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

#!/bin/sh 更新情報

#!/bin/shのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング