L'analyse des fichiers avec shell est assez pénible. Vous pouvez faire de votre mieux pour écrire à l'aide d'expressions régulières, mais la plupart du temps, vous oubliez le contenu. Il y a eu un cas où j'ai pu me sortir du problème des expressions régulières à l'aide de modules python. C'est le record de l'époque.
Utilisez la documentation d'entendre de bash pour verser du code python dans des commandes python.
shellscript
python <<EOF
#code python
EOF
Je n'écrirai pas sur le document d'entendre de bash ici. Si vous voulez en savoir plus, veuillez vérifier par vous-même.
Voici un exemple.
C'est un script shell qui utilise le module configparser
de python pour analyser le fichier de configuration de mysql et se connecter à MySQL.
connect_mysql.sh
#!/usr/bin/env bash
#
# Connect to MySQL
declare -r COLOR_RED="\e[33;41;1m"
declare -r COLOR_OFF="\e[m"
declare -r DB_CONFIG_PATH='path/to/database.conf'
# check file exists or not
if [ ! -f "${DB_CONFIG_PATH}" ]; then
echo -e "${COLOR_RED}[error] \"${DB_CONFIG_PATH}\" does not exist.${COLOR_OFF}"
exit 1
fi
declare -r SECTION=$1
# check argument
if [ -z "$SECTION" ]; then
echo -e "${COLOR_RED}[error] Please set section name as command argument.${COLOR_OFF}"
exit 1
fi
#######################################
# Parse DB config by python
# Globals:
# DB_CONFIG_PATH
# SECTION
# Arguments:
# None
# Returns:
# None
#######################################
function parse_ini_file () {
python3 <<'EOF' - "${DB_CONFIG_PATH}" "${SECTION}"
import sys
import configparser
file_path = sys.argv[1]
section_name = sys.argv[2]
config = configparser.ConfigParser()
config.read(file_path)
try:
details = config[section_name]
except KeyError:
sys.exit(1)
db_option = \
'[client]\\nhost={host}\\nport={port}\\ndatabase={database}\\nuser={user}\\npassword={password}\\n'\
.format(\
host=details['host'],\
port=details['port'],\
database=details['database'],\
user=details['user'],\
password=details['password']\
)
sys.stdout.write(db_option)
sys.exit(0)
EOF
}
db_option=$(parse_ini_file)
if [ $? -ne 0 ]; then
echo -e "${COLOR_RED}[error] Section \"${SECTION}\" does not exist in config file.${COLOR_OFF}"
exit 1
fi
mysql --defaults-extra-file=<(echo -e ${db_option})
Il semble que vous puissiez faire quelque chose comme argument de nom de fichier python 1 argument 2
même dans le document d'audience en faisant ce qui suit.
python3 <<'EOF' - "${DB_CONFIG_PATH}" "${SECTION}"
...
EOF
J'espère que cela aide quelqu'un.
Recommended Posts