shellスクリプト 

3 min read読了の目安(約2900字

名前を聞いて表示

#!/bin/bash
echo "What is your first name?"
read first
echo "What is your family name?"
read family
echo "Hello, my name is $first $family"

変数

ファイル内で未定義のshell 変数を実行時に渡す

echo $VAR

というファイルがあったとき、1.shを素直に実行すると変数VARが未定義なので、出力がない。ターミナル等でVARを定義して、1.shに渡すやり方。

VAR=hoge
. ./1.sh

で渡すことができる。この.は、sourceとかdot operatorと呼ばれる。

参考: https://unix.stackexchange.com/questions/114300/whats-the-meaning-of-a-dot-before-a-command-in-shell

書き換えられないようにするreadonly command

NAME="hoge"
readonly NAME
NAME="fuga"
// zsh: read-only variable: NAME

そのプロセスでのreadonly変数を表示するのは以下のコマンド

readonly -p

When -p is specified, readonly writes to the standard output the names and values of all read-only variables, in the following...

参考: https://man7.org/linux/man-pages/man1/readonly.1p.html

## 変数を削除する

➜  shell name="hoge"
➜  shell echo $name
hoge
➜  shell unset name
➜  shell echo $name

➜  shell 

コマンドライン引数

#!/bin/bash
echo "filename: $0"
echo "first parameter :$1"
echo "second parameter :$2"
echo "quoted values: $@"
echo "quoted values: $*"
echo "total number of parameters :$#"

$0はコマンド自身を指す。$1以降は引数を指す。
$#は引数の数。
$*は$1, $2をそのまま表示
$@は全ての引数を文字列として配列にする。

> ./3.sh hello world
file name: ./3.sh
first parameter :hello
second parameter :world
quoted values: hello world
quoted values: hello world
total number of parameters :2

ここでは

  • $* = hello world
  • $@ = array: {"hello", "world"}

となる。

参考

Command substitution

#!/bin/bash

DATE=`date`
echo "date is $DATE"
// date is 2020年 12月22日 火曜日 22時03分16秒 CET
#!/bin/bash

for f in $(ls)
do
  echo "$f"
done
~       

参考

expr

このコマンドは、式を評価して、評価後の値を返す。

expr 1 + 2
// 3

これを仮に、

expr 1+2

と書くと、1+2と返ってくる。operatorとoperandsの間にはスペースが必要。

四則演算

expr 1 + 2 # 3
expr 3 - 2 # 1
expr 3 \* 2 # 6
expr 3 / 2  # 1 

static array

例1

arr=(hoge fuga)
echo ${arr[@]} #hoge fuga
echo ${arr[*]} #hoge fuga
echo ${arr[@]:0} #hoge fuga
echo ${arr[*]:0} #hoge fuga

例2

for i in "${arr[@]}"; do echo "$i"; done 

出力

hoge
fuga

例3

arr=(1 10 20 30)
i=0

while  [ $i -lt ${#arr[@]} ]
do
  echo ${arr[$i]}

  i=`expr $i + 1` # i=$((i+1)) でもいい。
done

出力

1
10
20
30

ここで

i=$((i+1))

でも良いと書いたが、これはarithmetic expansionという。

参考

参考

最終課題

入力数と各値を受けつけ、その合計値を出すスクリプト

#!/bin/bash
  
echo -n "Enter numbers:"
read n

i=0

sum=0
while [ $i -lt $n ]
do
  read a[$i]
  sum=$((sum+a[$i]))
  i=$((i+1))
done

echo "the sum is $sum"
echo ${a[@]}