В качестве дополнительной части задания я создаю интерактивное меню, используя выбор, и поддерживаю имена файлов и имена каталогов с пробелами. Дело в том, что пользователь может выбрать, с каким файлом или каталогом взаимодействовать, используя данную функцию, выбранную ранее в интерактивном меню. Я должен использовать select как часть требований. В этом случае я пытаюсь использовать cat для получения сохраненной информации о файле.

Однако это не работает

shopt -s nullglob
FARRAY= (*)
shopt -u nullglob
PS3= "Please select a file"
select SHOLDER in "${FARRAY[@]}"
do
   if  test -d "${FARRAY[$SHOLDER]}"
   then
       echo "Please select a file"
   else
       cat "${FARRAY[$SHOLDER]}"
       break
   fi
done

Я получаю сообщение об ошибке: синтаксическая ошибка в выражении (токен ошибки "там"). привет, это имя файла, который я тестировал

Если я добавлю "!" перед именем массива в цикле выбора и части кошки "${!FARRAY[@]}" он работает, но показывает пользователю только индексы массива, а не имена файлов, что на самом деле непригодно для использования. Мне было интересно, почему это так, и какие шаги мне нужно предпринять, чтобы мой сценарий правильно выполнял этот раздел.

0
user504898 12 Дек 2021 в 04:00
2
(1) Сценарий неуклюже набран: отсутствует кавычка, FSHOLDER ни с того ни с сего, FARRAY= (*) должно быть FARRAY=(*) и т. д. как вы описали. (2) Когда он, наконец, выйдет из строя так, как вы описали, поместите echo "$SHOLDER" после do и удивитесь.
 – 
Kamil Maciorowski
12 Дек 2021 в 03:34

1 ответ

От help select:

select: select NAME [in WORDS ... ;] do COMMANDS; done

[...] Если строка состоит из числа, соответствующего одному из отображаемых слов, то ИМЯ устанавливается на это слово.

Например.:

$ select foo in abc def; do echo "foo is '$foo'"; break; done
1) abc
2) def
#? 2
foo is 'def'

То есть, если вы выберете файл с именем foo.c, тогда SHOLDER будет установлено в foo.c (не номер файла), и это вызовет арифметическую ошибку, когда массив проиндексировано.

Вероятно, у вас также возникнут проблемы из-за того, что select нумерует варианты, начиная с единицы, а массивы Bash индексируются с нуля.

Вероятно, лучше скопировать и вставить свой код в вопрос здесь, чтобы опечатки не запутали дело. Как и пробелы в ваших заданиях здесь, FARRAY= (*) выдаст синтаксическую ошибку.

2
ilkkachu 12 Дек 2021 в 12:21