Bash
-uvrg_ivesthesameoutputif_在一種rG一世在和s噸H和s一種米和這在噸p在噸一世Fvar gives the same output ifvar 是否有值
我正在編寫一個腳本來配置新的 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上的這個問題得到命令:檢查使用者是否存在
問題:
- 這裡發生了什麼?
- 您是否可以找到更好的方法來驗證使用者是否存在於腳本中?
- 腳本上的指針非常受歡迎
由於沒有引用變數擴展,因此擴展產生的空詞
$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
.這與來自未引用變數的意外分詞的常見問題有點相反。但是基本問題是相同的,並且由這裡一半的答案所說的固定:始終引用變數擴展(除非您知道您想要未引用的行為)。
看: