Search code examples
mysqlbashdockerpasswordsescaping

Escaping out password variable with special characters for mysqldump


I'm trying to create a shell script to automatically backup my whole database. My script expects the password in a new line because I don't want to store it anywhere. Here is my code:

#!/bin/bash
echo -n Password:
read -s PASS
echo
docker exec db /usr/bin/mysqldump --all-databases -u admin --password='\''$PASS\'' > backup-$(date "+%Y-%m-%d").sql

The problem is, that I need to put the variable into single quotes because of the $ signs in the password, but I can't read variables in single quotes. I know there are several similar questions out there, but I could not solve is with them.

So if the password is '$ecretPa$$word', then the actual executed program should be something like this:

docker exec db /usr/bin/mysqldump --all-databases -u admin --password='$ecretPa$$word' > backup-2020-03-03.sql

Solution

  • I managed to make this work. Maybe the problem was not with the escaping but with the way I tried to run this. My final code:

    #!/bin/bash
    echo -n Password:
    read -s PASS
    echo
    cmd="docker exec db /usr/bin/mysqldump --all-databases -u admin --password='$PASS' > backup-$(date "+%Y-%m-%d").sql"
    eval "$cmd";