Questa domanda è una sorta di seguito della mia domanda precedente . Gli utenti di questo sito mi hanno gentilmente aiutato a determinare come scrivere un forloop bash che scorre sui valori di stringa. Ad esempio, supponiamo che una variabile di controllo del ciclo fnamescorre le stringhe "a.txt" "b.txt" "c.txt". Vorrei echo"si!" quando fnameha il valore "a.txt"o "c.txt"e echo"no!" altrimenti. Ho provato il seguente script shell bash:
#!/bin/bash
for fname in "a.txt" "b.txt" "c.txt"
do
echo $fname
if [ "$fname" = "a.txt" ] | [ "$fname" = "c.txt" ]; then
echo "yes!"
else
echo "no!"
fi
done
Ottengo l'output:
a.txt
no!
b.txt
no!
c.txt
sì!
Perché la ifdichiarazione sembra apparentemente vera quando fnameha il valore "a.txt"? Ho usato in |modo errato?
-oall'interno dello stesso [ ].
||e separare [ ]sopra -oper la portabilità, semplicemente perché [non è garantita per supportare più di 4 argomenti. Naturalmente se la lingua di destinazione è bash, nessuno dovrebbe essere utilizzando [in ogni modo perché bash's [[è superiore in molti modi.
if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]piuttosto che if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]?
bash, come stai già facendo. Uno dei vantaggi [[è che non fa la suddivisione in parole (caso speciale), quindi [[ $unquoted_var = string ]]è sicuro.