это содержимое файла packageList :

base-files
busybox
dnsmasq
dropbear
firewall
hotplug2
iptables
iptables-mod-conntrack-extra
iptables-mod-filter
iptables-mod-ipopt
iw
jshn
kernel
kmod-ath
kmod-ath9k
kmod-ath9k-common
kmod-cfg80211
kmod-crypto-aes
kmod-crypto-arc4
kmod-crypto-core
kmod-gpio-button-hotplug
kmod-ifb
kmod-ipt-conntrack
kmod-ipt-conntrack-extra
kmod-ipt-core
kmod-ipt-filter
kmod-ipt-ipopt
kmod-ipt-nat
kmod-ipt-nathelper
kmod-leds-gpio
kmod-ledtrig-default-on
kmod-ledtrig-netdev
kmod-ledtrig-timer
kmod-lib-crc-ccitt
kmod-lib-textsearch
kmod-mac80211
kmod-nls-base
kmod-ppp
kmod-pppoe
kmod-pppox
kmod-sched-connmark
kmod-sched-core
kmod-tun
kmod-wdt-ath79
libblobmsg-json
libc
libgcc
libip4tc
libip6tc
libiwinfo
libiwinfo-lua
libjson
liblua
liblzo
libnfnetlink
libnl-tiny
libopenssl
libubox
libubus
libubus-lua
libuci
libuci-lua
libxtables
lua
luci
luci-app-firewall
luci-app-qos
luci-app-tinyproxy
luci-app-upnp
luci-i18n-english
luci-lib-core
luci-lib-ipkg
luci-lib-nixio
luci-lib-sys
luci-lib-web
luci-mod-admin-core
luci-mod-admin-full
luci-proto-core
luci-proto-ppp
luci-proto-relay
luci-sgi-cgi
luci-theme-base
luci-theme-openwrt
miniupnpd
mtd
netifd
openvpn
opkg
ppp
ppp-mod-pppoe
qos-scripts
relayd
swconfig
tc
tinyproxy
uboot-envtools
ubus
ubusd
uci
uhttpd
wpad-mini
zlib

Теперь я хотел бы передать это в качестве аргумента:

сделать изображение PROFILE = TLWR740 ПАКЕТЫ = packageList

это BASH, как это сделать? содержимое должно быть передано в качестве аргумента следующим образом:

базовые файлы busybox dnsmasq dropbear брандмауэр hotplug2 iptables iptables-mod-conntrack-extra iptables-mod-filter iptables-mod-ipopt с ядром jshn kmod-ath kmod-ath9k kmod-ath9k-общий kmod-cfg80211 crypto-arc4 kmod-crypto-core kmod-gpio-button-hotplug kmod-ifb kmod-ipt-conntrack kmod-ipt-conntrack-дополнительный kmod-ipt-core kmod-ipt-фильтр kmod-ipt-ipopt kmod-ipt-nat kmod-ipt-nathelper kmod-leds-gpio kmod-ledtrig-default-on kmod-ledtrig-netdev kmod-ledtrig-таймер kmod-lib-crc-ccitt kmod-lib-textsearch kmod-mac80211 kmod-nls-base kmod-ppp kmod-pppoe kmod-pppox kmod-sched-connmark kmod-sched-core kmod-tun kmod-wdt-ath79 libblobmsg-json libc libgcc libip4tc libip6tc libiwinfo libiwinfo-lua libjson liblua liblzo libnfublinks libblub libublubus libublubus -lua libxtables lua luci luci-app-firewall luci-app-qos luci-app-tinyproxy luci-app-upnp luci-i18n-английский luci-lib-core luci-lib-ipkg luci-lib-nixio luci-lib-web luci-mod-admin-co re luci-mod-admin-full luci-proto-core luci-proto-ppp luci-Proto-relay -scripts пересылает swconfig tc tinyproxy uboot-envtools ubus ubusd uci uhttpd wpad-mini zlib

5 ответов5

3

Вы можете сделать это так:

  1. Объявите переменную $packages как массив
  2. Считать содержимое файла packageList в $packages
  3. Запустите make со всеми элементами массива в виде списка (${packages[*]})

Следовательно, этот фрагмент должен работать:

declare -a packages
packages=($(< packageList))
make image PROFILE=TLWR740 PACKAGES="${packages[*]}"

Подходящий комментарий о ${packageList[*]} . Это распространяется на все элементы массива как одно слово оболочки . Это аналогично, если вы пишете "one two three" (обратите внимание на кавычки) в командной строке.

Простой пример:first используется функция, которая печатает первый аргумент:

$ function first { echo $1 ; }
$ first one two three
one
$ first "one two three"
one two three

Теперь с массивом:

$ foo=(one two three)
$ first "${foo[@]}"
one
$ first "${foo[*]}"
one two three

Таким образом, с @ оболочка разбивает массив на несколько слов оболочки, а с использованием * - нет.

1
make image PROFILE=TLWR740 PACKAGES="`cat packageList | tr '\n' ' '`"

Это должно сделать это. cat печатает содержимое файла, а команда tr заменяет символы новой строки пробелами. (Примечание: это предполагает, что packageList - это файл в текущем каталоге, если он находится в другом месте, вам нужно будет заменить имя, чтобы включить правильный путь, или использовать переменную для ссылки на него)

1

Используйте команду xargs .

Чтобы передать имена файлов из файла в команду cp мы можем сделать:

cat 'file_name'| args -I % cp % destination_directory

Но если вы хотите увидеть, как это отразится, то:

cat 'file_name' | args -I % echo cp % destination_directory 

Это будет просто эхо.

1

Используйте tr для преобразования символов новой строки в пробелы:

make image PROFILE=TLWR740 "PACKAGES=$( tr '\n' ' ' < packageList)"

Кажется, tr только читает stdin, поэтому я изменил свою команду выше, чтобы передать файл через stdin.

0
List=`cat packageList`  
make image PROFILE=TLWR740 PACKAGES="$List"  

кошка записывает содержимое файла. (попробуйте в кли.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .