Linuxの変数

# 変数
bashの処理をする時にデータを格納するものです。
細かいルールはこちらの記事を覗いてみてください

https://eng-entrance.com/linux-shellscript-variable

```
% cat variable.sh
name="Keisuke Honda"

#以下の3通りのやり方がある
1. echo $name

2. echo ${name}

#ベストな書き方
3.echo "${name}"

% cat variable.sh
name="Keisuke Honda"

#文字との組み合わせで使いやすい
echo "${name}　is a famous Japanese soccer player."
```

```
% chmod 755 variable.sh　　　#権限実行
% ./variable.sh
Keisuke Honda　is a famous Japanese soccer player.
```

# 変数と定数
値が変わらない変数のことです。```大文字```で記述するのが規約であるみたいです。
```readonly○○```として、変数を定数として設定します。

まず変数を使って実行します。
```
% cat variable.sh
name="Messi"　　　　
age=35

introduce="He said\"I am ${name}. I am ${age}years old\""　　　　#　　""で囲む時は\をつけます。
echo "${introduce}"

 % ./variable.sh   #実行
He said"I am Messi. I am 35years old"
```

次に定数を実行します。

```
# 定数は　大文字+_

readonly CONSTANT_VAR="定数"

echo "${CONSTANT_VAR}"

var="constant ${CONSTANT_VAR}"

#定数を書き換えるとエラー
CONSTANT_VAR="new constant"

unset score
echo "score is ${score}"
unset CONSTANT_VAR
```

# 配列
複数の値を変数の中に格納するタンスのような役割をするものです。

```
% cat array.sh
animal=("Dog""Cat""Monkey")
```

### 全要素

```
echo "${animal[@]}"

echo "${animal}"

# DogCatMonkey
# Dog
# 犬: Dog, 猫: Cat, 猿: Monkey
```

### 各要素追加
```
animal+=("horse" "snake")
echo "${animal[@]}"
# Dog Cat Monkey horse snake

animal=("${animal[@]}" "elephant" )
echo "${animal[@]}"
#Dog Cat Monkey horse snake elephant
```
### 各要素の削除

```
animal=("${animal[@]}" "elephant" )
echo "${animal[@]}"
unset animal[1]

animal[0]="swan"
echo "${animal[@]}"
# swan Monkey horse snake elephant
```

### 配列をつなげる

```
declare -a array1=("A" "B" "C")
array2=("D" "E" "F")

array3=("${array1[@]}" "${array2[@]}")
echo "${array3[@]}"

# 配列の一部
echo "${array3[@]:2:2}"

# 要素の一部
echo "${animal[2]:2:4}"

# A B C D E F
# C D
# nkey
```

# 計算

### 和

```
% cat calculation.sh
echo "1 + 3" #文字列

# 和
echo "$(expr 5 + 8)"
echo "$(( 5 + 8 )) "　　#推奨

result="$(( 7 * 3 ))"
echo "${result}"
% chmod 755 calculation.sh #権限付与
% ./calculation.sh        
1 + 3
13
13 
21
```

### 差

```
% cat calculation.sh
# 差
echo "$(expr 5 - 8)"
echo "$(( 3 - 5))"
% chmod 755 calculation.sh #権限付与
% ./calculation.sh  
-3
-2
```

### 積

```
% cat calculation.sh
# 積
echo "$(expr 5 \* 8)"
echo "$(( 5 * 8 ))"
% chmod 755 calculation.sh #権限付与
% ./calculation.sh  
40
40
```

### 商

```
% cat calculation.sh
# 商
echo "$(expr 30 / 6)"
echo "$(( 13 / 3))"
% chmod 755 calculation.sh #権限付与
% ./calculation.sh 
5
4
```

### 余り

```
% cat calculation.sh
#余り
echo "$(expr 23 % 7)"
echo "$(( 23 % 7 ))"
% chmod 755 calculation.sh #権限付与
% ./calculation.sh
2
2
```

# 特殊な環境変数
以下のような変わった環境変数があります。

```
$ cat special.sh

#ファイル名
echo "${0}"

# ユーザー名
echo "${USER}"

#実行時間
echo "${SECOND}"

#ランダム
echo "${RANDOM}"

#行番号
echo "${LINENO}"
```
権限を実行して出力していきます。
```
$ chmod 755 special.sh #権限付与
$ ./special.sh
./special.sh  #ファイル名
noriaki　# ユーザー名
26485　#実行時間
16　#行番号
```
それぞれ出力していきます。
```
$ echo $LINENO
62
$ echo $RANDOM
29508
$ echo $USER
noriaki
```
＄RANDOMだとこんな使い方もあります。

```
$ echo $(( $RANDOM % 2 ))
1
$(( $RANDOM % 5 ))
3
$ echo $(( $RANDOM % 5 ))
0
$ echo $(( $RANDOM % 3 + 1 ))
1
$(( $RANDOM % 3 + 2 ))
4
```

# 環境変数の作成
環境変数を作成するには　
```
export 変数名
```
を使い、***シェル変数から環境変数***にできます。
まずシェル変数から出力します。
```
$ name="Luffy" #シェル変数
$ echo $name
Luffy
```

```
$ cat script.sh
#変数
echo "名前は:"
echo $name

echo "悪魔の実は："
echo $fruits
$ chmod 755  script.sh #権限付与
$ name=Luffy
$ fruits=ゴムゴムの実
$ ./script.sh　　#子プロセスで立ち上がっている
名前は:

悪魔の実は：
```
子プロセスを引き継ぐにはシェル変数を環境変数にします。
```
$ export name
$ export fruits
$ ./script.sh
名前は:
Luffy
悪魔の実は：
ゴムゴムの実
```
ファイルの引継ぎ方を見ていきます。
```
$ cat setting.sh
name="Luffy"
fruits="ゴムゴムの実"

$ cat script.sh
# nameとfruitsを設定
. ./setting.sh

#変数
echo "名前は:"
echo $name

echo "悪魔の実は："
echo $fruits

$ ./script.sh
名前は:
Luffy
悪魔の実は：
ゴムゴムの実
```
次に2つのファイルでの引継ぎをします。
```
$ cat script.sh
# nameとfruitsを設定
. ./setting.sh

#変数
echo "名前は:"
echo $name

echo "悪魔の実は："
echo $fruits

#環境変数
echo "好きな食べ物は:"
export favorite_food="肉"

#別の処理の呼び出し
./script2.sh

$ chmod 755 script2.sh　
$ ./script2.sh

$ ./script.sh
名前は:
Luffy
悪魔の実は：
ゴムゴムの実
好きな食べ物は:
肉
```

### unsetコマンド
これは***シェル変数を削除するコマンド***です。
```
$ name="Luffy" #シェル変数
$ echo $name
Luffy
$ unset name #シェル変数削除
$ echo $name

```



# setコマンド
***環境変数やシェル変数などの一覧を表示***するコマンドです。

```
$ set 
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()

# 省略

quote_readline ()
{
    local quoted;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}
```

# printenvコマンド
***環境変数一覧を表示***するコマンドです。

```
$ printenv
```

# envコマンド
環境変数を一時的に設定した状態で実行し、引数なしでenvコマンドを実行すると
環境変数一覧が表示されるコマンドです。

```
$ env name="chopper" fruits=17 ./script.sh
名前は:
chopper
悪魔の実は：
17
$ echo  $name
```

# 色々な環境変数
色々な環境変数を最後に見ていきます。

●HOME
ホームディレクトリを表示
```
$ echo $HOME
/home/taro
```

●LANG
使用中の言語表示
```
$ echo $LANG
C.UTF-8
$ export LANG="ja_JP.UTF-8" #日本語設定
```

●PWD
カレントディレクトリ表示
```$ echo $PWD
/home/taro/linux
```

●USER
ログインしているユーザー名
```
$ echo $USER
taro
```

●PATH
コマンド実行ファイルを格納するコマンド検索パス
```
$ echo $PATH
/home/taro/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Users/Taro Hashimoto/AppData/Local/Microsoft/WindowsApps:/snap/bin
```

# 資料
https://www.udemy.com/course/30awslinux/

https://www.udemy.com/course/30awslinux/