Как упоминалось Джонатаном Леффлером, вы можете сделать это с помощью массива.
my_array=("file1.txt" "second file.txt" "file3.txt")
cat "${my_array[1]}"
индексировать массива начинается с 0. Таким образом, если вы хотите cat
первый файл в вашем массиве вы бы использовать индексный номер 0. "${my_array[0]}"
. Если вы хотите запустить свою команду для всех элементов, замените номер индекса на @
или *
. Например, вместо "${my_arryay[0]}"
вы должны использовать "${my_array[@]}"
Убедитесь, что вы приводите массив или обрабатываете любое имя файла пробелами в виде отдельных файлов.
Альтернативно, если по какой-либо причине цитирование массива является проблемой, вы можете установить IFS (который обозначает внутренний разделитель полей), чтобы он соответствовал новой строке. Если вы это сделаете, рекомендуется сохранить IFS по умолчанию в переменную перед ее изменением, чтобы вы могли вернуть ее так, как только она завершилась. Например:
# save IFS to a variable
old_IFS=${IFS-$' \t\n'}
#set IFS to a newline
IFS='$\n'
# run your script
my_array=("file1.txt" "second file.txt" "file3.txt")
cat ${my_array[1]}
# restore IFS to its default state
IFS=$old_IFS
Возможно, лучше не вмешиваться в IFS, если вам не нужно. Если вы можете процитировать массив, чтобы заставить ваш скрипт работать, тогда вы должны это сделать.
Для гораздо более глубокого взгляда на использование массивов см:
Не используйте переменную; используйте массив: 'ARGS = (" file1.txt "" второй файл.txt "" file3.txt ")', а затем передайте его: '" $ {ARGS [@]} "'. –
Если параметры находятся в текстовом файле, а разделитель между аргументами - это пробел, я не понимаю, почему вы считаете поведение, которое вы считаете неправильным. Я имею в виду, что я могу видеть, что вы хотели бы сделать, но тогда чтение аргументов, разделенных пробелами, из текстового файла, вероятно, является неправильным решением. Возможно, вы используете какой-то структурированный формат файла, если ваши потребности сложны. – tripleee