다음과 같은 작은 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