이스케이프 공백이 있는 디렉토리를 변수에 전달하는 방법은 무엇입니까?

이스케이프 공백이 있는 디렉토리를 변수에 전달하는 방법은 무엇입니까?

다음과 같은 작은 test.sh 스크립트가 있습니다.

#!/bin/bash
read -e -p "Enter a Directory: " directory
echo $directory

내가 실행하면 이런 일이 발생합니다.

$ ./test.sh 
Enter a Directory: ~/A\ Directory/
/Users/<username>/A Directory/

프로그램 출력이 다음과 같도록 해당 변수 내에 이스케이프 공간을 유지할 수 있기를 원합니다.

$ ./test.sh 
Enter a Directory: ~/A\ Directory/
/Users/<username>/A\ Directory/

이 작업을 수행하는 방법을 아는 사람이 있나요? 그 목적은 읽어야 하는 파일을 어디서 찾을 수 있는지 스크립트에 알려주는 것입니다.

편집: 두 번째와 세 번째 코드 선택에 \를 넣는 것을 잊었습니다.

답변1

변수에 보존할 이스케이프 공간이 없습니다. 프롬프트에 를 입력하면 ~/A Directory/변수에 가 directory포함됩니다 ~/A Directory/. 나중에 스크립트에서 이 공백에 문제가 발생하면 그 이유는 다음과 같습니다.변수 확장 주위에 큰따옴표를 잊어버렸습니다..

read -e -p "Enter a Directory: " directory
ls -- "$directory"
cd -- "$directory"

--값이 로 시작 하면 -옵션으로 간주되지 않습니다.

어떤 이유로 공백 앞에 백슬래시를 추가하려는 경우 다음을 사용할 수 있습니다.bash 문자열 조작 함수.

echo "${directory// /\\ }"

그러나 이것은 유용하지 않을 것 같습니다. 디렉토리를 다시 구문 분석된 형식으로 인쇄해야 하는 경우에는 인용해야 할 다른 문자가 분명히 있을 것입니다. 어떤 문자는 구문 분석 대상에 따라 다르지만 최소한 탭(및 줄 바꿈, 스크립트는 읽을 수 없음)을 따옴표로 묶어야 하며(공백인 경우) 백슬래시도 따옴표로 묶어야 합니다. Bash에서는 이 작업을 수행하는 편리한 방법이 없습니다. sed를 사용할 수 있지만 데이터를 전달할 때 주의하십시오.  echo수정되지 않은 모든 인수는 인쇄되지 않습니다. 난이도가 높아지는 명령 대체는 후행 개행 문자를 제거하지만 여기에는 개행 문자가 없습니다.

quoted_directory=$(printf %s "$directory" | sed 's/[\\ '$'\t'']/\\&/')

또한 처음에는 물결표를 확장할 수 있는 항목이 없습니다. (당신이 보여주는 출력은 가짜입니다. 당신은 장난하고 있습니다!) 물결표 확장은 변수 값이 확장될 때가 아니라 소스 코드 구문 분석 중에만 발생합니다. 초기 물결표를 홈 디렉터리로 바꾸려면 수동으로 수행해야 합니다.

read -e -p "Enter a Directory: " directory
if [[ $directory = \~/* ]]; then
  directory="$HOME/${directory#*/}"
fi
ls -- "$directory"
cd -- "$directory"

답변2

모든https://askubuntu.com/a/344418,

따라서 IFS 변수를 지우십시오.

   IFS=$'\n'       # make newlines the only separator

그런 다음 스크립트를 계속 진행하세요.

답변3

다음을 시도해 볼 수 있습니다.

예 1: 귀하의 답변.

#!/bin/bash
read -e -p "Enter a Directory: " directory
new_directory="$(echo $directory | sed 's/ /\\ /g')"
echo $new_directory

cd예 2: 출력을 스크립팅 하려면 큰따옴표로 묶습니다.

#!/bin/bash
read -e -p "Enter a Directory: " directory
new_directory=\"$directory\"
echo $new_directory

관련 정보