2017-12-24 13 views
0

예를 들어 문자열에 ${variable1}${variable2}이 포함 된 문자열이 있습니다.bash는 scala에서와 유사합니다.

"select * from table where product ='${variable1}' and name='${variable2}'" 

eval을 사용하여 런타임에 bash에서 문자열을 평가할 수 있습니다. 다음은 select * from table where product='iphone' and name='apple'

어떻게 스칼라에서 동일한을 달성하기 위해 회전

export variable1="iphone" 
export variable2="apple" 
sql_query=`eval echo ${sql_query}` 

? 현재 문자열 바꾸기 함수를 사용하고 있습니다.

다른 방법이 있습니까? 스칼라에 eval이 있습니까?

+2

수동으로 SQL 문에 매개 변수를 인용의 LANG 무엇이든, SQL 주입 – cchantep

답변

0

문자열 삽입 정보를 파헤쳐 야합니다.

val input="select * from table where product='${variable1}' and name='${variable2}'" 

val variable1 = "iphone" 
val variable2 = "apple" 

val sql_query = StringContext(input.split("\\$[^}]+}"): _*).s(variable1,variable2) 
//sql_query: String = select * from table where product='iphone' and name='apple' 

이 기능을 사용하려면 입력 문자열에서 참조되는 변수와 개수를 미리 알아야합니다. 당신이 코드를 작성하는 새로운 것이 명백 의견으로 판단


UPDATE

. 또한 상황과 요구 사항을 잘 설명하지 않았습니다. 아마도 영어로 된 경험이 부족하기 때문일 것입니다.

참조 된 변수 이름을 현재 쉘 환경의 String 값으로 바꾸고 싶습니다.

아마도 이와 같은 것일 수 있습니다.

val exampleStr = "blah '${HOME}' blah '${SHELL}' blah '${GLOB}' blah" 

val pattern = "\\$\\{([^}]+)}".r 

pattern.replaceAllIn(exampleStr, s => 
        System.getenv.getOrDefault(s.group(1),"unknown")) 
//res0: String = blah '/home/me' blah '/bin/bash' blah 'unknown' blah 
+0

사전에 변수가 있어야합니다.하지만 bash에서이 작업을 수행 할 다른 방법은 없습니까? –

+0

현재 모든 system.getenv를 키 값 쌍으로 가져오고 루핑 및 바꾸기 때문에 모든 변수를 확인해야하므로 매우 느립니다. –

+0

((k, v) <- System).("$"+ "{"$ "+"$ "+"}) { if (getFromMeta (sc, sq, workFlow, compName, compParam, env, busDate, toEmail, fromEmail) ' ")) { evalResult = getFromMeta (sc, sq, workFlow, compName, compParam, env, busDate, toEmail, fromEmail) .toString.replace ("'$ "+"{ "s"$ k "+"}) ' ","' "+ s"$ v "+" ' ") } –

0

스칼라에서 '문자열 보간'이라는 기능을 설명하고 있습니다. 문자열 보간을 사용하려면 스칼라 문자열 앞에 s 접두어를 사용하십시오.

$ scala 
Welcome to Scala 2.12.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_151). 
Type in expressions for evaluation. Or try :help. 

scala> val variable1 = "iphone" 
variable1: String = iphone 

scala> val variable2 = "apple" 
variable2: String = apple 

scala> val sql_query = s"select * from table where product ='${variable1}' and name='${variable2}'" 
sql_query: String = select * from table where product ='iphone' and name='apple' 
+0

의 원인이 (SQL을 상상 테이블에서 선택 * 어디 제품 = '$ {변수 1}'이름 = '$ {변수 2} ') 값으로 파일에서 오는 경우, 내 경우에 SQL은 문자열이 아니라 파일에서 읽어야하는 값입니다. –

+0

val sql_query = getFromMetadata (function_arguments .....), 그런 다음 sql_query 변수에 값 (select * from table where $ {....}) 등이 있습니다. , getFromMetadata (function_arguments .....) replace ("$", "") .replace ("{variable1}", iphone) 예 : –

+0

파일에서 문자열을 읽는 것과 관련된 문제는 언급하지 않았습니다. 대신 고정 된 문자열을 설명했습니다. 이 대답을 수락하십시오. 수정 된 질문에 대해서는 문자열 대체 만하면되며 JVM에서는이를위한 많은 옵션을 제공합니다. 그것에 대한 도움이 필요하면 새로운 질문을 만드십시오. 나는 물어 본 질문에 대답했다. –