Apache Velocityを使ってテンプレートエンジンを使ってみる

Apache Velocityを使ってテンプレートエンジンを使ってみる

Velocityは「ApacheJakartaプロジェクト」のテンプレートエンジンで、Javaベースで作られている。テンプレートエンジンは「雛形になるドキュメント」に必要な値を埋め込んで合成して成果物を作成するソフトウエアで、今回は、「Velocity」というやつを使ってみようと思う。また、ついでに「Log4J」というこれも「ApacheJakartaプロジェクト」のJavaプログラム用のログ APIを使ってみようかと思う。最近はJava関連のネタ多いけど、今回もJava関連で。。サーバ周りでまだやることあるんだけど・・

 

ダウンロード(Apache Velocity Project)http://velocity.apache.org/

 

今回やること

  • ・Velocityを使うための設定
  • ・log4jの設定と使用
  • ・Velocityを使ったサンプルの作成

サンプルの概要は以下
URLが入力されているCSVファイルを読み込んでブックマークHTMLファイルとして出力する

入力

出力

 

目次

・Velocity、log4jを使うための設定

ディレクトリの作成

以下のようなディレクトリ構成にする。

 

プロパティーファイルの作成

Log4Jのプロパティー

../eclipse/workspace/Velocity/properties/log4j.properties

log4j.debug=false
log4j.rootLogger=INFO, Console, file
 
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
# log4j.appender.Console.layout.ConversionPattern=%t %c#%M %p %m%n
log4j.appender.Console.layout.ConversionPattern=%d %5p %c{1} - %m%n
 
# direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=log/VelocityTest.log
log4j.appender.file.Append=true
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d %5p %c{1} - %m%n

Velocityのプロパティー

../eclipse/workspace/Velocity/properties/velocity.properties

resource.loader=class
class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
input.encoding=UTF-8

Libの準備(今回のサンプル作成で必要な物)

(Apache Velocity Project)http://velocity.apache.org/からダウンロードしてきたものを配置する

 

・Velocityを使ったサンプルの作成

Eclipseのビルドパスの設定

 

・入力ファイルの作成

../eclipse/workspace/Velocity/input/BookmarkList.csv

Brokendish Blog,https://brokendish.org
Google,http://google.com
yahoo,http://yahoo.co.jp
あいうえお,http://1263456789
赤青黄色,http://abcsdefg

・vm(テンプレートファイルの作成)

../eclipse/workspace/Velocity/vm/BookmarkHTML.vm

 
<html lang="ja">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
 
#foreach(${bml} in ${bookMarkslst})
<strong>${bml.name}</strong> 
<br> 
<a href="${bml.url}" > 
${bml.url}</a> 
<br><br> 
#end
 
##ここから下はテスト ここはコメント文
テスト
---------------------------------------------------------------
if文の動作 比較
---------------------------------------------------------------
Javaからの値
aaa=$aaa
bbb=$bbb
ccc=$ccc
 
 
①----if文の動作 数値比較----
##右辺の値を左辺に代入する
#set($aaa = 1)
#set($bbb = 3)
aaa=$aaa
bbb=$bbb
#if($aaa < $bbb)
${aaa} より ${bbb}は大きい
#else
${aaa} より ${bbb}は大きくない
#end
 
 
</html>

・Javaソースの作成

../workspace/Velocity/src/brokendish/verocity/VerocityMakeMain.java

package brokendish.verocity;
 
public class VerocityMakeMain {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		VerocityBookmarkMake aa = new VerocityBookmarkMake();
		aa.MakeTest();
	}
 
}

 

../workspace/Velocity/src/brokendish/verocity/VerocityBookmarkMake.java

package brokendish.verocity;
 
import java.io.File;
import java.io.StringWriter;
import java.util.ArrayList;
 
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
 
import brokendish.velocity.util.BookmarksStruct;
import brokendish.velocity.util.FileUtil;
import brokendish.velocity.util.StructSet;
 
public class VerocityBookmarkMake {
 
	private String Log4jPROPERTIES;
	private String TEMPLATEVM;
	private String INPUTFile;
	private String OUTPUTFile;
	private String VELOCITYPROPERTIES;
 
	public VerocityBookmarkMake(){
 
		// apache.log4jのプロパティーファイルの指定
		Log4jPROPERTIES = "properties/log4j.properties";
		// Velocityのプロパティーファイルの指定
		VELOCITYPROPERTIES="properties/velocity.properties";
		// テンプレートファイル
		TEMPLATEVM = "BookmarkHTML.vm";
		// 入力ファイル
		INPUTFile = "input/BookmarkList.csv";
		// 出力ファイル
		OUTPUTFile = "output/BookmarkList.html";
 
	}
 
	public void MakeTest(){
 
		// apache.log4jのインスタンス生成
		Logger log = org.apache.log4j.Logger.getLogger( this.getClass() );
		// apache.log4jのプロパティーファイルの指定
		PropertyConfigurator.configure(Log4jPROPERTIES);
 
		try{
			// プロパティーファイルを読み込む
			// LOG出力----------------------------------------------------
			log.info("プロパティーファイル読込" + "&lt;&lt;&lt; properties/velocity.properties");	
			Velocity.init(VELOCITYPROPERTIES);
 
			// VelocityContextを生成
			// LOG出力----------------------------------------------------
			log.info("VelocityContextを生成" );		
			VelocityContext vc = new VelocityContext();
 
			// ファイル入力→ArrayListにする
			// LOG出力----------------------------------------------------
			log.info("ファイル入力");		
			File fl = new File(INPUTFile);
			ArrayList infileAllay = new ArrayList();
			infileAllay = FileUtil.inputFileToArray(fl);
 
			// BookmarksStruct型のArrayListを生成
			// LOG出力----------------------------------------------------
			log.info("BookmarksStruct型のArrayListに値を設定する");
			ArrayList al = new ArrayList();
 
			// 入力ファイルのArrayListをBookmarksStruct型の構造体にする
			// LOG出力----------------------------------------------------
			log.info("入力ファイルのArrayListをBookmarksStruct型の構造体にする");
			StructSet st = new StructSet();
			al = st.arraySetBookmarks(infileAllay);
 
			// テンプレート(vm)にBookmarksStruct型のArrayListを渡す
			// LOG出力----------------------------------------------------
			log.info("VelocityContextにデータを設定");
			vc.put("bookMarkslst",al);
			vc.put("aaa", "9");
			vc.put("bbb", "1");
			vc.put("ccc", "END");
 
			// テンプレートファイルを読み込み
			Template template = null;
			template = Velocity.getTemplate(TEMPLATEVM,"UTF-8");
 
			// マージ後データ格納用
			StringWriter w = new StringWriter();
 
			// テンプレートとデータをマージする
			template.merge(vc, w);
 
			// LOG出力----------------------------------------------------
			log.info("SYSOUTに表示してみる" +w.toString());
			// LOG出力----------------------------------------------------
			log.info("出たかな" );
 
/*			// SYSOUTに表示してみる
			System.out.println(w.toString());*/
 
			// ファイルに出力
			// LOG出力----------------------------------------------------
			log.info("ファイルに出力");
			File ofl = new File(OUTPUTFile);
			FileUtil.fileWriter(w.toString(),ofl);
 
			w.close();
		}
		catch(Exception e){
			e.printStackTrace();
		}
 
	}
}

 

../workspace/Velocity/src/brokendish/velocity/util/BookmarksStruct.java

package brokendish.velocity.util;
 
public class BookmarksStruct {
 
	private String url;
	private String name;
 
	public String getUrl() {
		return url;
	}
	public String getName() {
		return name;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 

../workspace/Velocity/src/brokendish/velocity/util/FileUtil.java

package brokendish.velocity.util;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
 
public class FileUtil {
 
	/**
	 * 入力ファイルをArrayListに格納して返却
	 * 
	 * @param inputFile 入力ファイルパス
	 * @return ArrayList
	 */
	public static ArrayList inputFileToArray(File inputFile){
 
		ArrayList strAl = new ArrayList();
 
		try{
			FileReader infl = new FileReader(inputFile);
			BufferedReader bfr = new BufferedReader(infl);
			String ins = "";
			while( (ins = bfr.readLine()) != null){
				strAl.add(ins);				
			}
			bfr.close();
		}
		catch (IOException e){
			e.printStackTrace();
		}	
		return(strAl);
	}
 
	/**
	 * 文字列をファイルに出力
	 * 
	 * @param wr 文字列
	 * @param outputFile 出力ファイルのパス
	 * 
	 */
	public static void fileWriter(String wr,File outputFile){
 
		try{
			FileWriter filewriter = new FileWriter(outputFile);
			BufferedWriter bw = new BufferedWriter(filewriter);
			PrintWriter pw = new PrintWriter(bw);
 
			pw.print(wr);
			pw.close();
 
		}
		catch (IOException e){
			e.printStackTrace();
		}
 
	}
}

 

../workspace/Velocity/src/brokendish/velocity/util/StructSet.java

package brokendish.velocity.util;
 
import java.util.ArrayList;
 
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
 
public class StructSet {
 
	/**
	 * ArrayList を ArrayList型に設定して返却
	 * Splitで区切る
	 *  setName(sp[0])
	 *  setUrl(sp[1])
	 * 
	 * @param al ArrayList
	 * @return ArrayList
	 */
	public ArrayList arraySetBookmarks(ArrayList al){
 
		// apache.log4jのインスタンス生成
		Logger log = org.apache.log4j.Logger.getLogger( this.getClass() );
		// apache.log4jのプロパティーファイルの指定
		PropertyConfigurator.configure("properties/log4j.properties");
 
		// BookmarksStruct型のArrayListを作成
		ArrayList bkmlst = new ArrayList(); 
 
		// String型のArrayListをSplitしてBookmarksStruct型にする
		// LOG出力----------------------------------------------------
		log.info("String型のArrayListをSplitしてBookmarksStruct型にする");	
		for(String spli : al){
			// BookmarksStruct(構造体みたいなの)生成
			BookmarksStruct bkm = new BookmarksStruct();
			String[] sp = spli.split(",");
			// CSVファイルのカンマ区切り順に設定する
			bkm.setName(sp[0]);
			bkm.setUrl(sp[1]);
			// ArrayListに追加
			bkmlst.add(bkm);
		}
 
		return (bkmlst);
	}
 
}

 

・実行結果

出力ファイル

 

・ログ

 

 

ここからは別のサンプル

処理概要

入力ファイル(CSV)に記載されている「job」「step」「file」の項目を元にcshellを複数ファイル生成する。
「job」の単位で「job」+「.sh」をファイル名としてシェルを作成する。
「step」は「job」の単位内でのラベル名として設定し、「job」単位の最後のSTEPはEND_PROCに行くようにする。
(サンプルではJOBの正常終了の判定はしていないのでgotoの意味はない。STEP1からEND_PROCまで順次実行される)

プロパティーファイルとかの設定は変わらないので省略するよ!

 

/workspace/Verocity-Shell/src/brokendish/verocityshell/VerocityMakeMain.java

package brokendish.verocityshell;
 
public class VerocityMakeMain {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		VerocityJobShellMake aa = new VerocityJobShellMake();
		aa.MakeTest();
	}
}

/workspace/Verocity-Shell/src/brokendish/verocityshell/VerocityJobShellMake.java

package brokendish.verocityshell;
 
import java.io.File;
import java.io.StringWriter;
import java.util.ArrayList;
 
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
 
import brokendish.velocityshell.util.JobShellStruct;
import brokendish.velocityshell.util.FileUtil;
import brokendish.velocityshell.util.StructSet;
 
public class VerocityJobShellMake {
 
	private String Log4jPROPERTIES;
	private String TEMPLATEVM;
	private String INPUTFile;
	private String OUTPUTFile;
	private String VELOCITYPROPERTIES;
 
	public VerocityJobShellMake(){
 
		// apache.log4jのプロパティーファイルの指定
		Log4jPROPERTIES = "properties/log4j.properties";
		// Velocityのプロパティーファイルの指定
		VELOCITYPROPERTIES="properties/velocity.properties";
		// テンプレートファイル
		TEMPLATEVM = "JobShell.vm";
		// 入力ファイル
		INPUTFile = "input/JobList.csv";
		// 出力ファイル
		OUTPUTFile = "output/BookmarkList.html";
 
	}
 
	public void MakeTest(){
 
		// apache.log4jのインスタンス生成
		Logger log = org.apache.log4j.Logger.getLogger( this.getClass() );
		// apache.log4jのプロパティーファイルの指定
		PropertyConfigurator.configure(Log4jPROPERTIES);
 
		try{
			// プロパティーファイルを読み込む
			// LOG出力----------------------------------------------------
			log.info("プロパティーファイル読込" + "<<< properties/velocity.properties");	
			Velocity.init(VELOCITYPROPERTIES);
 
			// VelocityContextを生成
			// LOG出力----------------------------------------------------
			log.info("VelocityContextを生成" );		
			VelocityContext vc = new VelocityContext();
 
			// ファイル入力→ArrayListにする
			// LOG出力----------------------------------------------------
			log.info("ファイル入力");		
			File fl = new File(INPUTFile);
			ArrayList<String> infileAllay = new ArrayList<String>();
			infileAllay = FileUtil.inputFileToArray(fl);
 
			// JobShellStruct型のArrayListを生成
			// LOG出力----------------------------------------------------
			log.info("JobShellStruct型のArrayListに値を設定する");
			ArrayList<JobShellStruct> al = new ArrayList<JobShellStruct>();
 
			// 入力ファイルのArrayListをJobShellStruct型の構造体にする
			// LOG出力----------------------------------------------------
			log.info("入力ファイルのArrayListをJobShellStruct型の構造体にする");
			StructSet st = new StructSet();
			al = st.arraySetBookmarks(infileAllay);
 
			//@@-----------loop----------------------------------------------
			for(int i=0;i<al.size();i++){
				// JobShellStruct型に入ってるデータを必要な分に区切ってテンプレートに渡す
				ArrayList<JobShellStruct> al2 = new ArrayList<JobShellStruct>();
 
				while(true){
					al2.add(al.get(i));
					// nextstepの値が「"END_PROC"」だったらシェルをファイルに書き出す
					if(al.get(i).getNextstep().equals("END_PROC")){
						break;
					}
					i++;
				}
 
				// テンプレート(vm)にJobShellStruct型のArrayListを渡す
				// 	LOG出力----------------------------------------------------
				log.info("VelocityContextにデータを設定");
				vc.put("jobshellLst",al2);
 
 
				// テンプレートファイルを読み込み
				Template template = null;
				template = Velocity.getTemplate(TEMPLATEVM,"UTF-8");
 
				// マージ後データ格納用
				StringWriter w = new StringWriter();
 
				// テンプレートとデータをマージする
				template.merge(vc, w);
 
				// LOG出力----------------------------------------------------
				log.info("SYSOUTに表示してみる" +w.toString());
				// LOG出力----------------------------------------------------
				log.info("出たかな" );
 
 
				// ファイルに出力
				// LOG出力----------------------------------------------------
				log.info("ファイルに出力");
				File ofl = new File("output/" + al.get(i).getJob() + ".sh");
				FileUtil.fileWriter(w.toString(),ofl);
 
				w.close();
			}
			//@@-----------loop----------------------------------------------
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
}

/workspace/Verocity-Shell/src/brokendish/velocityshell/util/StructSet.java

package brokendish.velocityshell.util;
 
import java.util.ArrayList;
 
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
 
public class StructSet {
 
	/**
	 * ArrayList<String> を ArrayList<JobShellStruct>型に設定して返却
	 * Splitで区切る
	 * 
	 * @param al ArrayList<String>
	 * @return ArrayList<BookmarksStruct>
	 */
	public ArrayList<JobShellStruct> arraySetBookmarks(ArrayList<String> al){
 
		// apache.log4jのインスタンス生成
		Logger log = org.apache.log4j.Logger.getLogger( this.getClass() );
		// apache.log4jのプロパティーファイルの指定
		PropertyConfigurator.configure("properties/log4j.properties");
 
		// JobShellStruct型のArrayListを作成
		ArrayList<JobShellStruct> bkmlst = new ArrayList<JobShellStruct>(); 
 
		// String型のArrayListをSplitしてJobShellStruct型にする
		// LOG出力----------------------------------------------------
		log.info("String型のArrayListをSplitしてBookmarksStruct型にする");	
		for(int i=0;i<al.size();i++){
			// JobShellStruct(構造体みたいなの)生成
			JobShellStruct bkm = new JobShellStruct();
			String[] sp = al.get(i).split(",");
			// CSVファイルのカンマ区切り順に設定する
			bkm.setJob(sp[0]);
			bkm.setStep(sp[1]);
			bkm.setFile(sp[2]);
 
			// 次のステップ確認
			if(al.size()>i+1){
				String[] sp2 = al.get(i+1).split(",");
				if(sp[1].compareTo(sp2[1]) == 0 || sp[1].compareTo(sp2[1]) > -1){
					bkm.setNextstep("END_PROC");
				}
				else{
					bkm.setNextstep("STEP_" + sp2[1]);
				}
			}
			else{
				bkm.setNextstep("END_PROC");
			}
 
			// ArrayListに追加
			bkmlst.add(bkm);
		}
 
		return (bkmlst);
	}
 
}

/workspace/Verocity-Shell/src/brokendish/velocityshell/util/JobShellStruct.java

package brokendish.velocityshell.util;
 
public class JobShellStruct {
 
	private String job;
	private String step;
	private String file;
	private String nextstep;
 
	public String getNextstep() {
		return nextstep;
	}	
	public String getJob() {
		return job;
	}
	public String getStep() {
		return step;
	}
	public String getFile() {
		return file;
	}
 
 
	public void setJob(String job) {
		this.job = job;
	}
	public void setStep(String step) {
		this.step = step;
	}
	public void setFile(String file) {
		this.file = file;
	}
	public void setNextstep(String nextstep) {
		this.nextstep = nextstep;
	}
}

/workspace/Verocity-Shell/src/brokendish/velocityshell/util/FileUtil.java

package brokendish.velocityshell.util;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
 
public class FileUtil {
 
	/**
	 * 入力ファイルをArrayListに格納して返却
	 * 
	 * @param inputFile 入力ファイルパス
	 * @return ArrayList
	 */
	public static ArrayList<String> inputFileToArray(File inputFile){
 
		ArrayList<String> strAl = new ArrayList<String>();
 
		try{
			FileReader infl = new FileReader(inputFile);
			BufferedReader bfr = new BufferedReader(infl);
			String ins = "";
			while( (ins = bfr.readLine()) != null){
				strAl.add(ins);				
			}
			bfr.close();
		}
		catch (IOException e){
			e.printStackTrace();
		}	
		return(strAl);
	}
 
	/**
	 * 文字列をファイルに出力
	 * 
	 * @param wr 文字列
	 * @param outputFile 出力ファイルのパス
	 * 
	 */
	public static void fileWriter(String wr,File outputFile){
 
		try{
			FileWriter filewriter = new FileWriter(outputFile);
			BufferedWriter bw = new BufferedWriter(filewriter);
			PrintWriter pw = new PrintWriter(bw);
 
			pw.print(wr);
			pw.close();
 
		}
		catch (IOException e){
			e.printStackTrace();
		}
 
	}
}

/workspace/Verocity-Shell/input/JobList.csv

Job001,1,/var/log/
Job001,2,/var/log/apache2
Job001,3,/var/log/tomcat6
Job002,1,/home/
Job003,1,/etc/ssh
Job003,2,/etc/ssl
Job004,1,/etc/vim
Job004,A,/etc/aa
Job004,B,/etc/bb

/eclipse/workspace/Verocity-Shell/vm/JobShell.vm

#!/bin/csh
 
#foreach($lst in ${jobshellLst})
#------------------------------------------
#Shell Name -- ${lst.job}  --
#------------------------------------------
STEP_${lst.step}:
echo "--------------------------------------------"
echo "STEP_"${lst.step} "Run Command::ls -ltra ${lst.file}"
echo "--------------------------------------------"
ls -ltra ${lst.file}
 
goto ${lst.nextstep}
#end
 
 
END_PROC:
echo "終了"
pwd
-----------------------------------------

 

 
結果の出力ファイル
 
Job001.sh

#!/bin/csh
 
#------------------------------------------
#Shell Name -- Job001  --
#------------------------------------------
STEP_1:
echo "--------------------------------------------"
echo "STEP_"1 "Run Command::ls -ltra /var/log/"
echo "--------------------------------------------"
ls -ltra /var/log/
 
goto STEP_2
#------------------------------------------
#Shell Name -- Job001  --
#------------------------------------------
STEP_2:
echo "--------------------------------------------"
echo "STEP_"2 "Run Command::ls -ltra /var/log/apache2"
echo "--------------------------------------------"
ls -ltra /var/log/apache2
 
goto STEP_3
#------------------------------------------
#Shell Name -- Job001  --
#------------------------------------------
STEP_3:
echo "--------------------------------------------"
echo "STEP_"3 "Run Command::ls -ltra /var/log/tomcat6"
echo "--------------------------------------------"
ls -ltra /var/log/tomcat6
 
goto END_PROC
 
 
END_PROC:
echo "終了"
pwd
-----------------------------------------

 
Job002.sh

#!/bin/csh
 
#------------------------------------------
#Shell Name -- Job002  --
#------------------------------------------
STEP_1:
echo "--------------------------------------------"
echo "STEP_"1 "Run Command::ls -ltra /home/"
echo "--------------------------------------------"
ls -ltra /home/
 
goto END_PROC
 
 
END_PROC:
echo "終了"
pwd
-----------------------------------------

 
Job003.sh

#!/bin/csh
 
#------------------------------------------
#Shell Name -- Job003  --
#------------------------------------------
STEP_1:
echo "--------------------------------------------"
echo "STEP_"1 "Run Command::ls -ltra /etc/ssh"
echo "--------------------------------------------"
ls -ltra /etc/ssh
 
goto STEP_2
#------------------------------------------
#Shell Name -- Job003  --
#------------------------------------------
STEP_2:
echo "--------------------------------------------"
echo "STEP_"2 "Run Command::ls -ltra /etc/ssl"
echo "--------------------------------------------"
ls -ltra /etc/ssl
 
goto END_PROC
 
 
END_PROC:
echo "終了"
pwd
-----------------------------------------

 
Job004.sh

#!/bin/csh
 
#------------------------------------------
#Shell Name -- Job004  --
#------------------------------------------
STEP_1:
echo "--------------------------------------------"
echo "STEP_"1 "Run Command::ls -ltra /etc/vim"
echo "--------------------------------------------"
ls -ltra /etc/vim
 
goto STEP_A
#------------------------------------------
#Shell Name -- Job004  --
#------------------------------------------
STEP_A:
echo "--------------------------------------------"
echo "STEP_"A "Run Command::ls -ltra /etc/aa"
echo "--------------------------------------------"
ls -ltra /etc/aa
 
goto STEP_B
#------------------------------------------
#Shell Name -- Job004  --
#------------------------------------------
STEP_B:
echo "--------------------------------------------"
echo "STEP_"B "Run Command::ls -ltra /etc/bb"
echo "--------------------------------------------"
ls -ltra /etc/bb
 
goto END_PROC
 
 
END_PROC:
echo "終了"
pwd
-----------------------------------------

 

 

 

Ubuntuカテゴリの最新記事