ここから本文です

シェルスクリプトにて比較演算子を変数に代入し、展開するやり方は、仕様的に問題...

it_********さん

2013/5/2916:07:36

シェルスクリプトにて比較演算子を変数に代入し、展開するやり方は、仕様的に問題あるかないかご存知の方いらっしゃいますか?

具体的には、

#!/bin/sh
a=1
b=2
c='-ge'

if [ $a $c $b ] ; then
echo "True"
else
echo "False"
fi

という書き方です。
以下の環境でテストしてみたところ、想定通り動きましたが、バージョン依存があるかなど懸念してます。
bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

閲覧数:
393
回答数:
2
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

a4a********さん

2013/5/2916:26:53

"["は括弧ではなくコマンドです。ifで[コマンドの戻り値を判定してます。
% man [ でマニュアルが参照できるはずです。
なので、シェルが正しく変数の値をコマンドに渡せないバージョンなんて無いでしょうから問題ありません。

質問した人からのコメント

2013/6/5 20:05:21

早急なご回答、ありがとうございました。

ベストアンサー以外の回答

1〜1件/1件中

ent********さん

2013/5/3115:01:34

問題ありません。

if [ $a $c $b ] ; then は if test $a $c $b; then と同義です。

if xxxx; then 構文において、xxxxに書くのはコマンドです。test $a $c $bもコマンドです。

シェル変数を展開するとこんな感じです。

test 1 -ge 2

testコマンドへの引数は、第一引数が1、第二引数が-ge、第三引数が2です。cat 1 2 3 と何ら変わりません。何が言いたいかというと、コマンドを起動する段階では-geが予約語ではなく、ただの文字列であるということです。-geはtestコマンドの中で初めて演算子として解釈されます。

シェル変数はコマンドが実行される前に展開されるので、test $a $c $b と書いてあっても、実行時点では既にtest 1 -ge 2 という形になっているので問題ないというわけです。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo!知恵袋カテゴリ

一覧を見る

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる