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

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

2개의 명령줄 인수를 허용하는 스크립트를 작성하려고 합니다. 예를 들어 하나는 디렉터리 이름이고 다른 하나는 기호(모든 기호는 $, £, ^, * 등일 수 있음)입니다. 그런 다음 디렉토리에 기호가 포함된 파일 이름이 있는지, 기호가 디렉토리에 추가되지 않았는지 확인해야 합니다.

testDir따라서 첫 번째 인수로 명명된 디렉터리를 찾고 a를 *두 번째 인수로 사용하면 해당 디렉터리의 파일을 검사하여 해당 기호가 파일에 있는지 확인하고, 그렇지 않은 경우 해당 디렉터리를 호출합니다. 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 문제가 있는 것으로 의심되며 실제로 하고 싶은 일을 설명하기 위해 질문을 편집하는 것이 좋습니다.

관련 정보