id -u $var は、$var に値がある場合、または値がない場合に同じ出力を提供します。

id -u $var は、$var に値がある場合、または値がない場合に同じ出力を提供します。

私は新しいDebianインストールを構成するためのスクリプトを作成していて、ユーザーがスクリプトに存在することを確認するための最良の解決策を探している間に私が見つけた最良の方法は奇妙な出力を提供することです。

質問:

id -u $var値(ユーザー名)があり、値がなくてもid -u $varsome同じ出力を提供します。varvarsome

[19:49:24][username] ~ ~↓↓$↓↓ var=`whoami`
[19:53:38][username] ~ ~↓↓$↓↓ id -u $var
1000
[19:53:42][username] ~ ~↓↓$↓↓ echo $?
0
[19:53:49][username] ~ ~↓↓$↓↓ id -u $varsome
1000
[19:09:56][username] ~ ~↓↓$↓↓ echo $?
0
[20:10:18][username] ~ ~↓↓$↓↓ bash --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
Licens GPLv3+: GNU GPL version 3 eller senere <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[20:27:08][username] ~ ~↓↓$↓↓ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

stackoverflowのこの質問からコマンドを受け取りました。ユーザーが存在することを確認する

質問:

  • ここで何が起こっているのでしょうか?
  • スクリプトにユーザーが存在することを確認するためのより良い方法を見つけることができますか?
  • スクリプトに関するアドバイスありがとうございます。

答え1

変数拡張が引用されていないため、拡張によって生成された空の単語は$varsome完全に削除されます。

引数の数を出力し、引用符がある場合とない場合を比較する関数を作成しましょう。

$ args() { echo "got $# arguments"; }
$ var=""
$ args $var
got 0 arguments    
$ args "$var"
got 1 arguments

あなたの場合でも同じことが起こりますid。空のときとまったく同じですid -u $var。ユーザー名は表示されないため、デフォルトでは現在のユーザーの情報が印刷されます。id -uvarid

を引用すると"$var"結果が異なります。

$ var=""
$ id -u "$var"
id: ‘’: no such user

問題が解決したら、それを使用してidユーザーが存在することを確認できます。 (しかし、ここでは出力は不要なのでリダイレクトします。)

check_user() { 
    if id -u "$1" >/dev/null 2>&1; then
        echo "user '$1' exists"
    else
        echo "user '$1' does not exist"
    fi
}
check_user root
check_user asdfghjkl

これで、user 'root' existsとが印刷されますuser 'asdfghjkl' does not exist


これは、引用されていない変数の誤りによるトークン化によって引き起こされる一般的な問題とは多少相反します。ただし、基本的な問題は同じで、ここの答えの半分によって解決されます。常に変数の拡張を引用します(引用符で囲まれていない動作が必要な場合を除き)。

望むより:

答え2

このコマンドは、id -u現在のユーザーのIDを提供します。このコマンドはid -u userそのユーザーのIDを提供します。

今あなたの例では

var=`whoami`
id -u $var

このコマンドはwhoami現在のユーザーを返します。したがって、id -u current_user現在のユーザーのIDが返され、id -u現在のユーザーのIDも返されます。

編集する

バックティックの使用は廃止され、$(whoami)代わりに次のように書くことをお勧めします。たとえば、次のようになります。

var=$(whoami)
id -u $var

関連情報