;
어떻게 탈출 하거나 에코 할 수 있나요 ()
? ""
이 명령을 에코하고 싶습니다
"LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 partition (ds='$TGLS', periode='$WKTS');"
syntax error near unexpected token
하지만 아래와 같이 작은따옴표를 이스케이프 처리하여 명령을 변경했는데도 }'' 라고 표시됩니다.
'LOAD DATA INPATH '"'"$i"'"' INTO TABLE transient.url_log_201803 partition (ds='"'"$TGLS"'"', periode='"'"$WKTS"'"');'
해당 명령을 터미널이나 파일에 에코하는 방법을 모르겠습니다. 나는 또한 이것을 탈출하기 위해 시도했지만 \
아무것도
답변1
복잡한 데이터를 사용하려고 하지 마세요 echo
.
다음은 여기 문서를 사용합니다.
cat <<END_SQL
LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL
다음 명령으로 파이프해야 하는 경우 mysql
(이것은 Hive SQL 명령이지만 Hive 클라이언트가 일반적으로 무엇이라고 불리는지 모르므로 mysql
예제에서는 이를 사용합니다):
cat <<END_SQL | mysql
LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL
변수를 확장하지 않고 전달해야 하는 경우:
cat <<'END_SQL' | mysql
LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL
여기에 있는 문서를 사용하면 더 읽기 쉬운 코드(짧은 줄)를 작성할 수도 있습니다.
cat <<'END_SQL' | mysql
LOAD DATA INPATH '$i'
INTO TABLE transient.url_log_201803
PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL
문서 내용과 (더 중요한) 닫는 태그( END_SQL
위)는 들여쓰기하면 안 됩니다.
for ...some loop range...; do
cat <<END_SQL | mysql
LOAD DATA INPATH '$i'
INTO TABLE transient.url_log_201803
PARTITION (ds='$TGLS', periode='$WKTS');
END_SQL
done
닫는 태그가 들여쓰기되어 있으면 쉘은 이를 찾지 못하며 여기에서 파일 끝에서 문서가 종료된다는 오류 메시지를 받게 됩니다.
답변2
변수 확장을 방지하려면 $
로 이스케이프해야 합니다 \
. 변수가 작은따옴표로 묶여 있으므로 불필요한 것처럼 보이지만 작은따옴표를 큰따옴표로 묶으면 작은따옴표가 문자 그대로 해석됩니다.
$ echo "LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 partition (ds='$TGLS', periode='$WKTS');"
LOAD DATA INPATH '' INTO TABLE transient.url_log_201803 partition (ds='', periode='');
이스케이프 변수:
$ echo "LOAD DATA INPATH '\$i' INTO TABLE transient.url_log_201803 partition (ds='\$TGLS', periode='\$WKTS');"
LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 partition (ds='$TGLS', periode='$WKTS');
전체 내용을 큰따옴표로 묶으려는 경우:
$ echo "\"LOAD DATA INPATH '\$i' INTO TABLE transient.url_log_201803 partition (ds='\$TGLS', periode='\$WKTS');\""
"LOAD DATA INPATH '$i' INTO TABLE transient.url_log_201803 partition (ds='$TGLS', periode='$WKTS');"
답변3
다음을 사용하면 괄호나 세미콜론을 이스케이프 처리할 필요가 없습니다 echo
.
$ echo "Semicolons look like ';'. Parens look like '(' and ')'."
Semicolons look like ';'. Parens look like '(' and ')'.