🌊
shellスクリプト
名前を聞いて表示
#!/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"}
となる。
参考
- http://linuxsig.org/files/bash_scripting.html
- https://superuser.com/questions/247127/what-is-and-in-linux
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[@]}
Discussion