シェルスクリプトメモ

出力結果をlog.txtというテキストファイルに保存

./sysbackup.sh > log.txt

標準エラー出力もリダイレクト 「2>」が標準エラー出力のリダイレクトの指示

./sysbackup.sh > log.txt 2> err.txt

すべての出力をlog.txtに記録

./sysbackup.sh > log.txt 2>&1

長い文字列を出力する

#!/bin/sh
cat << EOS
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
...

■引数と変数

引数は、シェルスクリプトからは順番に$1、$2、$3、……として参照
引数の数は「$#」、
「$*」すべての引数を一度に参照

  • #!/bin/sh
    echo "Hi, $1. I am $0."
    echo "Hi, $*. I am $0."
  • 結果
    $ ./greeting.sh tom
    Hi, tom. I am ./greeting.sh.
    Hi, tom. I am ./greeting.sh.
    $ ./greeting.sh tom joe
    Hi, tom. I am ./greeting.sh.
    Hi, tom joe. I am ./greeting.sh.
    $ sh greeting.sh tom joe
    Hi, tom. I am greeting.sh.
    Hi, tom joe. I am greeting.sh.

シェルスクリプトでは「$」で始まる文字列を変数として扱います。
より正確にいうと、文字列が$で始まっている場合はその文字列に格納されたデータを取り出して置き換えます。

  • test=one
    echo $test
  • 結果
    $ sh var.sh
    one

シェルスクリプトでは基本的に変数を文字列として扱います。

  • test=1
    test=$test+1
    echo $test
  • 結果
    $ sh add.sh
    1+1

変数を数値として扱いたいときは、declareコマンドで指定します。
「-i」で、整数値として処理することを指定する。
変数に何も代入されていない場合は、空の文字列が返ってきます。

  • declare -i test
    test=1
    test=$test+1
    echo $test
  • 結果
    $ bash add2.sh
    2

■変数に対するパターンマッチ

  • ${変数#パターン} 変数の内容について、最初の部分とパターンがマッチしたら、最も短く一致する部分を取り除いた残りの部分を返す。

  • ${変数##パターン} 変数の内容について、最初の部分とパターンがマッチしたら、最も長く一致する部分を取り除いた残りの部分を返す。

  • ${変数%パターン} 変数の内容について、最後の部分とパターンがマッチしたら、最も短く一致する部分を取り除いた残りの部分を返す。

  • ${変数%%パターン} 変数の内容について、最後の部分とパターンがマッチしたら、最も長く一致する部分を取り除いた残りの部分を返す。

  • 例) 変数testpathに/home/USER/Linux/how.to.linuxという値を設定しておくと、

    $ echo ${testpath##/*/}
    how.to.linux
    $ echo ${testpath#/*/}
    USER/Linux/how.to.linux
    $ echo ${testpath%%.*}
    /home/USER/Linux/how
    $ echo ${testpath%.*}
    /home/USER/Linux/how.to
  • 例)ファイル拡張子を置き換える

    #!/bin/sh
    file=scan01.jpg
    echo ${file}
    echo ${file%jpg}
    echo ${file%jpg}png

    外部ファイルにリストされた文字列を使ったスクリプト samp01.sh の 4行目の処理を変えることで、外部リストファイルの文字列を使った処理を自動的に行えます。

  • 例)samp01.sh

    #!/usr/bin/sh
    for fn in `cat list.txt`
    do
      touch $fn
    done
    echo "処理は終了しました。"
    $ cat list.txt
    AAAAA.tmp
    BBBBB.tmp
    CCCCC.tmp
    DDDDD.tmp
    EEEEE.tmp
    FFFFF.tmp
    GGGGG.tmp
  • 結果

    $ chmod u+x samp01.sh
    $ samp01.sh
    処理は終了しました。
    $ ls
    AAAAA.tmp
    BBBBB.tmp
    CCCCC.tmp
    DDDDD.tmp
    EEEEE.tmp
    FFFFF.tmp
    GGGGG.tmp
    list.txt
    samp01.sh

コメント

タイトルとURLをコピーしました