sh – Использование аргументов в .profile-функциях

Я хочу использовать аргумент в функции, созданной в моем файле .profile.

Я хочу запросить ввод, если аргумент не указан, иначе установите переменную в $ 1.

Когда я проверяю $ 1, чтобы узнать, пуст ли он, я получаю следующую ошибку:

sh[7]: 1: Parameter not set. 

Из следующей строки:

 if [ ! -n "$1" ]; then 

Я использую sh not bash.

EDIT: Хорошо, вот первая строка кода до конца оператора if:

 HOST=`hostname` cd /opt/dirpath ll *.sto if [ x"$1" = x ]; then # Ask for input echo "File: \c"; read outFile else outFile=$1 fi 

Я редактирую чужой код для работы с аргументами или без них.

Я думаю, что есть еще кое-что:

Либо это не та команда, которую вы используете, либо где-то еще в функции, которую вы делаете по-разному. Эта ошибка исходит от ${1?} . Или это исходит из вашего теста, но только если вы сначала set -u .

Чтобы это исправить, перестаньте это делать. Сделайте set +u; fn_name set +u; fn_name и посмотреть, что произойдет. И если у вас есть какие-либо ${1?} Расширения там, эта ошибка не исчезнет, ​​пока вы не дадите функции аргумент.

Вот некоторые примеры кода, как вы могли бы воспроизвести эту ошибку:

 sh -c 'fn(){ [ ! -n "${1?}" ]; }; fn' sh: 1: 1: parameter not set 

…или…

 sh -uc 'fn(){ [ ! -n "$1" ]; }; fn' sh: 1: 1: parameter not set 

…но…

 sh -uc 'fn(){ [ ! -n "$1" ]; } set +u; fn; echo "$?"' 0 

…а также…

 sh -c 'fn(){ [ ! -n "${1?}" ]; } fn some args; echo "$?"' 1 

Если функция -u вы должны, вероятно, отредактировать это. Или, если ваш .profile делает это, то же самое. В большинстве случаев set -u не является желательным постоянным параметром оболочки, и это связано с тем, что этот режим предназначен для уничтожения оболочек. Он не предоставляет каких-либо простых средств обработки типов ошибок, которые он генерирует, – это то, что вы пытаетесь сделать с помощью [ test ] .