2016-04-08 14 views
4

我不明白這行老的腳本在我的項目之一:

USER=${1:-`id -un`} 

回答

4

這是一個bash參數擴展模式。

給定語句表示:

  • 如果$1(第一位置參數(自變量))的值是設置或者爲空,則命令id -un的輸出將被設置爲變量USER

  • 如果參數$1設置爲非空,則$1的擴展將設置爲參數USER

而且變量USER應寬在登錄時設置會話,除非你有你不應該直接修改它一個很好的理由。然後,您可以在腳本中使用不同的變量名稱作爲解決方案。

檢查man bashParameter Expansion部分以獲得更多想法。

0

解析這樣說:

  1. ${}告訴你,這是一個parameter expansion
  2. :-是使用:-右手的default value如果左手是沒有設置
  3. 的反引號在RH運行那個命令

例如:

$ sv="set v" 
$ echo ${sv:-`whoami`} 
set v 
$ echo ${not_set:-`whoami`} 
dawg 

還有其他形式的,包括:

  1. ${parameter:?word}顯示如果參數是未設置錯誤,的word僅當

    $ echo ${not_set:?'is not set to anything'}
    -bash: not_set: is not set to anything

  2. ${parameter:+word}替代值parameter設置爲

    $ echo ${sv:+'substitute for sv'}
    substitute for sv

  3. ${parameter:=word}分配parameterword如果parameter值未設置

    $ echo ${not_set:='now it IS set'}
    now it IS set
    $ echo "$not_set"
    now it IS set

1

查看idman id)的手冊頁,命令id -un將返回用戶的實際名稱。

格式:-只有在未設置左側的內容時纔會使用右側的內容。有關此語法的更多信息,請參閱here

因此,您提供的代碼實質上是默認給用戶,但如果提供的話,則將$USER變量替換爲值$1

0

即線被設置稱爲USER變量的值:

USER=.... 

相等的右側有幾個等級。

  • 「參數擴展」,${ }
  • 正在展開的參數是$1。這就是爲什麼它是${1 ... }
  • 如果它是NUL或未設置,${1:- }正在測試值$1
  • 如果有$ 1(除nul以外)的值,則替換該值。
  • 如果$1NUL或取消設置,則將該值替換爲-的縱座標。
  • -}之間的值是「命令替換」。
  • 「命令執行」執行命令並替換其輸出。
  • 該命令是id -un。你可以理解它與man id有什麼關係。
  • 命令id -un打印一個名稱。當前用戶(如果用戶被省略)。

同樣的命令可以由$(id -un)執行。

這將改變行這樣的:

$ USER=${1:-$(id -un)} 

將設置用戶給定的位置參數1或執行就行了當前用戶的名稱的名稱。

要嘗試它,你可以做一個函數:

$ tf(){ USER=${1:-$(id -un)}; echo "$USER"; } 

如果給出值,該值將被打印回:

$ tf bind 
bind 

如果用戶名沒有給出,執行用戶名稱被打印:

$ tf 
bize