3

bash マップ内で null (または unset?) をチェックする方法を見つけるのに苦労しています。つまり、マップに配置できる空の文字列を、(その特定のキーに対して) マップに何も配置していない場合とは異なる方法で扱いたいと考えています。

たとえば、次のコードを見てください。

#!/bin/bash

declare -A UsersRestrictions
UsersRestrictions['root']=""


if [[ -z "${UsersRestrictions['root']}" ]] ; then
    echo root null
else 
    echo root not null
fi

if [[ -z "${UsersRestrictions['notset']}" ]]; then
    echo notset null
else 
    echo notset not null
fi

「root」のテストで「not null」が返され、「notset」のテストで「null」が返されることを願っています。しかし、どちらの場合も同じ結果が得られます。他の可能な方法を検索しましたが、これまでのところすべて同じ結果が得られます。これを達成する方法はありますか?

ありがとう!

4

2 に答える 2

3

-z ${parameter:+word}テスト条件としてご利用ください。パラメータが null または未設定の場合は常に true になり、それ以外の場合は false になります。

bash の man ページから:

${パラメータ:+単語}

代替値を使用します。パラメータが null または未設定の場合、何も置換されません。それ以外の場合は、単語の展開が置換されます。

テスト スクリプト:

#!/bin/bash

declare -A UsersRestrictions
UsersRestrictions['root']=""
UsersRestrictions['foo']="bar"
UsersRestrictions['spaces']="    "

for i in root foo spaces notset
do
    if [[ -z "${UsersRestrictions[$i]+x}" ]]; then
        echo "$i is null"
    else 
        echo "$i is not null. Has value: [${UsersRestrictions[$i]}]"
    fi
done

出力:

root is not null. Has value: []
foo is not null. Has value: [bar]
spaces is not null. Has value: [    ]
notset is null
于 2012-09-26T10:52:04.637 に答える
0

次のことを試してください。

if [[ -z "${UsersRestrictions['notset']}" && "${UsersRestrictions['notset']+x}" ]]; then
    echo "notset is defined (can be empty)"
else 
    echo "notset is not defined at all"
fi

トリックは、ダミー文字を連結することです。これは、変数x定義されている場合にのみ追加されます(空かどうかに関係なく)。また、値が事実上空であるため、最初のテストでが得られることにも注意してください。値が空でないかどうかをテストする場合は、代わりに使用します。rootroot nullif [[ ! -z $var ]]

デモ

参考文献:

于 2012-09-26T10:21:52.777 に答える