Bash
從 shell 對列表執行操作
我有一個要解除安裝的軟體包列表。解除安裝程序
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
—
- 更準確地說:系統允許的數量。
2.根據
IFS
變數