シェルスクリプトの基礎#1

シェルスクリプトの基礎#1です。


#クオーティング

シェルの中身が以下の内容である時
' '(シングルコーテーション)
" "(ダブルコーテーション)で変数の展開の仕方が異なる。

```sh:work10.sh
#!/bin/bash

echo 'Hello'
name='Tadashi'
echo 'My name is $name'
echo "My name is $name"
```
シェルを実行した結果、
' '(シングルコーテーション)の場合は変数展開が無効、
" "(ダブルコーテーション)の場合は変数展開され、変数nameの中身が
展開されている。

```sh
[wataru@localhost work]$ ./work10.sh
Hello
My name is $name
My name is Tadashi
```

#コマンド置換

コマンドの結果をシェルスクリプト中で利用したい時があります。
コマンド置換をを利用すれば、コマンドの結果を文字列として取得することが出来る。
$( )の形式でカッコ内に実行したいコマンドを記述する。


例として、dateコマンドで日付を出力し、変数filenameに格納。
その結果をtouchコマンドの引数として、利用することで、
現在日付のファイル名を作成できる。

```sh
[wataru@localhost work]$ cat work10.sh 
#!/bin/bash

echo 'Hello'
filename=$(date '+%Y-%m-%d')
touch "$filename"

[wataru@localhost work]$ ls -l
total 48
-rw-rw-r--. 1 wataru wataru     0 Aug 22 23:06 2020-08-22
```

####シェルに引数を与えて、それをシェル内で使用する

```sh
[wataru@localhost work]$ cat -n work10.sh 
     1	#!/bin/bash
     2	
     3	echo "My name is $1"
     4	echo "came from $2"

#引数として、Tanaka とJapanを与えている
[wataru@localhost work]$ ./work10.sh Tanaka Japan
My name is Tanaka
came from Japan
```

#if
条件分岐

###構文
if <コマンド1>; then
     <コマンド1>が真の場合
elif <コマンド2>; then
　 <コマンド2>が真の場合
else 上記のコマンドがすべて偽の場合
fi

```sh
[wataru@localhost work]$ cat work11.sh 
#!/bin/bash

if [ "$1" = "hello" ]; then
	echo "OK"
else
	echo "NO"
fi

[wataru@localhost work]$ ./work11.sh hello
OK
[wataru@localhost work]$ ./work11.sh hel
NO
```

```sh
[wataru@localhost work]$ cat work11.sh 
#!/bin/bash

if [ "$1" = "$2" ]; then
	echo "true"
#-n str1 :str1が空文字でない
elif [ -n "$2" ]; then
	echo "notBlank"
#-z str1 :str1が空文字である
elif [ -z "$2" ]; then
	echo "blank"
fi

[wataru@localhost work]$ ./work11.sh 20 20
true
[wataru@localhost work]$ ./work11.sh 20 
blank
[wataru@localhost work]$ ./work11.sh 20 500
notBlank
```

```sh
[wataru@localhost work]$ cat work11.sh 
#!/bin/bash

num1=$1
num2=$2

#int1 -eq int2: int1とint2が等しい
if [ "$num1" -eq "$num2" ]; then
	echo "match"
#int1 -lt int2: int1がint2よりも小さい 
elif [ "$num1" -lt "$num2" ]; then
	echo large="$num2"
#int1 -eq int2: int1がint2よりも大きい
elif [ "$num1" -gt "$num2" ]; then
	echo large="$num1"
fi


[wataru@localhost work]$ ./work11.sh 100 100
match
[wataru@localhost work]$ ./work11.sh 100 200
large=200
[wataru@localhost work]$ ./work11.sh 500 499
large=500

#これらの演算子は整数しか扱えない
[wataru@localhost work]$ ./work11.sh 2.2 2.2
./work11.sh: line 6: [: 2.2: integer expression expected
./work11.sh: line 8: [: 2.2: integer expression expected
./work11.sh: line 10: [: 2.2: integer expression expected
```

```sh
[wataru@localhost work]$ cat work99.sh 
#!/bin/bash

dir=$1

#-d file: fileが存在し、ディレクトリである
if [ -d "$dir" ]; then
	echo "dir Existence"
#-f file: fileが存在し、通常のファイルである
elif [ -f "$dir" ]; then
	echo "file Existence"
fi

[wataru@localhost work]$ ./work99.sh /home/wataru/tmp/work/work.02.txt 
file Existence
[wataru@localhost work]$ ./work99.sh /home/wataru/tmp/work
dir Existence
```

#for
繰り返し処理

```sh
[wataru@localhost work]$ cat fortest.sh 
#!/bin/bash

#
for number in $(seq 1 5) 
do
	touch "for${number}.txt"
done

[wataru@localhost work]$ ./fortest.sh 
[wataru@localhost work]$ ls -l for*
#for1~5.txtが作成されていることを確認。
-rw-rw-r--. 1 wataru wataru  0 Sep 11 05:53 for1.txt
-rw-rw-r--. 1 wataru wataru  0 Sep 11 05:53 for2.txt
-rw-rw-r--. 1 wataru wataru  0 Sep 11 05:53 for3.txt
-rw-rw-r--. 1 wataru wataru  0 Sep 11 05:53 for4.txt
-rw-rw-r--. 1 wataru wataru  0 Sep 11 05:53 for5.txt
-rwxrwxrwx. 1 wataru wataru 73 Sep 11 05:51 fortest.sh
```

```sh
[wataru@localhost work]$ cat 20200911.sh 
#!/bin/bash

# $@を指定して、すべてのコマンドライン引数を表示
for file in "$@"
do
	echo $file
done

[wataru@localhost work]$ ./20200911.sh abc efg file2020.txt
abc
efg
file2020.txt
```

#case
指定された文字列がパターンにマッチするかどうか判断し、
マッチしたパターンに対応する処理を実行する。

```sh
[wataru@localhost work]$ cat work.09.sh
#!/bin/bash

#引数がtxtファイルなら、catコマンドを実行する。
#引数がshファイルなら、viコマンドを実行する。
#それ以外なら、メッセージ出力する。
case "$1" in
	*.txt)
	cat "$1"
	;;
        *.sh)
	vi "$"
	;;
        *)
       echo Not txt,sh 
       ;;
esac

[wataru@localhost work]$ ./work.09.sh work.02.txt
2020/07/17
test?cat
123445
TEST?CAT
test
testcat
tfst
test01
test02
test03
test04

[wataru@localhost work]$ ./work.09.sh work
Not txt,sh
```

#while
指定した条件が真である限り、繰り返し処理を実行する。

```sh
[wataru@localhost work]$ cat while_test.sh
#!/bin/bash

#シェル変数が10以下である限り、iの値を表示して2を足す処理をする
i=1
while [ "$i" -le 10 ]
do
	echo "$i"
	i=$((i+2))
done

[wataru@localhost work]$ ./while_test.sh
1
3
5
7
9
```