기호가 있는 파일을 찾기 위해 명령줄 인수를 사용할 때 예기치 않은 결과가 발생함

기호가 있는 파일을 찾기 위해 명령줄 인수를 사용할 때 예기치 않은 결과가 발생함

나는 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 문제가 의심되며 실제로 수행하려는 작업을 설명하기 위해 질문을 편집하는 것이 좋습니다.

관련 정보