Не вызывайте ls
в обратных кавычках, когда подстановочный знак будет работать и является более надежным, то есть:
for file in "$1"/*; do
Расширения переменных должныбыть внутри в кавычках, или все это будет падать на любой специальный символ, включая пробел.Вы должны использовать "$1"
, "$2"
и "$1/$file" "$2/$file"
.
Переменные являются глобальными в оболочке по умолчанию.Таким образом, рекурсивный вызов перекрывает переменную file
внешнего вызова.Существует два возможных обходных пути:
Объявите переменную local с
local file
в начале функции.Это "bashishm" , то есть он не определен стандартом оболочки POSIX, поэтому у некоторых оболочек его нет.
Оберните функцию в круглые скобки вместофигурные скобки.Это заставит функцию работать в подоболочке, которая не может обрезать переменные своих родителей.
О, вам не нужны param1
и param2
.Позиционные параметры ограничены.
Уильям Пьюзель (см. Другой ответ) замечает еще одну вещь. Либо перейдите в каталог аргументов , либо добавьте его к пути, но не делайте оба.
Со всеми исправлениями, которые вы должныдоберитесь до:
recursive() (
mkdir -p "$2"
for file in "$1"/*; do
[ "$file" = "." -o "$file" = ".." ] && continue
[ -d "$file" ] && recursive "$1/$file" "$2/$file"
[ -f "$file" ] && ln -s "$1/$file" "$2/$file"
done
)
recursive "$1" "$2"
Я не проверял это, таким образом, все еще могут быть некоторые проблемы.