2005


sh のコードを短くしたいです。

[code]

    RES=`service httpd status`
    if [ "$RES" = 'httpd is stopped' ]; then
      echo "stopped"
    fi
    
[/code]

↓ 以下のように

[code]

    if [ `service httpd status` = 'httpd is stopped' ]; then
      echo "stopped"
    fi
    
[/code]

ただ、`service httpd status`の書き方がまずいみたいで、 _too many arguments_ と出てしまいます。
どのように記述すればいいでしょうか？

よろしくお願いします。


CC BY-SA 3.0
2014-12-18T07:16:06.193
2002
2014-12-18T08:51:44.017
2014-12-18T08:51:44.017
30
4874
question
linux sh
shell スクリプトの if 文の条件内で、バッククォートによるコマンド置換がしたい


提示されたコードですと、 `service httpd status` の実行結果による置き換えで

[code]

    if [ httpd start/running, process XXXX = 'httpd is stopped' ]; then
      echo "stopped"
    fi
    
[/code]

のようになってしまうのが原因だと思われます。 ダブルクオートで囲って

[code]

    if [ "`service httpd status`" = 'httpd is stopped' ]; then
      echo "stopped"
    fi
    
[/code]

とすれば大丈夫でしょう。


CC BY-SA 3.0
2014-12-18T07:21:27.720
2005
2014-12-18T07:21:27.720
2750
2002
answer


sh -xv に渡してみるとエラーが発生している箇所が良く分かります。

[code]

    [shige@mcc ~]$ sh -xv test.sh
    RES=`/sbin/service httpd status`
    /sbin/service httpd status
    ++ /sbin/service httpd status
    + RES='httpd is stopped'
    if [ "$RES" = 'httpd is stopped' ]; then
      echo "stopped"
    fi
    + '[' 'httpd is stopped' = 'httpd is stopped' ']'
    + echo stopped
    stopped
    
    [shige@mcc ~]$ sh -xv test2.sh
    if [ `/sbin/service httpd status` = 'httpd is stopped' ]; then
      echo "stopped"
    fi
    /sbin/service httpd status
    ++ /sbin/service httpd status
    + '[' httpd is stopped = 'httpd is stopped' ']'
    test2.sh: line 1: [: too many arguments
    
[/code]

'httpd is stopped' と httpd is stopped のように、まとまった文字列として処理されていないのが分かると思います。

対策は既に回答頂いている方の方法をご参照ください。


CC BY-SA 3.0
2014-12-18T07:25:58.700
2006
2014-12-18T07:52:34.877
2014-12-18T07:52:34.877
2750
2096
2002
answer


おそらくお節介ですがこんな書き方もあります。

[code]

    service httpd status | grep -q 'httpd is stopped' && echo stopped
    
[/code]

ご参考まで。


CC BY-SA 3.0
2014-12-18T08:09:23.847
2012
2014-12-18T08:09:23.847
4480
2002
answer


そもそもなところですが、真っ当な lsb のスクリプトならサービスの状態は `service httpd status`
の終了コードで判別できるのではないでしょうか？

0 なら実行中で、3 なら停止中です。

[code]

    service httpd status 1>/dev/null 2>&1
    case $? in
      0)
        echo "started"
        ;;
      3)
        echo "stopped"
        ;;
      *)
        echo "unknown"
        ;;
    esac
    
[/code]


CC BY-SA 3.0
2014-12-18T08:13:46.263
2013
2014-12-18T08:13:46.263
2494
2002
answer