2013-05-07 13 views
7

Ho appena visto "$$ {x} %% *" in un makefile, che significa "$ {x} %% *" in sh. Perché è scritto in questo modo?

https://unix.stackexchange.com/questions/28994/how-can-a-makefile-detect-whether-a-command-is-available-in-the-local-machine

determine_sum = \ 
     sum=; \ 
     for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do \ 
      if type "$${x%% *}" >/dev/null 2>/dev/null; then sum=$$x; break; fi; \ 
     done; \ 
     if [ -z "$$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi 

checksums.dat: FORCE 
    $(determine_sum); \ 
    $$sum *.org 

Inoltre, come per cercare ${x%% *} in Google?

+1

Google "bash man page" – Barmar

+0

Google "how to google bash expression" :) "Tutti i problemi CS possono essere risolti con un ulteriore livello di riferimento indiretto" –

risposta

0

${x%% *} è un bel modo per eliminare tutto tranne la prima parola nella variabile $x. Cioè, dato un testo XXX YYY ZZZ, questa sintassi cancellerà tutto dopo il primo spazio.

Alcuni esempi:

$ x="aaa abbb" 
$ echo ${x%% *} 
aaa 

$ x="aaa abbb bccc defasdfs" 
$ echo ${x%% *} 
aaa 

è equivalente a:

$ x="aaa abbb bccc defasdfs" 
$ echo $x | awk '{print $1}' 
aaa 

Per assicurarsi che sia chiaro, diamo un altro esempio:

$ x="aaa abbb_bccc_defasdfs" 
$ echo ${x%%_*} 
aaa abbb 

Non vediamo per la prima _ carattere e cancelliamo da quel punto fino alla fine.

Per vedere di più di questi comandi interessanti, è possibile controllare Reference Cards #String Operations.


Per quanto riguarda la domanda di Google, sì, questi caratteri non sono ricercabili tramite il loro motore di ricerca. Invece, ti consiglierei di usare SymbolHound.

Per esempio, querying ${x%% *} ci mostra un risultato prezioso.

+1

Vedere anche http://meta.stackoverflow.com/questions/289671/how-to-ricerca-per-dollaro-sign-o-esclamazione marchio – tripleee

+0

@tripleee davvero! Ho fatto quella domanda in effetti:) Quindi aggiornando con questo riferimento. – fedorqui