• 締切済み

Shellのパターンマッチについて

Linux初心者で正規表現やパターンマッチの方法にあまり詳しくない者です。 以下はWeb上で公開されているiscsiの設定を行うシェルのサンプルです。 # -- ここから #!/bin/sh #iscsidev.sh BUS=${1} HOST=${BUS%%:*} LUN=`echo ${BUS} | cut -d":" -f4` file="/sys/class/scsi_host/host${HOST}/device/session*/iscsi_session*/targetname" target_name=`echo $(cat ${file}) | cut -d":" -f2` if [ -z "${target_name}" ]; then exit 1 fi echo "${target_name} ${LUN}" # --ここまで サンプルをコピペしてそのまま動かしたのですが、きちんと動作していないようだったので、 1行ずつ端末上で実行し、確認したところ、 file="/sys/class/scsi_host/host${HOST}/device/session*/iscsi_session*/targetname" で指定している部分で該当するファイル・ディレクトリがないエラーになっていました。 実際のディレクトリは/sys/class/scsi_host/host0~9のようになっているのに対し、 この設定では${HOST}の部分がうまくいってないようで /sys/class/scsi_host/host/device~と、「~hostの後が任意の数字」のように意図 しているにもかかわらず、そのようになっていないようです。 このような場合、 BUS=${1} HOST=${BUS%%:*} LUN=`echo ${BUS} | cut -d":" -f4` の部分はどのように修正したらよいでしょうか?

みんなの回答

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.2

>1行ずつ端末上で実行し、確認したところ、 って、もしかして、iscsidev.sh のファイルに書いていることを1行ずつ、シェル端末からキーインorコピペして実行したと言うことですか? /etc/udev/rules.d/55-openiscsi.rules を読み取っているプログラムが、そのファイル中にある%bをどのように置換してコマンドを起動しているのかを調べて、それを BUS= にセットしてください。 もっと楽に確認するのは、iscsidev.sh の BUS=${1} の行の後に、 echo "$BUS" > /tmp/value-of-BUS とでも入れて実行させてみて、内容を確認する。

cypher00
質問者

補足

>って、もしかして、iscsidev.sh のファイルに書いていることを1行ずつ、シェル端末からキーインorコピペして実行したと言うことですか? そのとおりです。 >echo "$BUS" > /tmp/value-of-BUS >とでも入れて実行させてみて、内容を確認する。 BUS,HOST,LUNのそれぞれについて仕込んでみました。 # iscsiadm -m node -L all Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata1.voting1, portal: XX.XX.XX.XX,3260] Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata1.voting2, portal: XX.XX.XX.XX,3260] Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata1.voting3, portal: XX.XX.XX.XX,3260] Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata1.asmdata1, portal: XX.XX.XX.XX,3260] Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata1.ocr, portal: XX.XX.XX.XX,3260] として、iscsiにログインし、そこで作成されている各ファイルの内容を確認すると、 [root@XXX tmp]# cat value-of-BUS 4:0:0:0 [root@XXX tmp]# cat value-of-HOST 4 [root@XXX tmp]# cat value-of-LUN 0 これだと、最終的にHOSTには"4"が入ることになると思うのですが、iscsiの領域は5つあります。 この値は本当にこのままセットしてしまってよいものでしょうか?

回答No.1

起動時にデバイスファイル名を引数として要求している気がしますが きちんと指定していますか?

cypher00
質問者

補足

シェルそのものは、以下のルールファイル(?)の中から呼び出されるようです。 # -- ここから # /etc/udev/rules.d/55-openiscsi.rules KERNEL=="sd*", BUS=="scsi", PROGRAM="/etc/udev/scripts/iscsidev.sh %b", SYMLINK+="iscsi/%c{1}/lun%c{2}/part%n", OWNER="XXXX", MODE="0640", GROUP="disk" # -- ここまで ※OWNERはダミーです。ユーザ名が入っています。 PROGRAM=で指定された末尾の%bが引数なのだと思いますが、 これでデバイスファイル名が渡るのかどうか? この/etc/udev/rules.d/55-openiscsi.rulesを作成するときの指定が cat > /etc/udev/rules.d/55-openiscsi.rules なので、それ以前の記述はないはずだと思いますが……。

関連するQ&A

  • SCSI用語について

    度々すみません。 SCSIなのですが ホストとバス(チャネル)、ターゲット(SCSI ID)、 LUN などの 用語があります。 この中でバスとチャネルは同意義っぽいですが具体的にはどの部分を 指すのでしょうか?。例えばディジーチェーン接続でn台のデバイスを 数珠繋ぎにした際に、デバイス間のケーブルのことを指すのでしょうか。。 あと例えばですが、ホストにSCSIカードが4枚あってそれぞれ 4台のSCSIデバイス(外付けディスク)に接続させるとします。 この場合、チャネルとターゲットは4つという解釈で問題ないでしょうか?。 ※構成上あり得るかわからないのですが・・ なんとも細かくなりすみませんが よろしくお願いします。

  • ハードウェアの安全な取り外、内蔵ドライブを非表示

    使用環境 win10 調べた結果、 「デバイスマネージャー」→「ディスクドライブ」→ 内臓HDDのプロパティから「場所」のBus Numberの数字をメモ。 レジストリエディタより、 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\storahci\Parameters\Device 内に、「TreatAsInternalPort」複数行文字列値(REG_MULTI_SZ)を作成。 Bus Numberを改行し全部入力。 0 1 3 上記を行ったのですが、添付のようにBus Numberの番号が重複しています。 重複している片方は消えたのですが、もう片方が消えてくれません。 (Eドライブ、Fドライブが残ってしまいます。) ・ドライブ C Bus Number 1, Target ld 0, LUN 0 D Bus Number 0, Target ld 0, LUN 0 E Bus Number 0, Target ld 0, LUN 0 F Bus Number 1, Target ld 0, LUN 0 G Bus Number 3, Target ld 0, LUN 0 ドライブを非表示にする方法をご教示ください。

  • TurboLinux7serverのRAID構成について

    TurboLinux7serverをソフトウェアRAID構成にてインストールしました。 インストール後に cat /proc/mdstatを見たのですが以下のように表示されました。 md0 : active raid1 ide/host0/bus0/target0/lun0/part1[0] ide/host0/bus0/target1/lun0/part1[1] 64128 blocks [2/2] [UU] 実際の構成は、/dev/hdaと/dev/hdbですが上記のmdstatだとどちらが/dev/hdaで どちらが/dev/hdbなのかが分かりません。 これについて何か分かる方、もしくは解説しているURLなどありましたら教えて ください。 毎度毎度すみませんがよろしくご教授くださいませ。

  • windowsで使用していたUSBハードディスク上のwin95拡張領域

    windowsで使用していたUSBハードディスク上のwin95拡張領域(LBA)をlinuxにマウントしたいのですが、マウントできません。どうすればいいでしょうか。 *基本情報 OS: Redhat EnterPrise WS Release 3 カーネル:2.4.21-57-ELsmp *ディスクの情報 scsi機器として認識はされている様子(下記のscsi2)。 % more /proc/scsi/scsi Attached devices: Host: scsi0 Channel: 00 Id: 00 Lun: 00 Vendor: ATA Model: HDS724040KLSA80 Rev: KFAO Type: Direct-Access ANSI SCSI revision: 05 Host: scsi0 Channel: 00 Id: 01 Lun: 00 Vendor: ATA Model: Maxtor 6H400F0 Rev: HA43 Type: Direct-Access ANSI SCSI revision: 05 Host: scsi2 Channel: 00 Id: 00 Lun: 00 Vendor: LOGITEC Model: LHD-PBEU2 Rev: 1.16 Type: Direct-Access ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 00 Vendor: SONY Model: CDRW/DVD CRX330E Rev: MDK3 Type: CD-ROM ANSI SCSI revision: 02 *FDISKによる情報 % /sbin/fdisk -l /dev/sdc Disk /dev/sdc: 159.8 GB, 159832012800 bytes 255 heads, 63 sectors/track, 19431 cylinders Units = シリンダ数 of 16065 * 512 = 8225280 bytes デバイス ブート 始点 終点 ブロック ID システム /dev/sdc1 2 19431 156071475 f Win95 拡張領域 (LBA) /dev/sdc5 2 19431 156071443+ 7 HPFS/NTFS *この状態でマウントすると次のようなエラーが出る。 % mount -t ext3 /dev/sdc1 /mnt/A mount: 間違ったファイルシステムタイプ、不正なオプション、 /dev/sdc1 のスーパーブロックが不正、或いはファイルシステムのマウント が多すぎます (aren't you trying to mount an extended partition, instead of some logical partition inside?) なお、マウントポイントである/mnt/Aは予めディレクトリを作ってあります。

  • antについての質問です

    いつもお世話になっております。早速antについて質問させていただきます。 予めプロパティを複数設定しておいて  <property name="1" value="http://www.aaaa.co.jp"/>  <property name="2" value="http://www.bbbb.co.jp"/>  <property name="3" value="http://www.cccc.co.jp"/>      ・      ・      ・ inputタスクでユーザー入力した値のプロパティを呼び出したいのですがなかなかうまくいきません。 一つ一つのプロパティに対して呼び出すターゲットを作りantcallで呼び出せば可能なのですが <antcall ="number${ユーザー入力値}"> <target name="number1">   <echo message="${1}" /> </target> プロパティの数が物凄く多くなるとターゲットの量が膨大になるのでもっとシンプルに作ろうと思っています。そこで  <echo message="${${ユーザー入力値}}" /> と一行にまとめた所、エラーとなってしまいます。何か良い解決策はないでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • phpで読み込んだcsvが文字化けします

    PHPでCSVよ読み込んで名簿を作っています。 出力まではうまくいったのですが、なぜか一字だけ文字化けしてしまいます。(「務」→「冶」になってしまいます) 普段あまりプログラムはしないので、原因がわからず困りはてております。よろしくお願いいたします。 PHP部分の記述は以下になります。 ――――――――――――――――――――――――――――――――――― <?php $fname = "csv/meibo.csv"; $file = fopen($fname, "r"); $nowrap = "nowrap=\"nowrap\""; $tcent = "class=\"center\""; $tbg = "class=\"even\""; while (list($name, $post, $add, $add2, $tel, $http, $url, $mail) = fgetcsv($file, 1000, ",")){ $name = strtr($name, "﨑", "崎"); $add2 = strtr($add2, "﨑", "崎"); $tline ++; if($tline % 2 == 0){ echo "<tr $tbg>\n"; }else{ echo "<tr>\n"; } echo "<td $nowrap>$name</td>\n"; echo "<td $tcent>$post</td>\n"; echo "<td>$add<br />$add2</td>\n"; echo "<td $tcent>$tel</td>\n"; if($http == "http://"){ echo "<td $tcent><a href=\"$http$url\" target=\"_blank\"><img src=\"img/common/img_hp.gif\" alt=\"HPへ\" width=\"16\" height=\"16\" /></a></td>\n"; } else { echo "<td $tcent>&nbsp;</td>\n"; } echo "<td>$mail</td>\n"; echo "</tr>\n"; } fclose($file); ?> ――――――――――――――――――――――――――――――――――― PHP4を利用。 .phpのcharsetはShift_JISで、同じくShift_JISで保存しています。 CSVファイルはエクセルで作りShift_JISで書き出しています。

    • ベストアンサー
    • PHP
  • 入力フォームのエラーメッセージをJavaScrip

    付属の写真のようにエラーが出るようにしたいです。 提示したコードだけでは、エラーメッセージ文字が上の方に出てくるだけで、四角い図形も出てきません。 javascriptでエラーメッセージを出せれば、写真のようなになると思います。 そこでなのですが、 PHPのコードはそのまま崩さずjavascriptでも同じエラーメッセージ出すコードが書けません。どうコードを書いたら よいでしょうか? nameとquestionの2つフォームとがあります。 回答よろしくお願いいたします。 <?php session_start(); $errors = array(); if(isset($_POST['submit'])) { $plan = $_POST['plan']; $name = $_POST['name']; $question = $_POST['question']; if($name === "") { $errors['name'] ="名前が入力されていません。 "; } if($question === "") { $errors['question'] ="お問い合わせ内容入力(150文字以内)が入力されていません。 "; } if(count($errors) === $_SESSION['name'] = $name; $_SESSION['question'] = $question;     /* 確認画面の表示, */     header('Location:http://▼▼php');     exit();      }   }     if(isset($_GET['action']) && $_GET['action'] === 'edit'){   $name = $_SESSION['name']; $question = $_SESSION['question'];   }     ?> <!DOCTYPE html> <html lang="ja"> <head>     <meta content="text/html; charset=utf-8" />        <title>お問い合わせ画面</title>     <style type="text/css">       /* 入力フォームの位置 */       .auto-style1 { text-align: center; } </style> <?php echo "<ul>";foreach($errors as $value) { echo "<li>"; echo $value; echo "</li>"; } echo "</ul>"; ?> </head> <body> <form action="companyhp6form1.php" method="post"> <div class="auto-style1">  <p class="tel-titile">    名前:※             </p>             <input type="text" class="name" name="name" id="name" value="<?php if(isset($name)){ echo $name; } ?>" />   </div>     <div class="auto-style1">    <p class="tel-titile">                 お問い合わせ内容入力(150文字):             </p>                <textarea name="question" class="question" id="question" cols="40" rows="10" placeholder="150文字以内で入力して下さい。"></textarea>                                     </div>                     <div class="auto-style1">             <button type="submit" id="submit" name="submit" class="auto-style4">                送信</button>         </div>             </form>   </body>  <script src="main.js"></script> </html>

  • php $_SESSIONで値が消える。

    いつもお世話になり誠にありがとうございます。 標記の件。 インプット画面ー>確認画面ー>戻るー>インプット画面 インプット画面に戻った時、どうしても最初のインプット画面で打った内容が消えてしまいます。 プログラムを診て、誤りを指摘して頂けないでしょうか? どうぞよろしくお願い致します。           記 <?php session_start(); $mode = 'input'; if( isset($_POST['back']) && $_POST['back'] ){ //何もしない } else if( isset($_POST['confirm']) && $_POST['confirm'] ){ $_SESSION['name'] = $_POST['name']; $_SESSION['email'] = $_POST['email']; $_SESSION['category']= $_POST['category']; $_SESSION['message'] = $_POST['message']; $mode = 'confirm'; } else if( isset($_POST['send']) && $_POST['send'] ){ $mode = 'send'; } else { $_SESSION['name'] =""; $_SESSION['email'] =""; $_SESSION['category']=""; $_SESSION['message'] =""; } ?> <!DOCTYPE html> <html lang="ja"> <head> </head> <body> <div class="v_line_fix"> <h1>Blog K・T</h1> <h2><a href="index.html">トップページ</a></h2> <?php if( $mode=='input'){ ?> <form method=post> お名前(ニックネーム)<br> <input type="text" name="name" value="<?php echo $_SESSION['name'] ?>"><br> Eメール<br> <input type="email" name="email" value="<?php echo $_SESSION['email'] ?>"><br> カテゴリー<br> <input type="text" name="category" value="<?php echo $_SESSION['category'] ?>"><br> 本文<br> <textarea style="font-size:1.5em;" cols="30" rows="80" name="message"><?php echo $_SESSION['message'] ?></textarea><br> <input type="submit" name="confirm" value="確認" /> </form> <?php }else if( $mode=='confirm'){ ?> <!--確認画面--> <form method="post"> <?php echo $_SESSION['name']?><br> <?php echo $_SESSION['email']?><br> <?php echo $_SESSION['category']?><br> <br> <?php echo nl2br($_SESSION['message'])?><br> <input type="submit" name="back" value="戻る"/> <input type="submit" name="send" value="送信"/> } </form> <?php } else { ?> <!--完了画面--> <?php } ?> </body> </html>

    • ベストアンサー
    • PHP
  • htmlとphpのデータ受け渡し???

    いつもお世話になり誠にありがとうございます。 標記の件。 まだ、ボク自身、解っていないようです。 htmlとphpのソースコードを提示します。 どうすればデータの受け渡しができるか? 添削してくださらないでしょうか? html <!--入力画面--> <form action = "./Blog.php" method = "get"> <label class="label" for="name">お名前(ニックネーム)</label> <center><input id="name" type="text" name="name"></center> <label class="label" for="e-mail">メール</label> <input id="e-mail" type="e-mail" name="e-mail"> <label class="label" for="category">カテゴリー</label> <input id="category" type="category" name="categoryl"> <label class="label" for="message">本文</label> <textarea name="area1" style="color:rgb(8, 8, 8); font-size:100%;" cols="50" rows="30"></textarea><br> <input type="submit" name="confiem" value="確認"> </form> CSS <meta charset="utf-8"> <?php session_start(); $mode = 'input'; if( isset($_POST['back']) && $_POST['back'] ){ //何もしない } else if( isset($_POST['confirm']) && $_POST['confirm'] ){ $_SESSION['name'] = $_POST['name']; $_SESSION['e-mail'] = $_POST['e-mail']; $_SESSION['category']= $_POST['category']; $_SESSION['message'] = $_POST['message']; $mode = 'confirm'; } else if( isset($_POST['send']) && $_POST['send'] ){ $mode = 'send'; } else { $_SESSION['name'] =""; $_SESSION['e-mail'] =""; $_SESSION['category']=""; $_SESSION['message'] =""; } ?> <!--確認画面--> <?php if( $mode == 'input' ){ ?> お名前(ニックネーム)<?php echo $_POST['name'] ?><br> Eメール<?php echo $_POST['e-mail'] ?><br> カテゴリー<?php echo $_POST['category'] ?><br> 本文<br> <?php echo nl2br($_POST['message']) ?><br> <input type="submit" name="back" value="戻る" /> <input type="submit" name="send" value="送信" /> <?php } else { ?> <!--完了画面--> <?php } ?> 上記の通りです。 全然ダメだと思います。 添削のほど、宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 参照渡しからの配列変数名取得。

    現在PHPを勉強中で、 以下のようなスクリプトを書いていて <?php function character(&$target) { $arrayName = $target."_name"; echo ($arrayName); } $animals[] = 'いぬ'; $animals[] = 'さる'; $animals[] = 'きじ'; character($animals); echo ("<br />"); $fish[] = 'まぐろ'; $fish[] = 'ひらめ'; $fish[] = 'かつお'; $fish[] = 'あじ'; character($fish); ?> このようにすると$arrayNameの出力が2つともArray_nameとなってしまうので、 この部分を各配列の変数名($animals_name、$fish_name)のように個別に 出力できるようにしたいのですが、どのように書けば出来るのでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • PHP