GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Cara Menetapkan Output Perintah Ke Variabel Shell?

Saya ingin menetapkan hasil ekspresi
(yaitu, output dari perintah)
ke variabel dan kemudian memanipulasinya – misalnya,
menggabungkannya dengan string, lalu menggemakannya .
Ini yang saya dapatkan:

#!/bin/bash
cd ~/Desktop;
thefile= ls -t -U | grep -m 1 "Screen Shot";
echo "Most recent screenshot is: "$thefile;

Tapi itu menghasilkan:

Screen Shot 2011-07-03 at 1.55.43 PM.png
Most recent screenshot is: 

Jadi, sepertinya itu tidak ditugaskan ke $thefile , dan sedang dicetak saat dieksekusi.

Apa yang saya lewatkan?

Jawaban yang Diterima:

Penugasan shell adalah satu kata, tanpa spasi setelah tanda sama dengan. Jadi apa yang Anda tulis memberikan nilai kosong ke thefile; Selanjutnya, karena tugas dikelompokkan dengan perintah, itu membuat thefile variabel lingkungan dan penugasan bersifat lokal untuk perintah tertentu, yaitu hanya panggilan ke ls melihat nilai yang ditetapkan.

Anda ingin menangkap output dari suatu perintah, jadi Anda perlu menggunakan substitusi perintah:

thefile=$(ls -t -U | grep -m 1 "Screen Shot")

(Beberapa literatur menunjukkan sintaks alternatif thefile=`ls …` ; sintaks backquote setara dengan sintaks dolar-kurung kecuali bahwa mengutip di dalam backquotes terkadang aneh, jadi gunakan saja $(…) .)

Komentar lain tentang skrip Anda:

  • Menggabungkan -t (urutkan berdasarkan waktu) dengan -U (jangan mengurutkan dengan GNU ls ) tidak masuk akal; cukup gunakan -t .

  • Daripada menggunakan grep untuk mencocokkan tangkapan layar, lebih jelas untuk memberikan wildcard ke ls dan gunakan head untuk menangkap file pertama:

      thefile=$(ls -td -- *"Screen Shot"* | head -n 1)
    
  • Biasanya merupakan ide yang buruk untuk mengurai output ls . Ini bisa sangat gagal jika Anda memiliki nama file dengan karakter yang tidak dapat dicetak. Namun, menyortir file berdasarkan tanggal sulit dilakukan tanpa ls , jadi ini adalah solusi yang dapat diterima jika Anda tahu Anda tidak akan memiliki karakter yang tidak dapat dicetak atau garis miring terbalik dalam nama file.

  • Selalu gunakan tanda kutip ganda di sekitar penggantian variabel , yaitu di sini tulis

      echo "Most recent screenshot is: $thefile"
    

    Tanpa tanda kutip ganda, nilai variabel diperluas, yang akan menyebabkan masalah jika berisi spasi atau karakter khusus lainnya.

  • Anda tidak perlu titik koma di akhir baris. Mereka berlebihan tetapi tidak berbahaya.

  • Dalam skrip shell, sebaiknya sertakan set -e . Ini memberitahu shell untuk keluar jika ada perintah yang gagal (dengan mengembalikan status bukan nol).

Jika Anda memiliki GNU find dan sort (khususnya jika Anda menjalankan Linux atau Cygwin non-embedded), ada pendekatan lain untuk menemukan file terbaru:have find daftar file dan tanggalnya, dan gunakan sort dan read (di sini dengan asumsi bash atau zsh untuk -d '' untuk membaca catatan yang dibatasi NUL) untuk mengekstrak file termuda.

IFS=/ read -rd '' mengabaikan file <<( find -maxdepth 1 -type f -name "*Screen Shot*" -printf "%[email protected]/%p
Linux
  1. Bagaimana cara menyimpan perintah dalam variabel dalam skrip Shell?

  2. Bagaimana cara menyimpan hasil dari perintah Shell yang dieksekusi dalam variabel dengan python?

  3. Bagaimana cara mempertahankan jeda baris saat menyimpan keluaran perintah ke variabel?

  1. Bagaimana saya bisa mengulang output dari perintah shell?

  2. Bagaimana cara menjalankan perintah Vim dari shell?

  3. Sembunyikan output dari perintah shell hanya jika berhasil?

  1. Cara Menetapkan Output dari Perintah Linux ke Variabel

  2. Apa Perbedaan Get Command Output Menggunakan`command`dan $(command) Di Shell??

  3. Bagaimana Cara Mengatur Variabel Sama Dengan Output Dari Perintah Di Grub2?