[英]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.