Code ShellScript

【まとめ】Shell scriptの特殊変数 演算子

2023年6月17日

特殊変数

Shell scriptでは、特殊変数は$から始まる文字列で表されます。
一覧を以下の表にまとめます。

文字 内容
コマンドライン引数 $# 引数の数
$0 実行中のシェルまたは実行中のファイル名
$1,$2...,$9 引数の値
1〜9個目の引数まで取得可能
$@ 全ての引数の値
$*
$_ 直前に実行したコマンドの最後の引数の値
ステータス $? 直前に実行したコマンドの終了ステータス
プロセス $$ 実行中プロセスのPID
$! 直前に実行したプロセスのPID
オプション $- 実行中シェルのオプション

$#

$#はスクリプトに渡された引数の個数になります。

#!/bin/bash

echo $#
./test.sh arg1 arg2 arg3 # 3
./test.sh arg1 arg2 arg3 arg4 arg5 # 5

$0

$0はスクリプト実行時にはスクリプト名になります。

#!/bin/bash

echo $0
./test.sh # test.sh

シェル実行時には実行中のシェル名になります。

# bashを使っている場合

echo $0 # -bash

$1〜$9

$1〜$9は引数の値になります。
10個目以降の引数値を取得することはできません。

#!/bin/bash

echo $1
echo $2
echo $3
./test.sh arg1 arg2 arg3

# arg1
# arg2
# arg3

$@と$*

$@$*はともに全ての引数になります。

#!/bin/bash

echo $@
echo $*
./test.sh arg1 arg2 arg3

# arg1 arg2 arg3
# arg1 arg2 arg3

$@と$*の違いは全ての引数を結合するかどうかです。

#!/bin/bash

for i in "$@"
do
  echo $i
done

for i in "$*"
do
  echo $i
done
./test.sh

# arg1
# arg2
# arg1 arg2

$_

$_は直前に実行したコマンドの最後の引数になります。

#!/bin/bash

echo $1 $2 $3
./test.sh hoge1 hoge2 hoge3

# hoge1 hoge2 hoge3

echo $_

# hoge3

$?

$?は直前のコマンドの終了ステータスです。
成功は0、失敗はそれ以外です。

#!/bin/bash

rmdir testdir1 # コマンド成功:空のディレクトリ
echo $?

rmdir testdir2 # コマンド失敗:空でないディレクトリ
echo $?
./test.sh

# rmdir: testdir: Directory not empty
# 1
# 0

$$

$$は実行中プロセスのPIDになります。

#!/bin/bash

echo $$
ps | grep test.sh
./test.sh

# 58142
# 58142 ttys001    0:00.01 /bin/bash ./test.sh

$!

$!は直前に実行したプロセスのPIDになります。
PIDを取得したいプロセスはバックグラウンド実行する必要があります。

#!/bin/bash

ps | grep test.sh
./test.sh $

# 61518 ttys001    0:00.01 /bin/bash ./test.sh
# 61528 ttys001    0:00.00 grep test.sh

echo $!

# [1]  + done       ./test.sh
# 61518

$-

$-は実行中プロセスのオプションになります。

#!/bin/bash

echo $-
./test.sh

hB

-Code, ShellScript

© 2024 トンボのようにまっすぐ進んでいたい Powered by AFFINGER5