Echo

為什麼 cut 命令不拆分給定的字元串?

  • November 17, 2017

剪切在這裡按預期工作

$ cat test 
1;2;3;4
$ cut -d ';' -f 2 test 
2
$ cut -d ';' -f 3 test 
3

但我希望它在這裡輸出'21’,我做錯了什麼?

$ updates=""
$ echo "$updates" | cat -v

$ updates=$(/usr/lib/update-notifier/apt-check 2>&1);echo $updates
21;0
$ echo "$updates" | cat -v
21;0
$ updates=""
$ updates=$(/usr/lib/update-notifier/apt-check 2>&1);echo $updates | 
cut -d ";" -f 1
21
$ echo "$updates" | cat -v
21;0

當我嘗試 Stéphanes 解決方案時

$ cat test2.sh 
updates=$(/usr/lib/update-notifier/apt-check)
all=${updates%";"*}
security=${updates#*";"}
printf '%s\n' "$all packages can be updated" \
         "$security updates are security updates"
$ ./test2.sh 
21;0 packages can be updated
updates are security updates

要將命令的標準輸出和標準錯誤(減去尾隨換行符)分配給變數,類似 POSIX 的 shell 中的語法是:

updates=$(/usr/lib/update-notifier/apt-check 2>&1)

要輸出帶有換行符的變數的內容,語法是:

printf '%s\n' "$updates"

要在字元上拆分變數的內容,語法是:

IFS=';'
set -o noglob
set -- $updates

printf '%s\n' "First element: $1" "Second element: $2"

或者你可以這樣做:

updates=$(/usr/lib/update-notifier/apt-check 2>&1)
all=${updates%";"*}
security=${updates#*";"}
printf '%s\n' "$all packages can be updated" \
             "$security updates are security updates"

得到一個等價的

/usr/lib/update-notifier/apt-check --human-readable

您還可以使用cut以下方法獲取變數每行的第一個分號分隔欄位:

printf '%s\n' "$updates" | cut -d ';' -f 1

儘管如果該變數只有一行,那就有點矯枉過正了。

引用自:https://unix.stackexchange.com/questions/405227