2012-11-28 4 views
4

나는 가장 사소한 작업으로 인해 악몽을 꿉니다.
sqlite3 my_db.db '.read my_file.sql'작은 따옴표로 묶은 가변 값을 포함하는 bash 문자열을 작성하십시오.

여기에 두 어획량이 있습니다 :

내 최종 목표는 bash는 스크립트에서 다음 명령을 실행입니다
1 작은 따옴표 말, 의무, 그리고에 의해 대체 될 수 없다 , 큰 따옴표
2. my_file.sql은 실행시에만 알려진 변수입니다.

그래서 내가 필요로하는 것은 bash가 가변 값을 포함하고 다른 한편으로는 값을 작은 따옴표로 묶어야하는 문자열을 작성하는 방법입니다.

AWK, Perl 등과 같은 추가 도구에 의존하지 않는 솔루션을 선호합니다. 그것이 정말로 필요한 경우에는 아마도 sed.

감사합니다.


감사합니다. Jonathan and Nelson.

세 가지 제안을 모두 시도했지만 모두 실패했습니다.
#!/bin/bash
file=/tmp/1
ls "'"$file"'"
ls \'$file\'
ls "'$file'"

  • :

    1. 내가 다음 스크립트 (tst.sh)를 썼다 : 단순 들어
      나는 다음에 문제를 감소 그럼 나는 다음과 같은 명령을한다. '/tmp/1': No such file or directory

    따옴표가 실제로 추가 된 것
    '/tmp/1': No such file or directory
    $ ./tst.sh
    '/tmp/1': No such file or directory
    /tmp/1
    $ touch /tmp/1
    $ ls '/tmp/1'
    있지만 결과 명령을 수동으로 입력 할 때와 같은 아니었다.

    아이디어가 있으십니까?

  • +3

    작은 따옴표를 사용해야하는 이유는 무엇입니까? 이것은 작은 따옴표 또는 두 개의 인수로 된 하나의 인수가되어야합니다. 하나는 작은 따옴표로 시작하고 다른 하나는 작은 따옴표로 끝납니다. –

    답변

    0

    다음과 같이 수행 할 수 있습니다

    VAR=my_file.sql 
    VAR2="'.read $VAR'" 
    sqlite3 my_db.db $VAR2 
    
    +0

    또는 변수'sqlite3 my_db.db " '.read my_file.sql'"'이 OP가 요구하는 것이지만 이것이 실제로 해결책이라고는 생각하지 않습니다. – tripleee

    0

    이 당신이 (프로그램에 따옴표를 받고)하고 싶은 말을 할 것입니다,하지만 큰 따옴표 사용

    sqlite3 my_db.db "'".read" "my_file.sql"'" 
    

    방지를 큰 따옴표를 쓰면 다음과 같이 쓸 수 있습니다.

    sqlite3 my_db.db \'.read\ my_file.sql\' 
    

    두 번째 인수는가 포함 된 문자열로:

    '.read my_file.sql' 
    

    파일 이름 변수 (file=my_file.sql) 인 경우 : 파일 이름에 공백이 포함 된 경우에는

    sqlite3 my_db.db "'".read" "$file"'" 
    sqlite3 my_db.db \'.read\ $file\' 
    

    이 표기법은 혼란에 취약하다.

    그러나, 나는 당신이 정말 원하는 것을 할 것입니다 생각하지 않습니다. 큰 따옴표에 대한 금지는 수수께끼이며, 작은 따옴표에 대한 요구 사항은 마찬가지로 수수께끼입니다.

    1

    단일 따옴표 하지 의무입니다. 다음 명령은 모두 정확히 같은 인수 sqlite3를 실행 :

    모든 경우에
    sqlite3 my_db.db '.read my_file.sql' 
    sqlite3 my_db.db ".read my_file.sql" 
    sqlite3 my_db.db .read\ my_file.sql 
    sqlfile="my_file.sql" 
    sqlite3 my_db.db ".read $sqlfile" 
    

    , 따옴표 (/ 탈출) 을 분석하고, 인수가 sqlite3를 전달하기 전에 제거됩니다. 이것이 당신이 원하는 것입니다. my_db.db.read my_file.sql : 당신은 sqlite3를 두 개의 인수를 싶어. 당신이 볼 수 있듯이, 단지 sqlite3를 혼란,

    $ sqlite3 my_db.db 
    SQLite version 3.7.7 2011-06-25 16:35:41 
    Enter ".help" for instructions 
    Enter SQL statements terminated with a ";" 
    sqlite> '.read my_file.sql' 
        ...> 
    

    ... :에 해당 될 것이라고 - 당신은 가 sqlite3를 명령 주위에 따옴표를보고 싶어하지 않습니다.

    예를 들어, 이것은 ls 예제의 문제와 동일합니다. ls에 인수의 일부로 작은 따옴표를 전달하므로 이름에 작은 따옴표가있는 파일을 찾고 찾지 못합니다 . 당신은 따옴표를 제거보다는 인수의 일환으로 명령을 전달하는 쉘을 원하는 .

    +0

    고든 고마워 - 그건 내가 몰랐던 중요한 정보 야. 내 질문에, 그때 광범위한 sqlite3 구문, 제목에서 볼 수 있습니다. 나는 나의 마지막 대답이 다른 많은 경우에 도움이 될 것이라고 믿는다. – Ash

    +1

    @ user1860085 : 숨을 깊이들이 쉬며 몇 명의 의견 작성자가 반복적으로 설명하려고했던 것을 이해하십시오 : 잘못된 문제를 해결하고 쉘의 인용 메커니즘을 이해해야합니다. – tripleee

    +0

    그리고이 명쾌한 답변 +1. – tripleee

    -2

    OK, 문제가 해결!

    줄 바꿈 앞에 'eval'명령이 조금 추가되었습니다.
    ls "'$file'"에 : eval ls "'$file'"

    이 일을했다
    그래서, 간단한 예제 스크립트에서 나는 변경했다. 당신은 아마 당신이 따옴표를 원하는 결론에 올 것이다,

    +0

    Aack, 안돼! eval의 주요 목적은 이해할 수없는 버그를 만드는 것입니다. 정확히 무엇을하고 있는지 안다면 안전하게 사용할 수 있습니다. 그러나이 경우는 아닙니다. –

    +0

    두 줄의 따옴표를 제거하는 방법을 보여 주지만, 최종 결과는'ls "$ file"과 동일합니다. – tripleee

    +0

    lol, 죄송합니다. 의도하지 않은 의도가 있습니다 ;-) 당신이 언급 한 eval의 문제가있는 성격에 대해 자세히 설명해 주시고 솔루션 (어떻게 작동하고있는 것 같습니다)을 손상시킬 수 있습니까? – Ash

    0

    user1860085 :-) 모든 replyers에

    감사합니다, 당신은 sqlite3를 명령에 대한 문서를 체크 아웃 경우 어떻게 쉘 취급 시세 및 공백을 알 수 당신의 경우.

    eval sqlite3 my_db.db \'.read $VARIABLE\' 
    

    은 파리에서 변경됩니다 :

    sqlite3 my_db.db '.read my_file.sql' 
    

    그러나 당신이 그것을 할 수있는 이유가 표시되지 않습니다 당신이 정말로 작은 따옴표를 원하는 경우

    하지만, 여기에 솔루션입니다. ..