web-dev-qa-db-fra.com

Échapper au signe dollar dans la chaîne par le script shell

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

19
biubiubiu

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'
35
pacholik

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.

2
Kusalananda

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
1
Ajeet

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

0
Nick Kotenberg

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.

fichier .env


 DB_NAME = sone_db 
 DB_PASS = A1 $ Bb%! Y $ # avec signes dollar 
 ...

script bash


 #!/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 $' 
 ...

0
Sergey Kozlovskiy