为什么 cut 命令不分割给定的字符串?

为什么 cut 命令不分割给定的字符串?

此处按预期剪切工作

$ 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

答案1

要将命令的标准输出和标准错误(减去尾随换行符)分配给变量,类 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

但如果该变量只有一行,那就有点大材小用了。

相关内容