Основываясь на комментариях, я понимаю, что вы хотите отбросить (или где-то сохранить) первый аргумент, а затем использовать остальные аргументы в качестве аргументов для другого сценария или команды, из которой вы вызываете в вашем сценарии.
Если это так, вы можете сделать это довольно легко, и вам не нужно устанавливать переменную ( FLAGS
или что-то еще) для передачи параметров сценария команде в вашем сценарии. См. Следующий пример:
#!/bin/bash
set -x
original_first_arg="$1" # Use this line if you need to save the value to use later.
shift
mycommand "$@"
Команда shift
является встроенной командой bash
. Сам по себе (без указания номера) он просто отбрасывает первый аргумент скрипта (позиционный параметр). Из справочной страницы:
shift [n]
The positional parameters from n+1 ... are renamed to $1 ....
Parameters represented by the numbers $# down to $#-n+1 are
unset. n must be a non-negative number less than or equal to
$#. If n is 0, no parameters are changed. If n is not given,
it is assumed to be 1. If n is greater than $#, the positional
parameters are not changed. The return status is greater than
zero if n is greater than $# or less than zero; otherwise 0.
Затем «$ @»
расширяется до точных параметров, которые вы указали скрипту, за вычетом первого $ 1
, поскольку он был отброшен сдвигом
команда.
Дополнительная литература:
Одним из лучших инструментов для анализа файлов json являетсяjq
. Это упрощает извлечение поля name
из файла package.json
в каталоге. Выполнение переименования — это простой скрипт оболочки :
$ cd /var/www
$ for d in */; do # *1
> if [ -f "${d}package.json" ]; then # *2
> new_name=$(jq -e -M -r.name "${d}package.json") # *3
> if [ $? -eq 0 ] && ! [ -e "${new_name}" ]; then # *4
> mv "${d}" "${new_name}" # *5
> fi
> fi
> done
Некоторые примечания:
*1:*/
расширяется до всех каталогов в текущем каталоге. Каждое имя каталога будет включать в себя /
в конце, поэтому мы не будем вставлять его позже в *2 и *3.
*2 :Обрабатывать только каталоги, содержащие файл package.json
.
*3 :Вызовите jq
для извлечения поля имени из package.json
. Мы вызываем jq
с -r
для вывода необработанных строк (, т.е. оставляем двойные кавычки ), с -M
, чтобы не иметь цветного вывода, и -e
, чтобы jq
завершался с ошибкой, если поля name
нет.
*4 :Убедитесь, что jq
выполнено успешно (было name
поле )и что новое имя для каталога еще не существует. Вы можете разделить их и добавить else
, если хотите вывести сообщение об ошибке для двух случаев, когда вы пропускаете переименование.
*5 :Переименуйте каталог.
Для пробного запуска я бы поставил echo
перед командой mv
в *5 и проверил вывод, чтобы убедиться, что переименование выглядит правильно. Я не проверял это сам, так как у меня нет кучи каталогов с файлами package.json
.