Intereting Posts
Как настроить zsh для отображения скрытых файлов и папок? Сделайте ссылку на файл, чтобы среда могла его найти. Использование ls с командой wc Как я могу узнать, кто изготовил мою графическую карту (в отличие от GPU)? Как заставить gvfs-unmount мертвое монтирование SSH на Linux Mint 16 (Petra)? dnsmasq использует много портов надежный код возврата фонового процесса Debian – нет проводного подключения после перезагрузки Как Solaris находит справочные страницы? i3wm: переключение в рабочие пространства и перемещение контейнера на (одну и ту же) карту рабочего пространства в разные рабочие пространства Как добавить автозаполнение для «драгоценного камня», которое с помощью rbenv? HP-UX – Невозможно использовать backspace для подключения ssh rsync список каталогов с абсолютным путем в текстовом файле CentOS 7: Странные каталоги, появляющиеся в / Понимание того, как пространства имен монтирования работают в Linux

Как предотвратить перемещение символов в переменной среды?

Извините заранее, если мой вопрос слишком прост, но я действительно застрял здесь.

Я пытаюсь написать сценарий оболочки и сделать его более или менее читаемым, я решил внести часть своих команд в переменные среды:

#!/bin/bash # Variables name_expression="-type d \( -name .folder1 -o -name .wildcardfolder* -o -name .folder2 \)" # Commands find /root/ -maxdepth 1 "$name_expression" -execdir rm -rf {} \; find /home/ -maxdepth 2 "$name_expression" -execdir rm -rf {} \; 

Проблема в том, что, если я пытаюсь запустить эту оболочку, многие символы завернуты кавычками:

 bash -x ./my_shell.sh + name_expression='-type d \( -name .android -o -name .AndroidStudio* -o -name .gradle \)' + find /home/ /root/ -maxdepth 2 '-type d \( -name .folder1 -o -name .wildcardfolder* -o -name .folder2 \)' -execdir rm -rf '{}' ';' find: unknown predicate `-type d \( -name .folder1 -o -name .wildcardfolder* -o -name .folder2 \)' 

Есть ли способ передать эту переменную без изменения?

 name_expression=( -type d \( -name .folder1 -o -name .wildcardfolder\* -o -name .folder2 \) ) find /root/ -maxdepth 1 "${name_expression[@]}" -execdir rm -rf {} \; 

Вместо строкового параметра, который должен быть некорректным, чтобы команда могла видеть несколько частей, используется параметр массива. Таким образом можно управлять и расщеплением, и котировкой (не полностью, т.е. на часть, но подходящим способом для этой задачи).

Альтернативой, которая позволяет полностью контролировать, было бы использование eval но это сделало бы остальную часть командной строки более сложной.

Модифицированная версия, которая позволяет избежать потенциально опасных расширений глобуса:

 cleanupdir() { # args should be dirname, maxdepth find "$1" -maxdepth "$2" -type d \( -name .folder1 -o -name '.wildcardfolder*' -o -name .folder2 \) -execdir rm -rf {} \; } cleanupdir /root 1 cleanupdir /home 2