此处按预期剪切工作
$ 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
但如果该变量只有一行,那就有点大材小用了。