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 GNUls
) tidak masuk akal; cukup gunakan-t
. -
Daripada menggunakan
grep
untuk mencocokkan tangkapan layar, lebih jelas untuk memberikan wildcard kels
dan gunakanhead
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 tanpals
, 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
Bagaimana Cara Menghapus File Yang Namanya Dimulai Dengan "-" (tanda hubung A.k.a. Dash Atau Minus)?
Bagaimana Cara Kerja Input Keyboard Dan Output Teks?
Linux