Bash

從 shell 對列表執行操作

  • July 30, 2011

我有一個要解除安裝的軟體包列表。解除安裝程序pkg_deinstall不會將軟體包列表作為參數進行解除安裝。我將如何從列表中解除安裝(如 foreach 循環)?

[root@fbsd01 /usr/ports/editors/vim]# pkg_info | grep proto| sed 's/\([a-z0-9]*\).*/\1/'
bigreqsproto
compositeproto
damageproto
fixesproto
fontsproto
inputproto
kbproto
randrproto
renderproto
xcb
xcmiscproto
xextproto
xf86bigfontproto
xineramaproto

我認為與此類似的命令會起作用,但我必須將列表作為參數而不是流傳遞:pkg_info | grep proto| sed 's/\([a-z0-9]*\).*/\1/' | head -n 1 pkg_deinstall

如果你能給我一些關於使用什麼程序和語法的線索,那將會很有幫助。我知道,因為它是獨一無二的,你可能很難想出一個準確的答案。如果我的問題太複雜,也許有人可以告訴我如何對ls目錄中的文件執行操作。

對於最基本的“foreach” xargs,它讀取一些參數並將它們附加到其他命令行。例如,您可以嘗試:

> cut -d: -f1 /etc/passwd | xargs -n1 echo user:

請注意,如果使用者名可能包含空格字元,則應將-d'\n'參數傳遞給xargs。要將所有¹參數附加到同一命令,請使用:

> cut -d: -f1 /etc/passwd | xargs echo users:

對於更一般的循環,您可以使用它:

> cut -d: -f1 /etc/passwd | while read i; do echo $i; done

這一次,$i可以放置在一個或多個命令序列中的任何位置。輸入一次讀取一行,並儲存在變數中i。也可以拆分²行並將其儲存在幾個變數中:

> cut -d: -f1,6 /etc/passwd --output-delimiter=' ' | \
 while read i j; do echo home directory of user $i is $j; done

請注意,對於原始文件名的循環,以下內容更好(請參閱註釋):

> for i in *.txt; do echo file: $i; done

  1. 更準確地說:系統允許的數量。

2.根據IFS變數

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