id -u $var는 $var에 값이 있거나 값이 없는 경우 동일한 출력을 제공합니다.

id -u $var는 $var에 값이 있거나 값이 없는 경우 동일한 출력을 제공합니다.

나는 새로운 데비안 설치를 구성하기 위한 스크립트를 작성 중이고 사용자가 스크립트에 존재하는지 확인하는 최상의 솔루션을 찾는 동안 제가 찾은 가장 좋은 방법은 이상한 출력을 제공하는 것입니다.

질문:

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

관련 정보