Informasi

6.0 menghapus kucing


6.0 penghapusan kucing foo /tmp/bar, cat /tmp/bar >, /tmp/foo

7.0 ./bar: Tidak ada file atau direktori seperti itu

7.0 ./foo: Tidak ada file atau direktori seperti itu

7.0 ./foo /tmp/bar: Tidak ada file atau direktori seperti itu

7.0 ./bar /tmp/foo: Tidak ada file atau direktori seperti itu

7.0 ./bar /tmp/foo /tmp/bar: Tidak ada file atau direktori seperti itu

7.0

A:

Perilaku yang Anda lihat disebabkan oleh penggunaan fitur globbing shell. Jika Anda ingin perintah cat berperilaku seperti yang Anda gambarkan, Anda harus secara eksplisit melakukan perbandingan globbing.

jika [ "$a" = "$(echo $a | cut -f1 -d/ )" ] , maka

pertandingan gema

lain

gema tidak cocok

fi

Perintah cut digunakan untuk melakukan operasi globbing awal.

$ echo "foo/bar" | potong -f1 -d/

foo

$ echo "foo/bar" | potong -f1 -d/

batang

Pernyataan if kemudian berfungsi untuk melakukan perbandingan globbing dan hanya mengevaluasi ekspresi shell jika globbing cocok.

Secara umum, perbandingan globbing sedikit lebih sulit dilakukan di shell daripada di bahasa pemrograman yang lebih tradisional (Python, Ruby, dll), dan merupakan ide bagus untuk memeriksa apakah Anda menggunakan fitur globbing dengan tepat.

A:

Karena Anda menggunakan = tidak =~ dalam kondisi.

Saat kamu melakukan

a =$(echo $a | cut -f1 -d/ )

if [ "$a" = "$(echo $a | cut -f1 -d/ )" ]

kemudian

pertandingan gema

lain

gema tidak cocok

fi

Ini membandingkan seperti ini, a tidak sama dengan $(echo $a | cut -f1 -d/ ) yang tidak sama dengan string kosong karena spasi.

Untuk memperbaikinya, Anda dapat melakukannya

if [ "$a" = "$(echo $a | cut -f1 -d/)" ]

kemudian

pertandingan gema

lain

gema tidak cocok

fi

A:

a =$(echo $a | cut -f1 -d/ )

Anda perlu menggunakan tanda kutip ganda di sekitar =, dan tambahkan ] di akhir. Ini akan memberi Anda apa yang Anda inginkan.

a =$(echo $a | cut -f1 -d/ )

if [ "$a" = "$(echo $a | cut -f1 -d/ )" ]

Jika Anda tidak menambahkan ] ke akhir skrip Anda, maka [ "bar" = "foo/bar" ] akan bernilai true, karena dianggap "bar" = "foo/" adalah ekspresi yang valid. Bagian pertama juga tidak akan berfungsi saat Anda menambahkan ] di bagian akhir. Itu perlu dikutip ganda.

Cara termudah untuk membaca nilai $a (dan nilainya pada titik mana pun dalam skrip) adalah dengan menggunakan pernyataan [ dan case.

a =$(echo $a | cut -f1 -d/ )

kasus $a in

/foo/bar/) echo "a adalah 'foo/bar'", a='' ,,

*) echo "a bukan 'foo/bar'", a='foo/bar' ,,

esac

if [ "$a" = "$(echo $a | cut -f1 -d/ )" ]

Ini mengambil nilai $a dan memeriksanya dengan nilai yang diketahui. Kemudian pernyataan kasus ini mengembalikan $a ke nilai yang diketahui. Jika nilai $a bukan salah satu nilai yang valid, maka pesan kesalahan akan dicetak ke layar.

Dengan menggunakan metode ini, tidak ada masalah dengan tanda kutip ganda dan tunggal, dan itu akan berfungsi dengan benar dalam semua kasus di mana versi Anda saat ini tidak berfungsi.

Cara lain yang lebih elegan untuk melakukannya adalah dengan menggunakan beberapa ekstensi GNU.

if [[ "$a" = "$(echo $a | cut -f1 -d/)" ]]

Perintah [[ bernilai true jika string yang diberikan kosong. Karena tes dievaluasi ke string kosong, dan bukan nilai $a, ini jauh lebih efisien.


Tonton videonya: versa cat delete (Januari 2022).

Video, Sitemap-Video, Sitemap-Videos