私は新しいDebianインストールを構成するためのスクリプトを作成していて、ユーザーがスクリプトに存在することを確認するための最良の解決策を探している間に私が見つけた最良の方法は奇妙な出力を提供することです。
質問:
id -u $var
値(ユーザー名)があり、値がなくてもid -u $varsome
同じ出力を提供します。var
varsome
[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 -u
var
id
を引用すると"$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