In:
dirs="
$HOME/Documents
$HOME/Music
"
Вы присваиваете строку (содержащую пробелы, символы новой строки и любые символы, которые может содержать $HOME
) скалярной переменной ($dirs
).
Затем вы хотите передать список каталогов в ls
, то есть несколько аргументов. Поэтому вам нужно как-то разделить эту строку на список аргументов для передачи в ls
. Как вы собираетесь разделить ее? На пробелы и новые строки? Что если $HOME
содержит пробелы или новые строки?
В оболочках POSIX есть оператор разбиения, точнее, оператор split+glob, который вы вызываете, оставляя переменную без кавычек. К счастью, по умолчанию разделение выполняется по пробелу и новой строке (и табуляции). Так что вы можете сделать:
IFS=' ''
' # space and newline
set -f # disable globbing as we want only the
# splitting part of the split+glob operator
ls -- $dirs
Но здесь, поскольку нам нужен список, лучше всего хранить элементы в переменной типа списка, а не объединять их в строку, чтобы потом разделить ее.
В оболочках POSIX есть массив позиционных параметров ($1
, $2
... ) для этого:
#! /bin/sh -
set -- ~/Documents ~/Music
ls -- "$@"
Или, если вы не против сделать ваш скрипт медленнее и менее переносимым, используйте оболочку с переменными массива, например bash
:
#! /bin/bash -
files=(
~/Documents
~/Music
)
ls -- "${files[@]}"
Или zsh
:
#! /bin/zsh -
files=(
~/Documents
~/Music
)
ls -- $files