Batalkan variabel bash yang merujuk ke direktori yang tidak ada

2

Saya memiliki file yang bersumber dari aplikasi, menambahkan direktori yang relevan ke $ PATH dan $ LD_LIBRARY_PATH.

Ini baik-baik saja, tetapi menghasilkan polusi yang agak berlebihan pada $ PATH dan $ LD_LIBRARY_PATH, karena beberapa jalur ditambahkan, sekitar 2/3 di antaranya tidak ada.

Saya dapat menguji keberadaan direktori menggunakan [ ! -d $VARIABLE_TO_ADD_TO_PATH ], tetapi jika saya menemukan direktori itu tidak ada, unsetting sepertinya lebih sulit.

Saya dapat menulis (untuk masing-masing mungkin 10 variabel)

if [ ! -d $VAR ]
    unset VAR
fi

tapi saya lebih suka memiliki fungsi.

Saya mencoba:

_testPathAndUnset()
{
   while [ $# -ge 1 ]
   do
      dirToTest=${1/startPattern/\$startPattern}
      if [ ! -d $dirToTest ]
         unset $1
      fi
      shift
   done
}

meneruskan nilai dalam bentuk seperti _testPathAndUnset VAR1 VAR2 VAR3 (tidak $VAR1 $VAR2 $VAR3 ), tapi sekarang saya memiliki string yang tidak berkembang.

Menggunakan eval mungkin menyelesaikan ini untuk saya, tetapi pertanyaan lain, jawaban, situs web dll dll menyarankan ini umumnya ide yang buruk.

Bagaimana saya bisa mengatasi masalah ini dengan cara yang lebih baik daripada 30 baris 10x3?

if [ ! -d $VAR ]
    unset VAR
fi
chrisb2244
sumber

Jawaban:

1

Berikut ini fungsinya:

_testPathAndUnset() { for d in "$@"; do [ -d "${!d}" ] || unset "$d"; done; }

Ini sedang digunakan. Untuk memulainya, kami memiliki dua direktori:

$ ls -d */
a1/  a2/

Kami mendefinisikan empat variabel shell yang mungkin atau mungkin tidak dievaluasi ke direktori:

$ one=a1; two=a2; three=a3; four=a4

Sekarang, jalankan fungsi kami terhadap keempat variabel:

$ _testPathAndUnset one two three four

Dan, perhatikan bahwa hanya dua variabel yang tetap ditetapkan:

$ echo "one=$one two=$two three=$three four=$four"
one=a1 two=a2 three= four=

Detail:

  • for d in "$@"

    Ini mengulangi setiap argumen di baris perintah.

  • [ -d "${!d}" ] || unset "$d"

    Sini d mengacu pada nama variabel. ${!d} mengacu pada nilai dari variabel bernama d. Ini menguji apakah nilai variabel bernama d adalah direktori. Jika tidak, maka [ tes bernilai false dan unset "$d" klausa dieksekusi.

John1024
sumber
Sempurna, terima kasih. Penjelasannya juga sangat membantu.
chrisb2244