GNU/Linux >> Znalost Linux >  >> Linux

Escape znak hvězdičky (*) v bash

  1. Náhrady proměnných vždy umístěte do dvojitých uvozovek, jinak znaky jako mezery a * objevující se v hodnotě jsou interpretovány shellem. Napište "$c" , nikoli $c .

  2. Syntaxe mysql <"$c" dělá mysql spouštět příkazy ze souboru, jehož název má hodnotu $c . To, co hledáte, je

    printf '%s\n' "$c" | mysql
    

    nebo jednodušší, pokud si pamatujete omezení ($c nesmí začínat - a pokud obsahuje \ to je v pořádku v bash, ale ne v některých jiných variantách sh)

    echo "$c" | mysql
    

    Existuje další alternativa, která je pohodlnější, pokud je příkaz víceřádkový. Říká se tomu „dokument zde“. Řetězec EOF není speciální (ačkoli je tradiční), postačí jakákoli sekvence písmen a číslic. Ukončovací EOF nemusí ne předcházet mezery. Musíte zadat \ před každým $ , \ a ` pokud nechcete, aby byly interpretovány shellem.

    mysql <<EOF
    GRANT ALL ON *.* TO '$1'@'localhost';
    EOF
    
  3. Pozor, pokud argument shellu obsahuje jedinou uvozovku, máte injektážní vektor. Následující fragment přidá \ před každým \ a ' .

    set -- "${1//\\/\\\\}"
    set -- "${1//\'/\'}"
    

    To je docela ošklivé, a proto, pokud se chystáte dělat něco složitého, zapomeňte na použití shellu a použijte jazyk se skutečnými vazbami SQL (perl, python, cokoliv), kde za vás všechny citace a vytváření procedur zpracovává knihovna. .


Pro řetězec použijte jednoduché uvozovky:

c='GRANT ALL ON *.* TO';
c="${c} '$1'@'localhost';";

Pravděpodobně existuje lepší způsob, jak to udělat, ale zahrnutím $ 1 do řetězce to bylo divné


To bude fungovat v bash, není nutné žádné escapování

#!/bin/bash
mysql -u root -e "GRANT ALL ON *.* TO '$1'@'localhost'"
exit 0;

Linux
  1. Proč nemohu uniknout mezerám ve skriptu Bash?

  2. Spusťte příkaz bash na jenkins pipeline

  3. echo znak nového řádku nefunguje v bash

  1. Bash skriptování (I)

  2. Je možné získat postavu na terminálovém kurzoru pomocí únikových kódů Ansi?

  3. Řazení v bash

  1. Proměnná exportu Bash

  2. Bash čeká příkaz

  3. Přemapujte Ctrl-A na obrazovce GNU