Tetapkan nilai atau string ke variabel dalam skrip linux


1

Saya mencoba untuk menetapkan output dari basenameperintah file ke variabel "nama file". pathsadalah file yang berisi lokasi jalur, mis/root/home/david/mynote

$FILEadalah = mynote. grepadalah untuk mendapatkan path lengkap /root/home/david/mynotedan basenamehanya mengekstraksi mynotedan menetapkannya ke variabel filename.

filename=basename `grep $FILE House/paths`

Dengan baris perintah di atas, nilai filenameselalu kosong ketika saya masukkan echo $filename.

Jawaban:


2

Secara umum, dalam BASH Anda menyimpan output dari perintah ke variabel dengan salah satu cara berikut:

foo=$(ls /usr)

atau

foo=`ls /usr`

Adapun pertanyaan Anda, jika Anda memiliki file bernama foo.txtkonten yang terlihat seperti ini:

/usr/
/usr/games
/usr/games/cowthink
/usr/games/cowsay
/usr/games/fortune
/usr/games/enemylines7
/usr/games/enemylines3
/usr/lib32
/usr/lib32/libgdbm_compat.so.3.0.0
/usr/lib32/libfusion-1.2.so.9.0.1

maka ini harus melakukan apa yang Anda butuhkan:

while read FILE; do filename=`basename "$FILE"`; echo "$filename"; done < foo.txt

Sebaliknya, jika Anda ingin mencari pola tertentu (mis. "Mynote") dalam file lakukan:

grep mynote foo.txt|while read FILE; do filename=`basename "$FILE"`; echo "$filename"; done

PENJELASAN:

while read FILE; do {something}; done < foo.txt

Perintah ini membaca setiap baris file foo.txtdan menyimpan isinya ke dalam variabel $FILE. Kemudian dieksekusi {something}sekali untuk setiap baris file.

Dalam hal ini, {something}apakah perintah ini:

filename=`basename "$FILE"`; echo "$filename"  

Itu satu berjalan basenamepada isi variabel $FILEdan menyimpan hasilnya dalam variabel $filename. Perhatikan tanda kutip ( ") di sekitar $FILE, mereka memastikan bahwa perintah bekerja untuk nama file yang berisi spasi. Akhirnya digunakan echountuk mencetak isi $filename.


MEMPERBARUI:

Setelah melihat pertanyaan Anda yang lain , saya mengerti apa yang Anda coba lakukan. Yang Anda butuhkan adalah ini:

filename=$(basename `grep $FILE CourseWork/paths`) 

atau $ filename = $ (basename / tmp / foo)
minggu

Saya ingin mencari file-path dengan grep di file paths dan melakukan nama samaran "???" kemudian tetapkan ke nama file variabel.
ibi

@ibi Saya melihat pertanyaan Anda yang lain dan mengerti apa yang Anda coba lakukan. Lihat (kembali) jawaban yang diperbarui.
terdon

2

Ini adalah contoh sempurna mengapa Anda harus berhenti menggunakan sintaks backtick yang sudah usang di bash:

filename=$(basename $(grep $FILE House/paths))

Lihat http://www.gnu.org/software/bash/manual/bashref.html#Command-Substitution

Catatan, untuk melindungi dari jalur yang mungkin mengandung spasi, sertakan beberapa item dalam tanda kutip ganda:

filename=$(basename "$(grep "$FILE" House/paths)")

Alasan variabel kosong adalah ini: ketika shell melihat

filename=basename `grep $FILE House/paths`
  1. shell pertama-tama mengeksekusi perintah grep (misalkan untuk ilustrasi, perintah mengembalikan "/ foo / bar / myfile")
  2. shell kemudian mencoba mengeksekusi "/ foo / bar / myfile", untuk sementara mengatur variabel lingkungan filenamedengan nilai baselineuntuk durasi perintah itu - shell tidak mengandung filenamevariabel.

Ini diam-diam didokumentasikan dalam referensi bash di bawah Lingkungan

Lingkungan untuk setiap perintah atau fungsi sederhana dapat ditambah sementara dengan mengawalinya dengan penetapan parameter, seperti yang dijelaskan dalam Parameter Shell . Pernyataan penugasan ini hanya memengaruhi lingkungan yang dilihat oleh perintah itu.


Terima kasih sejuta Glenn ... !!! Solusi Anda melakukan apa yang saya butuhkan.
ibi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.