#navi(ソフトウェア演習I/16)

#contents
*Google Classroomの設置 [#j4d4b868]
-https://classroom.google.com/c/MTUxNDMyMjc1NVpa
--クラスコード:xkwgclq
*シェル(csh)入門 [#g48469a8]

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

***11.2.1 リダイレクションとは [#g75b5b6b]
-標準出力をターミナルからファイルに変更
 ps aux > result
-標準入力をターミナルからファイルに変更
 cat < result

*** 11.2.3 パイプ [#m8ed7fa7]
- コマンドの実行結果を標準出力から標準入力に変更
 e.g.) ps aux | wc
 「ps aux」による出力を「wc」への入力に変更
***11.2.5 I/O リダイレクションとパイプの詳細 [#z85d73b4]
 「$command > file」
 「$command >> file」
 「$command >& file」
 「( $command > file1 ) >& file2」
 「$command1 | $command2」
 「$command1 |& $command2」

 $command > file
 $command >> file
 $command >& file
 ( $command > file1 ) >& file2
 $command1 | $command2
 $command1 |& $command2
*演習 [#acefcc9a]
- 「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 変数 [#d0d9423d]
- 変数
- 変数名
- 変数の値
- 変数の値を参照
- 変数に値を代入
***11.3.2 シェル変数 [#v0c88925]
- set
 set test=123
 echo $test
 unset test

***11.3.3 環境変数 [#n8686e6a]
- setenv
 setenv test 123
 echo $test
 unsetenv test

***11.3.4 シェル変数と環境変数の違い [#zaf3550d]
- シェル変数はシェル毎に異なるが,環境変数は引き継がれる.
- シェル変数では変数の値にリストが許される
 echo $path[1]
**11.4 メタキャラクタとエスケープ [#ad83d9e7]
- cshが解釈する文字=cshのメタキャラクタ
 >
- メタキャラクタの機能をオフにする=エスケープ
 ?, '', ""
**11.5 ファイル名置換 [#d7bbdad3]
- main.c と subroutine.c という二つのファイルで動くプログラムを簡単にコンパイルするには?
- * と ?
- [str]

*** 11.5.4 ファイル名補完 [#d68cda42]
- 補完できる部分を補完: Esc, Tab
- 補完候補を表示: C^d

**11.6 実行制御 [#qf492c65]
- フォアグラウンドジョブ
- バックグラウンドジョブ: コマンド実行時に,コマンドライン最後尾に「&」を付ける
- 順次実行
 $command1 ; $command2 ; $command3
- コマンド1が正常終了ならコマンド2を実行
 $command1 && $command2
- コマンド1が異常終了ならコマンド2を実行
 $command1 || $command2
**11.7 ヒストリ機能 [#u122bc64]
- history
- C^p, C^n もしくはカーソルキーの上下
- !


*シェルプログラミング [#c1fd1d81]
-sh(SuperText 上巻 第40章 p.800)
-cshプログラミング入門(SuperText 上巻 第39章 p.776)
**シェルスクリプト [#pa051c4b]
-スクリプト:いくつかの処理手順をまとめて記述したプログラム
-シェルスクリプト:シェル上で動作するスクリプトです.すなわち,一連のコマンドをファイル化し,一括実行できるようにしたものと考えられます.

-tcsh:入力用として便利.ブログラミング言語として,一部欠陥がある.>   入力用に推奨
-sh (bash):UNIX標準装備の古いシェルだが,プログラミング言語として十分 > シェルスクリプトに推奨
**書式 [#a31e477a]
-1行目に
 #!(シェルのパス)
を記述することにより,シェルコマンドとして認識される.

csh系
 #!/bin/csh -f
 Command
 Command

sh系
 #!/bin/sh
 Command
 Command
**例 [#ca6c8ca7]
hello.sh
 #!/bin/sh
 echo 'Hello world!'

test.sh
 #!/bin/sh
 ls
 cal

**実行法 [#r7d07233]
 sh hello.sh 

実行権をあたえると,直接ファイルをコマンドとして起動できる
 chmod a+x hello.sh
 ./hello.sh

*制御構造(sh系) [#mc3288d8]
 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
 # パターンとしてはワイルドカードの特殊文字が使える

*変数 [#o9fcc3c5]
 $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 $-

*シェルスクリプトとリダイレクション [#sc6b0e85]
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系 [#q813d687]
標準出力をex.logに,エラー出力をerr.logに
 $ (sh ex3.sh > ex.log) >& err.log
全出力をex.logに
 $ sh ex3.sh  >& ex.log
***sh系 [#h910a221]
標準出力をex.logに,エラー出力をerr.logに
 $ sh ex3.sh > ex.log 2> err.log
全出力をex.logに
 $ sh ex3.sh > ex.log 2>&1
*ヒアドキュメント [#md93d2b8]
スクリプト中に,標準出力へ渡すデータを直接埋め込む~
ex4.sh
 #!/bin/sh
 echo "あいうえお"
 echo "かきくけこ"
 echo "さしすせそ"
 echo "たちつてと"

ex5.sh
 #!/bin/sh
 cat <<EOF
 あいうえお
 かきくけこ
 さしすせそ
 たちつてと
 EOF
**サンプルシェルスクリプト [#tba3c0e9]
-menu.sh
#pre(){{
#!/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
#pre(){{
#!/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
#pre(){{
#!/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
}}


#navi(ソフトウェア演習I/16)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS