Bash

-uvrg_ivesthesameoutputif_在一種rG一世在和s噸H和s一種米和這在噸p在噸一世Fvar gives the same output ifvar 是否有值

  • August 14, 2018

我正在編寫一個腳本來配置新的 debian 安裝,同時找到確認腳本中存在使用者的最佳解決方案,我發現的最佳方法給了我奇怪的輸出。

問題:

id -u $varid -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上的這個問題得到命令:檢查使用者是否存在

問題:

  • 這裡發生了什麼?
  • 您是否可以找到更好的方法來驗證使用者是否存在於腳本中?
  • 腳本上的指針非常受歡迎

由於沒有引用變數擴展,因此擴展產生的空詞$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" &gt;/dev/null 2&gt;&1; then
       echo "user '$1' exists"
   else
       echo "user '$1' does not exist"
   fi
}
check_user root
check_user asdfghjkl

那將列印user 'root' existsuser 'asdfghjkl' does not exist.


這與來自未引用變數的意外分詞的常見問題有點相反。但是基本問題是相同的,並且由這裡一半的答案所說的固定:始終引用變數擴展(除非您知道您想要未引用的行為)。

看:

引用自:https://unix.stackexchange.com/questions/462597