@zigen 's note

shellscript

最終更新:

mynote

- view
だれでも歓迎! 編集
16.8 特殊 (制御) 文字

あなたがキーボードでタイプする多くの制御文字は端末ドライバで ``捉えられ'' て、様々なタスクを実行します。このような制御コマンドを見るには、 stty -a とタイプして、2行目 から 4 行目を見てください。これらは stty の man ページで簡潔に説明されています。stty コマンドを使用して、異った制御キャラクタに変えられたり、無効にしたりします。しかし、あなたの端末での制御キャラクタは以下に記述されているものとは異なっているかもしれません。それらはコマンドライン編集や、割り込み、次のキャラクタを透過的に通過させたりするのに使います。

コマンドラインでの編集

端末ドライバにはコマンドライン編集用の 2、3 のコマンドがありますが、シェルにも組込みの本当のエディタ (``readline'' のような) があります。そのようなエディタは通常はデフォルトで利用できるので、有効にするために何かをする必要はありません。もし利用可能なら、以下のコマンドの多くを覚える必要はありませんが、コマンドラインエディタはまだよく使われています。一番覚えておかなければいけないのは、^C (割込み), ^D それとスクロールを止める方法です。

   * Delete キー (stty では ^?) は最後の文字を消去します。
   * ^U は行を削除します。
   * ^W は後方に単語を削除します。
   * ^R は行を再表示します。主にハードコピー端末に便利 ??

割り込み (& Quit, Suspend, EOF, Flush)

   * ^C 割込み:プログラムを終了させて、コマンドラインプロンプトをユーザに返す。
   * ^/ クイット:割込み ^C と同じだが、少し弱い。``core'' ファイル (あまり使わない) をワークディレクトリにダンプします。
   * ^Z サスペンド : プログラムを停止して、バックグランドに置いておきます。 fg とタイプすると再開します。
   * ^D ファイルの最後 : コマンドラインプロンプトでタイプすると、シェルを抜けて、シェルを開始する前のところに行きます。
   * ^O フラッシュ : Linux では実装されていません。/dev/null へ出力を送ります。

スクロールの開始 / 停止

見たいものがスクリーンの下へスクロールして消えてしまいそうになったら、 (Xon-Xoff フロー制御が有効になっている) ホストへ ``停止'' 信号 (^S か Xoff) を送って、これを防ぐことができます。再開するには ``開始'' 信号 (^Q か Xon) を送ってください。いくつかの端末では、Xoff と Xon を交互に送るか、あるいはハードウェアフロー制御信号を送ることができる (??) ``非スクロール'' キーがあります。以下は ctrl-S (^S) と ctrl-Q (^Q) が何をするかです。

   * ^S はスクロールを停止します (Xoff)。
   * ^Q はスクロールを再開します (Xon)。

もしスクロールの停止とクイットの両方をしたければ、^C を使いなさい。他に何かするためにスクロールを止めたいが、プログラムの出力をメモリに保存しておいて、後でスクロールを再開したいなら、^Z でサスペンドしておきなさい。

スクロールの代替手段としては、more 、less や most などのページャにパイプを使って出力を送る方法があります。しかし、出力は標準出力でないかもしれませんが、ページャが認識しないエラー出力かもしれません。これを解決するには、ページャが良好に働くように、リダイレクション ``2>&1'' を使う必要があるかもしれません。後方にスクロールする必要がなければ、単に ^S と ^Q を使います。

PC コンソール (端末をエミュレートする) では、Shift-PageUp キーを使って後方にスクロールします。^S を使って止められないほど早くスクロールする場合に、頻繁に必要になるでしょう。一度後方へスクロールしたら、再び前方にスクロールするには、Shift-PageDown を使います。

次のキャラクタを文字通りとりなさい

^V は,デバイスドライバ経由で直接タイプされた次のキャラクタ (普通は制御キャラクタ) を、なんのアクションや割込みもなく送ります。エコーバックすると ^C のように 2 つの ASCII キャラクタになります。

shell scriptでよく怒られる事集

[cfd@utmcc010 gifimgwl]$ cat geometry.sh 
#!/bin/sh

num=0
cnum=0
while $num -le 800;do
do
 if $num -le 9;then
  cunm = "00$num"
 elif $num -le 99;then
  cnum = "0$num"
 else
  cnum = "$num"
 fi

convert -geometry 70% acip_wl"$cnum".gif scip_wl"$cnum".gif
convert -geometry 70% law_wl"$cnum".gif slaw_wl"$cnum".gif
convert -geometry 70% upw_wl"$cnum".gif supw_wl"$cnum".gif 

num= $((num + 1))
done
[cfd@utmcc010 gifimgwl]$ ./geometry.sh 
./geometry.sh: line 6: syntax error near unexpected token `do'
./geometry.sh: line 6: `do'

これはwhile の後の;とdoの後にスペースが入ってないから怒られた。



[cfd@utmcc010 gifimgwl]$ cat geometry.sh
#!/bin/sh

num=0
cnum=0
while [$num -le 800]; do
if $num -le 9;then
 cunm = "00$num"
elif $num -le 99;then
 cnum = "0$num"
else
 cnum = "$num"
fi

convert -geometry 70% acip_wl"$cnum".gif scip_wl"$cnum".gif
convert -geometry 70% law_wl"$cnum".gif slaw_wl"$cnum".gif
convert -geometry 70% upw_wl"$cnum".gif supw_wl"$cnum".gif

num= $*1
done
[cfd@utmcc010 gifimgwl]$ ./geometry.sh
./geometry.sh: line 5: [0: command not found

これはwhile [$unm~の[と$の間にスペースが無いから怒られた



[cfd@utmcc010 gifimgwl]$ cat geometry.sh
#!/bin/sh

num=0
cnum=0
while [ $num -le 800]; do
if $num -le 9; then
 cunm = "00$num"
elif $num -le 99;then
 cnum = "0$num"
else
 cnum = "$num"
fi

convert -geometry 70% acip_wl"$cnum".gif scip_wl"$cnum".gif
convert -geometry 70% law_wl"$cnum".gif slaw_wl"$cnum".gif
convert -geometry 70% upw_wl"$cnum".gif supw_wl"$cnum".gif

num= $*2
done
[cfd@utmcc010 gifimgwl]$ ./geometry.sh
./geometry.sh: line 5: [: missing `]'

これはwhile後の800と]の後にスペースが無いから


一番重要なこと!MacやWinを使っていてLinuxでscriptを実行させるときには!

改行コードと行末コードに気よ付けろ!

vimでesc押してコマンドモード
:set fileencoding=shift_jis (エンコーディングshift_jisに変更。)
:set fileformat=unix (改行をUnixの形式に変更。)
で変えられます

#! /bin/sh
# csv2html.sh
# read -rが使えるかかおかを調べる
if echo | read -r 2>/dev/null; then
   READ_R="-r"
else
   READ_R=""
fi
#引数の数が不正の場合、説明を表示
#if文中にある-neはnot equaleの略
if[ $# -ne 1]; then
  echo "usage: csv.sh csvfile"
  exit 1
fi
#変数LFに改行文字を代入
LF=''
echo 'set povray file'
#IFS=改行文字ならば[真]としてwhile文を回し、readコマンドを実行
#read $READ_R record -> read -r recordのことread -rで各文字づつ呼び込む
#recordは変数s
while IFS="$LF" read $READ_R record; do
     z=0
     for col do     #$1,$2,について繰り返す 
         z=$((z+1))
         IFS=''
         set -- $record #csvfaileの[,]で分解 --はsetのオプション-v等の解釈を行わないとするもの
         echo "sphere{<$col $z>}"
     done
done < "$1" >"povrayfile"
#ls > "list"はlistというファイルを作りそこに書き出すという意味
#write < 




shellscriptでテキストファイルを1行づつ呼びこむ方法

while read line
do
 echo "$line"
done <test.txt

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

目安箱バナー
注釈

*1 num + 1

*2 num + 1