Apa perbedaan antara grep apple file
dan grep "apple" file
? Apa yang dilakukan dengan menempatkan tanda kutip? Keduanya tampak berfungsi dan melakukan hal yang sama persis (menampilkan garis yang sama).
Apa perbedaan antara grep apple file
dan grep "apple" file
? Apa yang dilakukan dengan menempatkan tanda kutip? Keduanya tampak berfungsi dan melakukan hal yang sama persis (menampilkan garis yang sama).
Jawaban:
Tanda kutip memiliki efek pada karakter apa yang Anda anggap istimewa oleh shell dan memiliki makna sintaksis. Dalam contoh Anda ini tidak membuat perbedaan karena apple
tidak mengandung karakter seperti itu.
Tetapi perhatikan contoh lain: grep apple tree file
akan mencari kata apple
dalam file tree
dan file
, sedangkan grep "apple tree" file
akan mencari kata apple tree
dalam file file
. Tanda kutip memberi tahu bash, bahwa ruang kata di "apple tree"
tidak memulai parameter baru tetapi harus menjadi bagian dari parameter saat ini. grep apple\ tree file
akan menghasilkan hasil yang sama, karena \
memberitahu bash untuk mengabaikan makna khusus karakter berikut dan memperlakukannya secara harfiah.
"
) dan tanda kutip tunggal ( '
). Kutipan tunggal mencegah interpretasi karakter tertentu seperti $
, sedangkan tanda kutip ganda memungkinkan interpretasi. Misalnya grep '${USER}'
akan mencari teks ${USER}
, sedangkan grep "${USER}"
akan mencari teks yang USER
berisi variabel (misalnya johnstacen
).
Kutipan ganda memungkinkan evaluasi, kutipan tunggal mencegah evaluasi, tidak ada tanda kutip memungkinkan ekspansi wildcard, ketika digunakan pada baris perintah. Sebagai contoh yang dibuat-buat:
[user@work test]$ ls .
A.txt B.txt C.txt D.cpp
# The following is the same as writing echo 'A.txt B.txt C.txt D.cpp'
[user@work test]$ echo *
A.txt B.txt C.txt D.cpp
[user@work test]$ echo "*"
*
[user@work test]$ echo '*'
*
# The following is the same as writing echo 'A.txt B.txt C.txt'
[user@work test]$ echo *.txt
A.txt B.txt C.txt
[user@work test]$ echo "*.txt"
*.txt
[user@work test]$ echo '*.txt'
*.txt
[user@work test]$ myname=is Fred; echo $myname
bash: Fred: command not found
[user@work test]$ myname=is\ Fred; echo $myname
is Fred
[user@work test]$ myname="is Fred"; echo $myname
is Fred
[user@work test]$ myname='is Fred'; echo $myname
is Fred
Memahami cara kerja kutipan sangat penting untuk memahami Bash. Sebagai contoh:
# for will operate on each file name separately (like an array), looping 3 times.
[user@work test]$ for f in $(echo *txt); do echo "$f"; done;
A.txt
B.txt
C.txt
# for will see only the string, 'A.txt B.txt C.txt' and loop just once.
[user@work test]$ for f in "$(echo *txt)"; do echo "$f"; done;
A.txt B.txt C.txt
# this just returns the string - it can't be evaluated in single quotes.
[user@work test]$ for f in '$(echo *txt)'; do echo "$f"; done;
$(echo *txt)
Anda dapat menggunakan tanda kutip tunggal untuk memberikan perintah melalui variabel. Kutipan tunggal akan mencegah evaluasi. Kutipan ganda akan dievaluasi.
# This returns three distinct elements, like an array.
[user@work test]$ echo='echo *.txt'; echo $($echo)
A.txt B.txt C.txt
# This returns what looks like three elements, but it is actually a single string.
[user@work test]$ echo='echo *.txt'; echo "$($echo)"
A.txt B.txt C.txt
# This cannot be evaluated, so it returns whatever is between quotes, literally.
[user@work test]$ echo='echo *.txt'; echo '$($echo)'
$($echo)
Anda dapat menggunakan tanda kutip tunggal di dalam tanda kutip ganda dan Anda dapat menggunakan tanda kutip ganda di dalam tanda kutip ganda, tetapi tanda kutip ganda di dalam tanda kutip tunggal tidak boleh dilakukan (tanpa melarikan diri) tidak akan dievaluasi, mereka akan ditafsirkan secara harfiah. Kutipan tunggal dalam tanda kutip tunggal tidak boleh dilakukan (tanpa melarikan diri).
Anda harus mendapatkan pemahaman menyeluruh tentang kutipan untuk menggunakan Bash secara efektif. Sangat penting!
Sebagai aturan umum, saya tidak menggunakan tanda kutip jika saya ingin Bash memperluas sesuatu menjadi elemen (seperti array), saya menggunakan tanda kutip tunggal untuk string literal yang tidak dapat diubah, dan saya menggunakan liberal tanda kutip ganda untuk variabel yang cenderung mengembalikan semua jenis string. Ini untuk memastikan bahwa spasi dan karakter khusus akan dipertahankan.
grep a*b equations.txt
maka ia akan mencaria*b
, kecuali ada file di direktori saat ini dimulai dengan, dan berakhir dengan b, dalam hal ini (karena (ba) sh akan memperluas nama file pada baris perintah) grep akan dipanggil dengan melengkapi parameter yang berbeda, menghasilkan hasil yang berbeda. Ini biasanya lebih merupakan masalah dengan find, karena perintah sepertifind . -name *.txt
akan menghasilkan perilaku yang tidak terduga, jika ada file txt di direktori saat ini. Lebih baik menggunakan kutipan dalam kasus ini.