簡體   English   中英

“${var:x:y}”在 Bash 中是什么意思?

[英]What does “${var:x:y}” mean in Bash?

在 shell 腳本的函數中,我看到了這樣的東西

func() {
  local x
  x=${1:3:1}
  ...
}

x=${1:3:1}是什么意思? 我知道$1$2$3是函數的參數。 那么上面的陳述是否意味着x = $1:$2:$3

這在 shell 中稱為參數擴展。

${PARAMETER:OFFSET:LENGTH}

這個只能擴展參數值的一部分,給定開始位置和長度。 如果省略 LENGTH,則參數將擴展到字符串的末尾。 如果 LENGTH 為負數,則將其作為字符串的第二個偏移量,從字符串的末尾開始計數。

OFFSET 和 LENGTH 可以是任何算術表達式。 OFFSET 從 0 開始,而不是從 1 開始。

例如讓我們說參數是一個字符串,

MYSTRING = "接受的東西要自由,發送的東西要保守"

回聲 ${MYSTRING:34:13}

以上將為您提供以下內容

保守的

因為它將計算第 33 個(索引從 0 開始)字符,該字符將以字符“c”開頭,然后計算(13 個字符)長度。

因此,在您的情況下,$1 是您傳遞給腳本的參數,然后它會偏移其中的 3 個字符,並采用長度為 1 的字符串並將其初始化為 x。

在這里閱讀更多: http : //wiki.bash-hackers.org/syntax/pe#substring_expansion

它是一個 GNU shell 參數擴展,是許多以${開頭的一部分。

${parameter:-word}${parameter:=word}${parameter:?word}${parameter:+word}和其他幾個。

這個(特定於kshbashzsh ): ${parameter:offset:length}從偏移量開始提取長度字符(可選,如果缺少,參數中的其余字符串)。 在 bash 手冊中描述了幾個細節。

${name:offset:length}

子串擴展。 從 offset 指定的字符開始,最多擴展到參數值的 length 個字符。 如果參數為@、以@ 或* 為下標的索引數組或關聯數組名稱,則結果不同,如下所述。 如果省略length,則擴展為參數值的子字符串,從offset 指定的字符開始,一直延伸到值的末尾。 length 和 offset 是算術表達式(參見下面的 ARITHMETIC EVALUATION)。

如果 offset 計算結果為小於零的數字,則該值用作距參數值末尾的字符偏移量。 如果長度計算為小於零的數字,則將其解釋為距參數值末尾的字符偏移量而不是字符數,並且擴展是偏移量和該結果之間的字符。 請注意,負偏移量必須與冒號隔開至少一個空格,以避免與 :- 擴展混淆。

如果參數是@,則結果是從偏移量開始的長度位置參數。 相對於大於最大位置參數的一個負偏移量,因此 -1 的偏移量計算為最后一個位置參數。 如果長度計算為小於零的數字,則為擴展錯誤。

如果參數是由@ 或* 下標的索引數組名稱,則結果是以${parameter[offset]} 開頭的數組的長度成員。 相對於大於指定數組的最大索引的一個負偏移量。 如果長度計算為小於零的數字,則為擴展錯誤。

應用於關聯數組的子字符串擴展會產生未定義的結果。

除非使用位置參數,否則子字符串索引是從零開始的,在這種情況下,索引默認從 1 開始。 如果 offset 為 0,並且使用了位置參數,則 $0 是列表的前綴。

使用手冊頁,所有信息都在那里。 man bash

   ${parameter:offset:length}
          Substring  Expansion.  Expands to up to length characters of the
          value of parameter starting at the character specified  by  off‐
          set.  If parameter is @, an indexed array subscripted by @ or *,
          or an associative array name, the results  differ  as  described
          below.   If  length  is omitted, expands to the substring of the
          value of parameter starting at the character specified by offset
          and  extending  to  the end of the value.  length and offset are
          arithmetic expressions (see ARITHMETIC EVALUATION below).

x=${1:3:1} 是什么意思?

它是子字符串切割,在英語中:使用$1的字符串,從索引3開始提取1字符(其中索引從 0 開始)。 因此,如果$1 === "foobar" ,則${1:3:1} === "b"

我知道 $1、$2 和 $3 是函數的參數。 那么上面的陳述是否意味着 x = $1:$2:$3?

不,鄰接表示字符串連接: x="$1$2$3"是連接$1$2$3的字符串的結果。

另外,如果有人可以建議我如何在谷歌搜索這樣的特殊字符,這真的很有幫助? 有標准關鍵詞嗎? 我嘗試在 shell 腳本中搜索“什么是“:”等。但是在嘗試搜索特殊字符時結果是隨機的。

bash parameter substitution通常會讓您了解情況。 我知道我不記得 bash 處理數據的所有不同語法方式,因此將“參數替換”提交到內存是值得的。 字符串操作恰好是參數替換之前的章節。

試試這個:

設置 ABCDEFG

回聲 ${1:3:1}

它正在獲取一個子字符串。 通常 ${} 指的是一個數組變量(在這種情況下是字符數組)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM