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 문제가 있는 것으로 의심되며 실제로 하고 싶은 일을 설명하기 위해 질문을 편집하는 것이 좋습니다.