【Linux】コマンド実行結果の再利用

この記事は約2分で読めます。
スポンサーリンク

コマンドの実行結果を再利用するシーンを考えてみます。

  • 変数に代入して後で参照する
  • コマンド生成に用いる

その時の方法についてまとめました。

どういうこと

7 + 3 * (3 – 2)という数式を計算することを考えてみます。

  1. 3 – 2を計算
  2. 3 * (1.の答え)を計算
  3. 7 + (2.の答え)を計算

という流れになります。

(参考:計算する命令はexprです)


さて、どうすれば(1.の答え)をシェルスクリプトで書けるのでしょうか。

ちなみに、下記は惜しいですが動きません。

answer=expr 3 - 2     #3: コマンドが見つかりません

方法

  1. “(バッククォート)で囲む
  2. $()で囲む

これを使うと、下記のように書けます。

#方法1
answer1=`expr 3 - 2`     #answer1に3-2=1を代入
answer2=`expr 3 \* $answer1`     #answer2に3*1=3を代入
answer3=`expr 7 + $answer2`     #answer3に7+3=10を代入
echo $answer3     #10
#方法2
answer1=$(expr 3 - 2)     #answer1に3-2=1を代入
answer2=$(expr 3 \* $answer1)     #answer2に3*1=3を代入
answer3=$(expr 7 + $answer2)     #answer3に7+3=10を代入
echo $answer3     #10

どう違うのか

方法1では、ネストにすることが難しいです。

試しにやってみると・・・

echo `expr 7 + \`expr 3 \* \\\`expr 3 - 2\\\`\``     #方法1でネスト

読みやすいか否かは人によると思いますが、私には難しいです。

多重エスケープが直感的でないですね。(\\\`のところ)

エラー発生時の切り分けも、とても難しいです。

一体どこのバックスラッシュが多いのか足りないのか、、、


さて、方法2の例を見てみましょう。

echo $(expr 7 + $(expr 3 \* $(expr 3 - 2)))     #方法2でネスト

どうでしょうか。エスケープが不要なのと()囲みなので、普通の数式に似ていると思いませんか。

コメント

タイトルとURLをコピーしました