Неожиданный результат при использовании аргументов командной строки для поиска файла с символом

Неожиданный результат при использовании аргументов командной строки для поиска файла с символом

Я пытаюсь написать скрипт, который принимает 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, и предлагаю вам отредактировать свой вопрос, чтобы объяснить, что вы на самом деле пытаетесь сделать.

Связанный контент