Help us understand the problem. What is going on with this article?

シェルスクリプトでよく忘れること

私は時々シェルスクリプトを書くのですが、よく構文などを忘れて何度も調べることになるので、ここにまとめておきます。

1. 基本文法編

1.1 条件式について

シェルスクリプトでは文字列型と数値型の区別が存在しない(全て文字列型である)ために条件式は
・文字列型として扱う条件式
・数値型として扱う条件式
があり、例えば "1"と1はどちらの条件式に入力しても同じ振る舞いをします。

#文字列型の条件式
[ -z 変数 ] #変数の長さが0の時(何も入力されていない時) 
[ -n 変数 ] #変数の長さが0出ない時
[ 変数1 = 変数2 ] #変数1と変数2の文字列が等しい時(str1 == str2)
[ 変数1 != 変数2 ] #変数1と変数2の文字列が等しくない時(str1 != str2)

#数値型の条件式
[ 変数1 -eq 変数2 ] #(int1 == int2)
[ 変数1 -ne 変数2 ] #(int1 != int2)
[ 変数1 -lt 変数2 ] #(int1 < int2) int1 "Littler Than" int2
[ 変数1 -le 変数2 ] #(int1 <= int2) int1 "Littler than or Equal" int2
[ 変数1 -gt 変数2 ] #(int1 > int2) int1 "Grater Than" int2
[ 変数1 -ge 変数2 ] #(int1 >= int2) int1 "Grater than or Equal" int2

1.2 if文

if ["条件式"];then
  処理1
elif ["条件式"];then
  処理2
else
  処理3
fi

1.3 while文

while ["条件式"]
do
処理
done

1.4 for文

for "仮変数" in "配列"
do
処理
done

1.5 数値計算

シェルでは基本文字列型なので数値計算をする際は別に数値として計算するための処置が必要です

1.5.1 リテラルの計算

パターン1:$(())を使う場合

$ echo $((1+1))
=> 2
$ echo $((1 + 1))
=> 2
$ echo $(( 1 + 1 ))
=> 2

$(())を使う場合は空白をどのようにおいても計算できます。

#######################################

パターン2:exprを使う場合

$ echo `expr 1 + 1`
=> 2
$ echo `expr 1+1`
=> 1+1

exprを使う場合は数値と記号の間に空白を入れる必要があります

1.5.2 変数の計算

$ var=1

パターン1:$(())を使う場合

$ echo $((${var}+1))
=> 2
$ echo $((var+1))
=> 2
カッコ内で変数を評価するようなので変数に$がなくても計算されるようです

############################################

パターン2:exprを使う場合
$ echo `expr $var + 1`
=> 2
$ echo `expr var + 1`
=> expr: not a decimal number: 'fuga'
変数に$がないとエラーが発生します

############################################

パターン3:letを使う場合

$ let $var=$var+1 && echo $var
=> 2
$ let var=var+1 && echo $var
=> 2

letは変数への入力を行うので、計算結果は出力はされないことに注意しておく必要があります

############################################

パターン4:declareを使う場合
$ declare -i x
$ x=1+1
$ echo $x
=> 2
$ x=1 + 1
=> bash: +: command not found
$ x="1 + 1"
$ echo $x
=> 2

declare -i は整数として定義するコマンドで、定義した変数に対する代入処理に対して計算処理を行うようです
aoki_aiota
Python Rubyが使える情報系の学生です。今は強化学習と画像認識について勉強中です。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした