Google Classroomの設置

シェル(csh)入門

11.2 I/O リダイレクションとパイプ

  • I/O とは
  • コマンドの実行結果を別のコマンドに処理させたい!
  • 現在実行中のプロセス数は?
  • リダイレクション)ps aux > result ; wc result
  • パイプ)ps aux | wc
  • 標準入力 stdin
  • 標準出力 stdout
  • 標準エラー出力 stderr

11.2.1 リダイレクションとは

  • 標準出力をターミナルからファイルに変更
    ps aux > result
  • 標準入力をターミナルからファイルに変更
    cat < result

11.2.3 パイプ

  • コマンドの実行結果を標準出力から標準入力に変更
    e.g.) ps aux | wc
    「ps aux」による出力を「wc」への入力に変更

11.2.5 I/O リダイレクションとパイプの詳細

$command > file
$command >> file
$command >& file
( $command > file1 ) >& file2
$command1 | $command2
$command1 |& $command2

演習

  • 「ps aux」で全プロセスを出力し,root が実行しているプロセス数を数えよ.リダイレクションを使用する方法と,パイプを使用する方法二通りを考えよ.
    • ヒント1:ps aux による出力結果には,root 以外のユーザによるプロセスも含まれている.この中から root の記載されている行のみを探し出し,その行数を数えると「rootが実行しているプロセス数と考えられる.
    • ヒント2:次の3行が「test.txt」というファイルに書かれているとする.
      abc
      1 2 3
      abc 1 2 3
    • このファイルから「abc」という文字列が含まれている行は
      % grep abc test.txt
      として抜き出すことが出来る.
    • ヒント3:ファイル内の行数を数えるには
      % wc -l test.txt
      とする.

11.3 変数

  • 変数
  • 変数名
  • 変数の値
  • 変数の値を参照
  • 変数に値を代入

11.3.2 シェル変数

  • set
    set test=123
    echo $test
    unset test

11.3.3 環境変数

  • setenv
    setenv test 123
    echo $test
    unsetenv test

11.3.4 シェル変数と環境変数の違い

  • シェル変数はシェル毎に異なるが,環境変数は引き継がれる.
  • シェル変数では変数の値にリストが許される
    echo $path[1]

11.4 メタキャラクタとエスケープ

  • cshが解釈する文字=cshのメタキャラクタ
    >
  • メタキャラクタの機能をオフにする=エスケープ
    ?, '', ""

11.5 ファイル名置換

  • main.c と subroutine.c という二つのファイルで動くプログラムを簡単にコンパイルするには?
  • * と ?
  • [str]

11.5.4 ファイル名補完

  • 補完できる部分を補完: Esc, Tab
  • 補完候補を表示: C^d

11.6 実行制御

  • フォアグラウンドジョブ
  • バックグラウンドジョブ: コマンド実行時に,コマンドライン最後尾に「&」を付ける
  • 順次実行
    $command1 ; $command2 ; $command3
  • コマンド1が正常終了ならコマンド2を実行
    $command1 && $command2
  • コマンド1が異常終了ならコマンド2を実行
    $command1 || $command2

11.7 ヒストリ機能

  • history
  • C^p, C^n もしくはカーソルキーの上下
  • !

シェルプログラミング

  • sh(SuperText 上巻 第40章 p.800)
  • cshプログラミング入門(SuperText 上巻 第39章 p.776)

シェルスクリプト

  • スクリプト:いくつかの処理手順をまとめて記述したプログラム
  • シェルスクリプト:シェル上で動作するスクリプトです.すなわち,一連のコマンドをファイル化し,一括実行できるようにしたものと考えられます.
  • tcsh:入力用として便利.ブログラミング言語として,一部欠陥がある.>   入力用に推奨
  • sh (bash):UNIX標準装備の古いシェルだが,プログラミング言語として十分 > シェルスクリプトに推奨

書式

  • 1行目に
    #!(シェルのパス)
    を記述することにより,シェルコマンドとして認識される.

csh系

#!/bin/csh -f
Command
Command

sh系

#!/bin/sh
Command
Command

hello.sh

#!/bin/sh
echo 'Hello world!'

test.sh

#!/bin/sh
ls
cal

実行法

sh hello.sh 

実行権をあたえると,直接ファイルをコマンドとして起動できる

chmod a+x hello.sh
./hello.sh

制御構造(sh系)

if コマンド1
then
   # コマンド1が正常終了した時に実行するコード
else
   # コマンド1がエラー終了した時に実行するコード
fi
while コマンド2
do
   # コマンド2が正常終了している間,実行するコード
done
for シェル変数名 in 値1 値2 値3…
do
   # 値1,値2,値3に関して実行するコード
done
case 文字列 in
パターン1)
   # 文字列がパターン1に合致するときに
   # 実行されるコード
   ;;
パターン2|パターン3)
   # 文字列がパターン2、あるいは3に
   # 合致するときに実行されるコード
   ;;
esac
# パターンとしてはワイルドカードの特殊文字が使える

変数

$n	nは数字であり、$0はシェルスクリプト名、以降$1、$2・・・は第1引数、第2引数・・・である。第10引数以降は${10}、${11}・・・で参照する。
$#	与えられた引数の個数
$@	$0以外の全ての引数("$@"のようにダブルクォーテーションで囲んだ場合"$1" "$2" ・・・"のように個別に展開される。)
$*	$0以外の全ての引数("$@"のようにダブルクォーテーションで囲んだ場合"$1 $2 ・・・"のように展開される。)
$?	最後に実行したコマンドの終了ステータス
$!	最後に実行したバックグラウンドコマンドのPID
$$	シェルのPID
$-	現在のオプションフラグ

例:test2.sh

#!/bin/sh
echo $#
echo $0 $1 $2 $3
echo $@
echo $*
echo $?
echo $!
echo $$
echo $-

シェルスクリプトとリダイレクション

ex1.sh

#!/bin/sh
for i in 1 2 3 4 5
do 
    echo "hello!"
    echo $i
done
$ sh ex1.sh

ex2.sh

#!/bin/sh
for i in {1..10}
do 
    echo "hello!"
    echo $i
done
$ sh ex2.sh

ex3.sh

#!/bin/sh
for i in {1..10}
do 
    pwd
    hoge
    echo $i
done
$ sh ex3.sh

標準出力をex.logに,

$ sh ex3.sh > ex.log

csh系

標準出力をex.logに,エラー出力をerr.logに

$ (sh ex3.sh > ex.log) >& err.log

全出力をex.logに

$ sh ex3.sh  >& ex.log

sh系

標準出力をex.logに,エラー出力をerr.logに

$ sh ex3.sh > ex.log 2> err.log

全出力をex.logに

$ sh ex3.sh > ex.log 2>&1

ヒアドキュメント

スクリプト中に,標準出力へ渡すデータを直接埋め込む
ex4.sh

#!/bin/sh
echo "あいうえお"
echo "かきくけこ"
echo "さしすせそ"
echo "たちつてと"

ex5.sh

#!/bin/sh
cat <<EOF
あいうえお
かきくけこ
さしすせそ
たちつてと
EOF

サンプルシェルスクリプト

  • menu.sh
    #!/bin/sh
    while true
    do
            echo "---------------"
            echo "メニュー"
            echo " 1. 日付"
            echo " 2. カレンダー"
            echo " 0. 終了"
            echo -n " command? > "
            read  request
            case $request in
                1)
                    date
                    ;;
                2)
                    cal
                    ;;
                0)
                    echo menu fished.
                    exit
                    ;;
                *)
                    echo "Wrong number!"
                    ;;
            esac
    done
    

csh系

  • menu.ch
    #!/bin/csh -f
    
    while(1)
    	echo "---------------"
    	echo "メニュー"
    	echo " 1. 日付"
    	echo " 2. カレンダー"
    	echo " 0. 終了"
    	echo -n " command? > "
    	set request=$<
    	switch( $request )
    	    case 1:
    		date
    		breaksw
    	    case 2:
    		cal
    		breaksw
    	    case 0:
    	    	echo menu fished.
    		exit
    	    default:
    		echo "Wrong number!"
    		breaksw
    	endsw
    end
    
  • mkhtml.ch
    #!/bin/csh -f
    # カレントディレクトリ上にあるPNGファイルの一覧をHTMLファイルに書き出す
    set htmlfile=test.html
    
    echo "<html>" > $htmlfile
    echo "<head>" >> $htmlfile
    echo "<title>PNG file list on $cwd</title>" >> $htmlfile
    echo "</head>" >> $htmlfile
    echo "<body>" >> $htmlfile
    
    foreach num (*.png)
    	echo -n "<img src=$num>" >> $htmlfile
    	echo "<caption>$num</caption>" >> $htmlfile
    	echo "<hr>" >> $htmlfile
    end
    
    echo "</body>" >> $htmlfile
    echo "</html>" >> $htmlfile
    


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-05-12 (木) 17:02:30 (1222d)