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.

ibi
sumber

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`) 
terdon
sumber
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.

glenn jackman
sumber
Terima kasih sejuta Glenn ... !!! Solusi Anda melakukan apa yang saya butuhkan.
ibi