私は数日前からこれに取り組んでいますが、環境変数 $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
使用して の出力を後処理するのではなく、オプションを使用して単語数を取得できます。wc
sed
cut
-w
su - root -c 'echo $HOME | wc -w'