То, что вы пробовали:
first_arg=$1
shift
#...later...
else
node default.js "$first_arg" "$@"
fi
Это было бы идентично вашему первому варианту при условии наличия хотя бы одного аргумента командной строки.
Без аргументов командной строки "$first_arg"
по-прежнему будет пустой строкой и, следовательно, аргументом, тогда как "$@"
не будет генерировать даже пустую строку.
Если ваше приложение Node принимает пустой аргумент в командной строке, это может привести к тому, что приложение будет вести себя по-разному в ваших двух вариантах кода.
Если вызов вашего скрипта без аргументов командной строки допустим, вы можете
node default.js ${first_arg:+"$first_arg"} "$@"
где ${first_arg:+"$first_arg"}
будет расширяться до нуля, если first_arg
пусто или не задано, но до "$first_arg"
, если first_arg
было установлено на непустую -строку. Или, если вы хотите вызвать явный сбой для неустановленной или пустой переменной:
node default.js "${first_arg:?Error, no command line arguments}" "$@"
Альтернативы включают создание копии $@
в виде bash
массива , как показывает Джесси _b в своем ответе .
Помещение $first_arg
обратно в $@
с помощью
set -- "$first_arg" "$@"`
не будет работать, так как это будет включать пустой аргумент, как $1
в $@
, если аргумент командной строки отсутствует.
С
set -- ${first_arg:+"$first_arg"} "$@"`
вы бы ничего не "сдвинули", если бы $first_arg
было пустым или если бы переменная не существовала.
Обратите внимание, что сдвиг аналогичен сдвигу 1, и отдельные операторы не нужно завершать символом ; если за ним не следует другой оператор в той же строке (новая строка является терминатором команды, как и ; ).
Запустить с параметром отладки. Первое подчеркивание — основная сортировка, следующие — вспомогательная
sort -n -k1,1 --debug test1
sort: text ordering performed using simple byte comparison
1 4
_
___
2 1
_
___
2 5
_
____
3 6
_
___
Обратите внимание, что второе подчеркивание начинается с первого поля!
Чтобы было легче понять, вы можете воспринимать это так:
1 (1 4)
2 (2 1)
2 (2 5)
3 (3 6)
Это последнее -средство сравнения, которое сравнивает полные строки лексически, когда в противном случае они сравниваются одинаково на основе спецификации ключа сортировки.
С реализацией GNU sort
вы можете добавить опцию -s
, чтобы отключить это последнее сравнение -. Алгоритм сортировки GNU sort
является стабильным , вы получите исходный порядок на входе, поэтому:
sort -s -n -k1,1
Или просто:
sort -sn
(поскольку сравнение является числовым, не будет иметь значения, будет ли это полная строка или первое поле, преобразованное в число для сравнения ).