Questa domanda è una sorta di seguito della mia domanda precedente . Gli utenti di questo sito mi hanno gentilmente aiutato a determinare come scrivere un for
loop bash che scorre sui valori di stringa. Ad esempio, supponiamo che una variabile di controllo del ciclo fname
scorre le stringhe "a.txt" "b.txt" "c.txt"
. Vorrei echo
"si!" quando fname
ha 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 if
dichiarazione sembra apparentemente vera quando fname
ha il valore "a.txt"
? Ho usato in |
modo errato?
-o
all'interno dello stesso [ ]
.
||
e separare [ ]
sopra -o
per 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.