Проблема в том, что когда вы выполняете цикл (по "$@"
), параметр по-прежнему остается первым элементом списка, который вы выполняете в цикле. Вы можете удалить первый элемент $@
с помощью shift
перед циклом.
Я предпочитаю разделять синтаксический анализ командной строки и действия:
#!/bin/sh
unset do_header
unset do_footer
# loop until end of valid options...
while true; do
case $1 in
--header) do_header=1 ;;
--footer) do_footer=1 ;;
*) # assume end of options
break
esac
shift # we have processed a valid option, shift it off the list
done
# create a temporary file that we will use multiple times
tmpfile=$(mktemp)
# remove temporary file on normal exit (in bash, also on TERM/INT)
trap 'rm -f "$tmpfile"' EXIT
# For each file, copy it to the temporary file,
# then add header and footer as requested.
# Since we clobber the original file with the redirection,
# we won't be modifying permissions on the file.
# At this point, the valid options (any number of
# --header and --footer options) have been shifted off
# the list of arguments, so the $@ array now presumably only
# contains pathnames of files that are to be modified.
for pathname do
cp -- "$pathname" "$tmpfile"
cat ${do_header:+"header"} "$tmpfile" ${do_footer:+"footer"} >$pathname
done
Кроме того, это позволяет добавлять верхний и нижний колонтитулы к набору файлов одним вызовом.
Замена параметра ${var:+word}
расширяется до word
, если переменная var
установлена и не пуста.
Вы можете использовать inputs
, чтобы применить фильтр к содержимому всех файлов JSON вместе и применить фильтр выбора. Флаг -n
гарантирует, что выходной JSON создается с нуля на основе заданного ввода.
jq -n '[ inputs[] | select( has("value 6") | not ) ]' *.json
При выполнении jq -n 'inputs[]'
все объекты во всех составляющих файлах JSON становятся доступными для функции выбора, которая отбрасывает любой объект, содержащий ключевое поле как "value 6"
. [..]
, окружающие фильтр, помещают окончательные результирующие объекты в массив.
Другим способом может быть использование функции reduce()
для добавления необходимых объектов итеративным способом
jq -n 'reduce inputs[] as $data (.;. + [ if $data | has("value 6") | not then $data else empty end ] )'
Я создал инструмент командной строки, используя Node.js, для локального объединения вложенных файлов json.
https://github.com/divyeshmakwana96/injson
Вы можете использовать оператор !include('./path-to-json/item1.json')
для встраивания содержимого другого файла json. Дочерние файлы json также могут иметь оператор include.
Пример:
{
"pi": 3.141,
"happy": true,
"questions:": [
"!include('./questions/item1.json')",
"!include('./questions/item2.json')"
],
"answer": "!include('./answers/item1.json')"
}