Сплит и объединение (создайте аргументы командной строки от входного файла)

squeeze не поставляется с /etc/os-release , это мой 'hack':

dpkg --status tzdata|grep Provides|cut -f2 -d'-'
-121-33918-

Если folder1 предметов на самом деле является файлом file1 , то ранее существовавший каталог folder1 отсутствовал. Поведение cp по умолчанию заключается в том, что если местом назначения является каталог, копируемые предметы (предметы ) копируются в целевой каталог. Обратите внимание, что в Linux папки folder1 и Folder1 различаются, так как они чувствительны к регистру.

-121--174009-

Оказывается, что я загружал файл opcache.ini , который был тем, что php 5 использовался по умолчанию, но в php 7 он был загружен как 10-opcache.ini по умолчанию, поэтому, когда мой файл opcache.ini был предоставлен в нем, имел два файла .ini и пытался

Я не собираюсь удалять этот вопрос, так как я считаю, что это ошибка, которую легко упустить из виду и может быть полезной, так как вы не можете действительно гуглить эту фазу ошибки, и ни в одном месте, где было что-либо сказано о удвоенных ini-файлах или объявлении расширения дважды.

2
19.10.2018, 11:32
4 ответа

Это зависит от того, что вы хотите сделать с созданной строкой. Это выглядит как набор параметров командной строки, поэтому я предполагаю, что вы хотите использовать его как таковой вместе с некоторой утилитой под названием util.

Вот решение для/bin/sh:

#!/bin/sh

listfile=$1

set --
while IFS= read -r line; do
    set -- "$@" -o "$line:1"
done <$listfile

util "$@"

Это читает из файла, указанного в командной строке сценария, и для каждой строки, считанной из этого файла, устанавливает позиционные параметры, включающие -oи LINE:1, где LINE— строка, считанная из файла..

После прочтения всех строк вызывается utilс построенным списком аргументов командной строки. Используя"$@"(с двойными кавычками ), мы гарантируем, что каждый отдельный элемент в построенном списке аргументов заключен в кавычки.

С bashи использованием массива bashдля хранения аргументов командной строки, которые мы создаем:

#!/bin/bash

listfile=$1

while IFS= read -r line; do
    args+=( -o "$line:1" )
done <$listfile

util "${args[@]}"

В обоих приведенных выше примерах важно цитирование. Точно так же мы создаем массив отдельных элементов (, каждый -oи каждый LINE:1являются элементами списка ).Другим способом сделать это было бы создать одиночную строку -o LINE1:1 -o LINE2:1 etc., но это было бы интерпретировано как один единственный аргумент, если бы использовалось как util "$string", и подверглось бы разбиению на слова и подстановке имен файлов, если бы использовалось как util $string(. ] это не сработало бы, если бы какая-либо строка во входном файле содержала пробелы, символы табуляции или подстановочные символы имени файла ).

Оба скрипта выше будут использоваться как

$./script.sh file

, где script.sh— исполняемый файл сценария, а file— имя входного файла для чтения.

Связанные:

6
27.01.2020, 21:50

Входной файл:

line1
line2
line3

Команда:

perl -lpe '$\=" ";$_="-o $_:1"' input.txt

Альтернативная команда:

awk '{ORS=":1 ";print"-o "$0}' input.txt

Выход (одинаковый для обеих команд):

-o line1:1 -o line2:1 -o line3:1 
0
27.01.2020, 21:50
sed 's/\(.*\)/-o \1:1/' file.txt | xargs /path/to/command

Замена sedчитается как :заменить текст в данной строке на "-o исходный _текст _:1". Затем команда xargsберет эти измененные строки текста и объединяет их в соответствии с аргументами командной строки

1
27.01.2020, 21:50

С недавней оболочкой (например. bash), попробуйте

mapfile -t TMP <file
TMP=(${TMP[@]/%/:1})
echo ${TMP[@]/#/-o }
-o line1:1 -o line2:1 -o line3:1
2
27.01.2020, 21:50

Теги

Похожие вопросы