Supposons que j'ai un script nommé dd.sh et que je l'exécute comme ceci
./dd.sh sample$name.mp4
Donc, $1
est la chaîne sample$name.mp4
.
echo '$1' // shows $1
echo "$1" // shows sample.mp4
Ensuite, comment traiter $1
afin que je puisse détecter s'il existe un signe dollar dans le paramètre $1
Je veux traiter la chaîne en sample\$name.mp4
ou simplement détecter s'il y a un signe dollar dans le paramètre $filename
Comme vous le savez, un signe dollar indique une variable. Vous devez en tenir compte lorsque vous le tapez.
Vous pouvez échapper au dollar
./dd.sh "sample\$name.mp4"
ou tapez-le simplement avec des guillemets simples
./dd.sh 'sample$name.mp4'
Pour vérifier s’il existe un signe dollar dans une variable, faites
[[ $variable == *\$* ]] && echo 'I HAZ A DOLAR!!!' || echo 'MEH'
Votre problème ne concerne pas la echo
mais l'affectation à $filename
.
Vous dites
filename="sample$name.mp4"
Cela interpolera la chaîne, ce qui signifie développer la variable $name
. Cela donnera à $filename
la valeur sample.mp4
(puisque $name
est probablement indéfini, ce qui signifie qu'il se développe en une chaîne vide)
Utilisez plutôt des guillemets simples dans l'affectation:
filename='sample$name.mp4'
echo "$filename"
donnera maintenant le sample$name.mp4
attendu. De toute évidence, echo '$filename'
imprimera toujours simplement $filename
à cause des guillemets simples.
Si votre question est:
Ensuite, comment traiter 1 $ que je peux détecter s’il ya un dollar paramètre de connexion $ 1
Vous pouvez essayer ceci:
if [[ $1 == *'$'* ]]
then
echo '$ was found'
else
echo '$ was not found'
fi
Sortie:
$ ./dd.sh 'sample$name.mp4' // prints $ was found
$ ./dd.sh 'samplename.mp4' // prints $ was not found
J'ai réussi à le faire fonctionner en doublant simplement le dollar comme ça.
@echo 'export PATH=$$PATH:/usr/local/go/bin' >> $(BASHFILEPATH)
qui a abouti à
export PATH=$PATH:/usr/local/go/bin
dans mon fichier bash
Par exemple, vous avez le fichier .env avec les variables et le mot de passe pour la base de données postgres. Comme vous le savez, le mot de passe doit être codé par l'url bien sûr % chanter en mot de passe. Nous avons donc un problème ici. Parce que BASH ignore $ et nous obtenons toujours un mot de passe incorrect pour encoder.
DB_NAME = sone_db DB_PASS = A1 $ Bb%! Y $ # avec signes dollar ...
#!/bin/bash PSQL_COMMAND = "Schéma DROP public CASCADE;" PSQL_COMMAND + = "CREATE schema public;" set -o allexport # définir le fichier source et avoir accès à toutes les variables de .env source /path/.env ENCODED_PASS = $ (python -c "depuis urllib.parse, importez le devis; print (quote ('$ DB_PASS'))"); psql postgres: // $ DB_USER: $ ENCODED_PASS @ $ DB_Host: 5432/$ DB_NAME -c "$ PSQL_COMMAND" echo $ DB_PASS # renvoie A1%! Y $ echo '$ DB_PASS' # renvoie $ DB_PASS echo "$ DB_PASS" # renvoie A1%! Y $ # désactive les variables set + o allexport # Ne fonctionnera pas car BASH trouve $ sing dans une chaîne et pense que c'est variable, donc dans le premier et dernier écho partie manquante $ Bb%
Pour résoudre ce problème, vous devez utiliser la chaîne d'échappement de fichier .env entre guillemets simples.
... DB_PASS = 'A1 $ Bb%! Y $' ...