質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

1回答

3091閲覧

ShellScriptで 未定義の変数をチェックしたく、 `echo "$ARGS" | od -A n -t x1` としましたが、Line Feedが入っています。なぜですか?

hiroga

総合スコア91

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

0クリップ

投稿2020/02/08 07:19

編集2020/02/09 07:42

次のようなシェルを書いています。

sh

1if [ -n $ARG] 2then 3 echo "has arg" 4else 5 echo "no arg" 6fi

ここで $ARGには何も代入していません。したがって、 $ARG は文字数ゼロであることを期待しました。
ところが、実際には2つめの分岐に遷移しました。

echo "$ARGS" | od -A n -t x1 として中の値を見ると Line Feedが入っているようです。

シェルの仕様なのでしょうか?ご存じの方、教えていただけると幸いです。

bash: 3.x

2020-02-09T16:41:37+09:00 追記: タイトルを変更しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takasima20

2020/02/08 08:06

$ARG を設定してるとこを見ないとなんとも。もし、設定してないんだったら参照しちゃだめですよね。あと、中身がないかもしれない変数を参照する時はダブルクオートで囲う方がいいです。
hiroga

2020/02/08 08:34

> $ARG を設定してるとこを見ないとなんとも。 設定していないので不思議に思っています。 ダブルクォートで囲うのはそうですね!ありがとうございます。
guest

回答1

0

ベストアンサー

中の値を見ると Line Feedが入っているようです。

はどうやって確認しましたか?設定しないのであれば空ですので、確認の仕方が間違っていると思われます。

ARGが空の場合、if [ -n $ARG]は、if [ -n ]となりますが、[ ]の中に文字列(この場合-n)が1つだけの場合は、空文字列でない限り内容にかかわらず真となりますので、echo "has arg"が実行されます。
ARGが空でない場合、例えばabcだと、if [ -n abc]となるので、エラーです。]の前に空白が必要です。

一般に、変数参照時は、絶対に空でないことが保証できる場合以外は、二重引用符で囲みます。(*など、一部シェルの特殊文字を含む可能性がゼロでない場合も囲む)
つまり、if [ -n "$ARG" ]が正しいです。

参考:

Bash

1[ ] ⇒ 偽 引数がゼロ個なら偽 2[ "" ] ⇒ 偽 空文字列が「空かどうかの判断対象文字列」とみなされ、空なので偽 3[ -n ] ⇒ 真 -n が演算子じゃなくて「空かどうかの判断対象文字列」とみなされ、空じゃないので真 4[ -n "" ] ⇒ 偽 -n は演算子。""が空なので偽 5[ -n -n ] ⇒ 真 1つ目の -n は演算子。2つ目は空かどうかの判断対象文字列で、空じゃないので真 6 7[ -z ] ⇒ 真 -z が演算子じゃなくて「空かどうかの判断対象文字列」とみなされ、空じゃないので真 8[ -z "" ] ⇒ 真 -n は演算子。""が空なので真 9[ -z -z ] ⇒ 偽 1つ目の -z は演算子。2つ目は空かどうかの判断対象文字列で、空じゃないので偽

さらに参考:
man bashtestコマンドの説明のところ。

投稿2020/02/08 10:57

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroga

2020/02/09 07:40

> 設定しないのであれば空ですので、確認の仕方が間違っていると思われます。 おっしゃるとおり、確認の仕方が誤っていました。 `echo "$ARGS" | od -A n -t x1` このように確認したのですが、 echoコマンドで改行が入っていました。 `echo -n $UNDEFINED | od -A n -t x1` のように、-nオプションを付けて変数の中身を見たところ、たしかに空でした。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問