Echo
為什麼 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
要將命令的標準輸出和標準錯誤(減去尾隨換行符)分配給變數,類似 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
儘管如果該變數只有一行,那就有點矯枉過正了。