Я пытаюсь написать скрипт, который принимает 2 аргумента командной строки, например, один - имя каталога, другой - символ (любой символ может быть $,£,^,* и т. д.). Затем он должен проверить, есть ли в каталоге имя файла с этим символом, и если нет, то добавить этот символ в каталог.
Таким образом, если бы я искал каталог, названный testDir
в качестве первого аргумента, и имел *
в качестве второго аргумента, он бы проверял файлы в этом каталоге, чтобы увидеть, есть ли этот символ в файле, и если бы его не было, каталог теперь назывался бы testDir*
.
Вот фрагмент кода, который я пытаюсь разработать.
a1=$1
symbol=$(ls $a1 | grep $2)
if [ "$symbol" != "" ]
then
echo "file has Symbol"
else
echo "The symbol was added to directory"
mv $a1 $1$2
fi
Кажется, с @
символом все работало нормально, так что я думаю, что это было вызвано специальными символами. Есть ли способ попробовать экранировать специальные символы, но также работать с неспециальными символами?
решение1
Прежде всего, этоникогда не бывает хорошей идеейдля анализа вывода ls
при поиске имен файлов. Это сломает любой странный символ, включая простой пробел. Лучший способ обойти это — использоватьподстановка оболочкиили find
вместо этого.
Ваша следующая проблема в том, что вы не заключаете переменные в кавычки, что означает, что специальные символы раскрываются до mv
запуска команды. Рабочий пример вашего скрипта будет таким:
#!/usr/bin/env bash
if find "$1" -print0 | grep -z "$2" >/dev/null
then
echo "file has Symbol"
else
echo "The symbol was added to directory"
echo mv "$1" "$1$2"
fi
ПРЕДУПРЕЖДЕНИЕ: Я понятия не имею, зачем вам это нужно. Например, это может привести к попытке переместить каталог в подкаталог самого себя, и это не удастся. Я подозреваю, что здесь проблема XY, и предлагаю вам отредактировать свой вопрос, чтобы объяснить, что вы на самом деле пытаетесь сделать.