簡體   English   中英

如何從字符串中提取或測試最后一個字段?

[英]How can I extract, or test, the last field from a string?

我正在編寫一個bash腳本來測試一些數據。 我創建了一個變量來保存SQL語句的輸出:

$ declare -p data_ck
declare -- data_ck="2019-02-17  TRUE    2019-02-10  23"

我想我的data_ck變量實際上只是一個字符串,而不是我可以解析為字段的數組。 因此,我接下來弄清楚了這種語法: echo ${data_ck[@]:27:2}

在這種情況下返回“ 23”。

我還可以使用: echo "${data_ck[@]: -2:2}"

我想確定我的最后一個元素23是否等於30。我嘗試了此語句的不同變體,但沒有成功:

If [ ${data_ck[@]:27:2} != 30 ]; then echo "missing dates"

返回:-bash:意外令牌'then'附近的語法錯誤

使用此方法,我得到相同的結果:

If [ ${data_ck[@]:27:2} -ne 30 ]; then echo "missing dates" fi

我只是稍微熟悉腳本編寫,並且不了解我在做什么錯。 有人可以伸出援手嗎? 謝謝!

set -x
declare -- data_ck="2019-02-17  TRUE    2019-02-10  23"
last_field=${data_ck##*[[:space:]]}
[[ $last_field = 30 ]]

...正確發出:

+ [[ 23 = 30 ]]

...這告訴我們${data_ck##*[[:space:]]}成功刪除了最后一個字段之前的所有內容,從而可以根據您的規范將字段的內容與30進行比較。

它作為參數擴展來執行此操作 ,匹配並刪除以空格結尾的最長可能字符串。 *[[:space:]]是一種glob樣式的模式,與任何以空格結尾的字符串匹配; ${var##pattern}擴展為$var的內容,並且從開頭刪除的pattern匹配時間最長。

我看不到data_ck的所有變化。 它可能是

data_ck=( 2019-02-17 TRUE 2019-02-10 23 )
data_ck=( 2019-02-17 FALSE 2019-02-10 23 )
data_ck=( 2019-02-17 TRUE 2019-02-10 301233 0 )
data_ck=( "2019-02-17 TRUE 2019-02-10 23" )

值FALSE和第三個示例使將數組轉換為字符串后無法使用某些固定偏移量。 您可以使用提取第四個字段

if [ "${data_ck[@]:3:1}" = "23" ]; then echo "23 found"; fi
# or shorter
if [ "${data_ck[3]}" = "23" ]; then echo "23 found"; fi

編輯:當data_ck是一個字符串時,您仍然需要考慮什么是最好的方法來修飾您的字段。 一些可能性:

echo "${data_ck}" | sed 's/.* //'    # Get everything after last space
echo "${data_ck}" | sed -r 's/.* ([^ ]+) */\1/' # get last field in string ending with spaces
echo "${data_ck}" | cut -d" " -f4    # Get 4th field
echo "${data_ck}" | awk '{print $4}' # 4th field where 2 spaces count as 1 delimiter

根據delcare -p data_ck的結果,假設data_ck是一個標量變量,而不是一個數組,您可以這樣說:

data_ck="2019-02-17 TRUE 2019-02-10 23"
if [[ ${data_ck: -2:2} != 30 ]]; then
    echo "missing dates"
fi

以下內容仍然有效,但基本上是多余的:

if [[ ${data_ck[@]: -2:2} != 30 ]]; then
    echo "missing dates"
fi

正如@chepner所指出的,此處的${data_ck[@]}被評估為${data_ck[0]} ,在上下文中等效於$data_ck

暫無
暫無

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

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