suを使用してユーザーに環境変数が存在するかどうかを確認する

suを使用してユーザーに環境変数が存在するかどうかを確認する

私は数日前からこれに取り組んでいますが、環境変数 $2 が存在するかどうかをユーザー $1 で確認する必要があります。

いくつかのケースを試してみました:

 $ [[ -v a ]] && echo "a ok" || echo "a no"
 a no
 $ [[ -v $HOME ]] && echo "a ok" || echo "a no"
 a no 

(だからダメです (Bash > 4.2 で試しました))

if [ su - ${1} -c "[ -z "${2}" ]" ]

今、何が間違っているのか分からないので、このアプローチを試しています:/!

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"
su - root -c "echo "$HOME" | wc | sed 's/ //g'"

答え1

最初の例の構文は間違っています。次のように記述すると、

[[ -v $HOME ]]

次に、実際にコマンドを実行します。

[[ -v /home/yourusername ]]

もちろん、これは失敗します。次のことが必要です。

[[ -v HOME ]] && echo ok || echo no

これを次のように組み合わせることができますsu:

su - root -c "[[ -v HOME ]]" && echo ok || echo no

最後の例は、引用符をネストすることができず、シェル変数の展開がコマンド実行前に行われるため、機能しません。つまり、次のようになります。

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"

実際に実行するコマンドは次のようになります。

su - root -c 'echo /home/somesuser | ...'

$HOMEの観点から の値が必要な場合はroot、たとえば一重引用符を使用して、ローカル シェルでの変数の展開を防ぐ必要があります。

su - root -c 'echo $HOME | ...'

wcの単語数は$HOMEほぼ常に になるため、出力を に渡す理由がわかりません。またはを1使用して の出力を後処理するのではなく、オプションを使用して単語数を取得できます。wcsedcut-w

su - root -c 'echo $HOME | wc -w'

関連情報