1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルスクリプトにおける$シンボルのいくつかの使用法のまとめ

2022-01-05 05:20:57

最近Shellの勉強をしていて、まだまだ固めないといけないことがあることがわかったので、ここに書いて印象を深めておこうと思います。

一般に、職場で最も使われているのは、次のようなものです。

<テーブル 記号 説明 $0 シェルコマンドそのもの <スパン <スパン <スパン <スパン 1 <スパン 次のページへ 9 シェルの最初のパラメータを示す $? 最後のコマンドの実行を表示する $# スクリプトに渡されたパラメータの数 $$ 現在実行中のスクリプトのプロセスID番号 $* スクリプトに渡されたすべてのパラメータを1つの文字列として表示します。 の$! バックグラウンドで最後に動作したプロセスのID番号 $- シェルが現在使用しているオプションを表示します

シェルスクリプトにおける$シンボルのいくつかの使用法

今日は、これらのオプションのいくつかを見ていき、さらにその方法を例示していきます。

1.1 変数の参照

記号を使用した変数の直接参照、および循環変数を含む。

[root@localhost ~]# x=1024
[root@localhost ~]# echo $x
1024


変数補間に対応するため、文字列をダブルクォート "で囲みます。

[root@localhost ~]# x=1024
[root@localhost ~]# echo "x = $x"
x = 1024


単語境界として ${ } を使用します。

[root@localhost ~]# x=1024
[root@localhost ~]# echo "x = ${x}xy"
x = 1024xy


変数文字列の長さを取得するために${#}を使用します。

[root@localhost etc]# s=helloworld
[root@localhost etc]# echo "s.length = ${#s}"
s.length = 10


1.2 スクリプトや関数のパラメータを参照する

スクリプトを参照することを基本とし、1はシェルスクリプトファイル名、nは第2引数を2として2から始まる。

[root@localhost ~]# echo 'echo $1 $2 $3' > ping.sh
[root@localhost ~]# cat ping.sh
echo $1 $2 $3
[root@localhost ~]# sh ping.sh 1 2 3
1 2 3

シングルクォート「'」で囲まれた文字列は補間されず、スクリプトや関数の引数の数を得るために$#が使用されます。

[root@localhost ~]# echo 'echo $#' > ping.sh
[root@localhost ~]# sh ping.sh 1 2 3
3

1.3 前コマンドの戻り値

使用 $? 直前のコマンドの戻り値。
0: エラーなし、それ以外の値: エラーがあることを意味します。

[root@localhost ~]# true 1024
[root@localhost ~]# echo $?
0
[root@localhost ~]# false 2048
[root@localhost ~]# echo $?
1


1.4 コマンドの実行と出力の取得

変数に代入するコマンド出力を実行・取得するために$()を使用しますが、これはダブルクォート関数と同等です。

[root@localhost ~]# echo `date`
Sunday, June 05, 2016 12:39:08 CST
[root@localhost ~]# echo $(date)
Sunday, June 05, 2016 12:39:34 CST


1.5 表現の評価

[root@localhost ~]# echo $[1024 + 2048]
3072
[root@localhost ~]# expr 1024 + 2048
3072
[root@localhost ~]# a=1024
[root@localhost ~]# b=2048
[root@localhost ~]# echo $[ a + b ]
3072



1.6 現在のプロセスIDの取得

現在のプロセスのID番号を取得するには$$を使用します。

[root@localhost ~]# echo $$
55580


1.7 バックグラウンドで動作している最後のプロセスID

バックグラウンドで最後に実行されたプロセスのIDを取得するには$!を使用します。
コマンドの最後に & を使用すると、バックグラウンドプロセスを作成することができます。

[root@localhost ~]# tail -f /root/ping.sh &
[2] 55848
[root@localhost ~]# echo $!
55848
[root@localhost ~]# kill $!
[root@localhost ~]# echo $!
55848
[2]+ terminated tail -f /root/ping.sh



1.8 シェルのオプションの取得

現在のシェルのオプションを取得するには、$-を使用します。

[root@localhost ~]# echo $-
himBH


シェルにおける $( ), $( ), ``, ${ } の違いについて

説明

${ }という形式は、実際には1つ目と2つ目の使い方と同じで、変数の代入が中括弧の有無でできることを除けば、変数の代入のカテゴリに該当します。

要するに、$(( )は実行式で、$[ ]と同等、$( )と` `はコマンド代入、${ }は変数代入である

(1) $( )、` `(バッククォート):括弧の中のコマンドの結果を返す。

bashでは、$( )と` `(バッククォート)の両方がコマンドの代用として使われ、括弧やバッククォートの中のコマンドを実行します。

コマンド置換 変数置換と同様に、コマンドラインを再編成するために使用されます。まずコマンドラインを引用符で囲んで補完し、その結果を置き換えて新しいコマンドラインに再編成します。

例 コマンド $ echo today is $(date "+%Y-%m-%d") これは、今日は2014-07-01であることを示します。

注)運用上、どちらも適切な効果が得られますが、以下の理由から$( )を使用することを推奨します。

1) ``は '' と混同されやすく、特に初心者に好まれます。

2) 多段階複合代入では、'`は余分なジャンプオフ処理(バックスラッシュ)が必要で、$( )はより直感的である。

最後に、$( )の欠点は、すべてのunix系システムがこの方法をサポートしているわけではないことですが、バックスラッシュは確実にサポートされています。

# Use cmd1 execution result as cmd2 argument, then use cmd2 result as cmd3 argument
cmd3 $(cmd2 $(cmd1))

 # If you use backquotes, direct quoting will not work and you need to skip
cmd3 `cmd2 \`cmd1\``

(2) ${ }変数の置き換え

一般に、$var と ${var} の間に違いはありませんが、${ } を使用すると、変数名のスコープをより正確に定義することができます。

パス、ファイル名、サフィックスを取る

次のように、まずパスに変数を代入します。

file=/dir1/dir2/dir3/my.file.txt

ニーモニックは以下の通りです。

  • # は左から削除(キーボードでは#は$の左にある)
  • は右から削除されます(キーボード上では、%は$の右側です)。
  • 記号1つで最小一致、記号2つで最大一致となります。
  • * は、不要な文字、つまり取り除きたい部分にマッチさせるために使用します。

また、指定された文字区切り文字があり、*と連動してどの部分を取るかを決定します。

シェルスクリプトにおける''$''シンボルのいくつかの使用法に関するこの記事はこれで終わりです。シェルにおける'$'シンボルの使い方については、スクリプトハウスの過去の記事を検索するか、以下の記事を引き続き閲覧してください。