2012-08-15 11 views
38

Necesito pasar una cadena a un programa como su argumento de la CLI Bash, por ejemplo¿Cómo afecta el signo de dólar principal a las comillas simples en Bash?

program "don't do this" 

La cadena puede incluir cualquier carácter como '$', '\', etc., y no quiero hacer ninguna Bash modificación. Así que pienso en usar comillas simples.

Sin embargo, el siguiente no funciona:

program 'don\'t do this'   //escape doesn't work in single quote 

Mientras que las dos obras siguientes:

program $'dont\'t do this'   //seems fine, but any other side effects? 
program 'dont'\''do this'   //breaking into 3 parts 

El primer enfoque parece mejor en la que adquiere menos de modificación pre (poner el símbolo del dólar frente y sustituye cada \ a \\), pero no sé qué más podría hacer el DOLLAR SIGN.

Realmente Googled esto, pero no puedo encontrar lo que necesito ...

+4

Para comprender mejor el ejemplo '$ '...' ', eche un vistazo al primer párrafo de [página de información de bash] (http://www.gnu.org/software/bash /manual/html_node/ANSI_002dC-Quoting.html#ANSI_002dC-Quoting) – suvayu

+0

Gracias por publicar esta pregunta. Es crucial para entender cómo alinear los registros delimitados por tabuladores (es decir, 'cat myData.tsv | column -t -s $ '\ t'') –

Respuesta

48

Se hace que las secuencias de escape para ser interpretados.

$ echo $'Name\tAge\nBob\t24\nMary\t36' 
Name Age 
Bob  24 
Mary 36 

(Y SO se encarga de pestañas de una manera tonta, así que vamos a ver este en casa)

+0

+1 buena captura.Supongo que esto sucede porque los nombres de las variables se expanden? –

+0

No, esto sucede porque es un comportamiento definido para '$ '...''. –

+0

Esto es exactamente lo que necesito si esto es todo $ ''! – user1206899

18

Usando $ como prefijo indica a Bash que tratar de encontrar una variable con ese nombre. $' es una sintaxis especial (fully explained here) que habilita el procesamiento de cadenas ANSI-C. En este caso, el tic no es "tomar el valor literal hasta el siguiente tic single". Debería ser bastante seguro de usar. Los inconvenientes son que es BASH solamente y bastante poco común, por lo que muchas personas se preguntarán qué significa.

La mejor manera es utilizar comillas simples. Si necesita una comilla simple en una cadena, debe reemplazarla por '\''. Esto finaliza la cadena de comillas simples anterior, le agrega una comilla simple (\') y luego inicia una nueva cadena entre comillas simples. Esta sintaxis funciona con cualquier descendiente del Bourne shell, es bastante fácil de entender y la mayoría de las personas reconoce rápidamente el patrón.

La alternativa es volver a colocar cada tilde sola con '"'"' que se traduce como "terminar una cadena entrecomillada actual, anexar cadena entre comillas dobles que contiene un solo tilde, reiniciar una cadena entre comillas simples". Esto evita el carácter de escape y se ve muy bien simétrico. También funciona al revés si necesita una comilla doble en una cadena con comillas dobles: "'"'".

+0

sí, es la forma correcta – user1206899

+2

También es común ver ''"' "''. por ejemplo '' the dog '"'" 's tail'' –

+0

$' SHELL 'y $' LANG '* no * "fallarán". El signo de dólar en $ 'tiene una función diferente. Diría que "\" es * una * forma correcta. – jox

-1

Usted no encontrará una manera más rápida o más eficiente que:

eval RESULT=\$\'$STRING\' 

Por un lado, este es el tipo de cosa que eval está ahí para, y que se evite el costo de una locura que se bifurcan subproceso en todas partes, como parecen indicar las respuestas anteriores. Su ejemplo:

$ foo='\u25b6' 
$ eval bar=\$\'$foo\' 
$ echo "$bar" 
▶ 
+0

Esto es un malentendido de lo que significa la sintaxis en Bash. '$ '...'' es una [cadena de estilo C] (http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting) que obedece a diferentes reglas de cotización que las cadenas normales, como se describe en las otras respuestas en esta página. – tripleee

Cuestiones relacionadas