Я хочу использовать сложную команду в качестве резервного значения, что-то вроде этого, но не рассматривайте ls -sh
как одну строку.
"${@:-ls -sh}"
@markp-fuso "${@:-ls -sh}"
— все содержимое скрипта. Я хочу, чтобы он выполнял переданные аргументы как команду или резервную команду. В настоящее время это не обращает внимания на posix-shell, но я, не колеблясь, принудительно использую bash, поэтому пометил оба.
Я удивлен, что вашу команду не отклонили. @
не является специальной переменной, скорее похожей на массив (но со специальными функциями), и я не думаю, что выполнение :-
вообще возможно. В лучшем случае я бы назвал то, что вы делаете, неопределенным поведением.
Если аргументы гарантированно не содержат пробелов, вы можете просто опустить кавычки. В противном случае вам просто придется пойти длинным путем:
(( $# == 0 )) && arr=(ls -sh) || arr=("$@")
# Now use "${arr[@]}" instead of "$@"
@pjh Ох! Я снимаю свой комментарий.
Пытаться
[ -n "${@:+X}" ] || set -- ls -sh
"$@"
[ -n "${@:+X}" ]
.set -- ls -sh
устанавливает позиционные параметры так, чтобы $1
имел значение 'ls'
, а $2
имел значение '-sh'
.
рассмотрите возможность обновления вопроса с помощью минимального воспроизводимого примера; в данном случае полный скрипт (функция?), пара примеров вызовов (с аргументами и без них) и ожидаемый результат; Кроме того, вы пометили вопрос двумя разными оболочками —
bash
иsh
— если вы используете конкретную оболочку, обновите теги (удалите тот, который вы не используете), или вы ищете решение, которое работает в обе оболочки?