Saya akan mempertimbangkan kemungkinan bahwa mungkin ada spasi sebelum tag hash juga saat menguji "komentar", jika memang itu yang Anda lakukan.
rthomson
Ketika Anda menerima jawaban yang melibatkan bashsolusi, mungkin Anda bisa mengedit pertanyaan Anda, karena menyiratkan Anda berharap untuk sh/ dashsolusi.
Charles Roberto Canato
Saya sarankan menggunakan jalur absolut di #!baris sebagai jalur relatif di baris yang tampaknya diambil relatif ke direktori saat ini dari proses menjalankan skrip daripada relatif di mana skrip berada.
kasperd
Jawaban:
20
Pendekatan awal Anda akan bekerja dengan baik jika Anda lolos dari hash :
$ [[ '#snort' == \#* ]]; echo $?
0
Pendekatan lain akan memotong karakter pertama dari konten variabel, menggunakan "Substring Expansion":
if [[ ${x:0:1} == '#' ]]
then
echo 'yep'
else
echo 'nope'
fi
yep
Dari halaman manual Bash:
${parameter:offset}
${parameter:offset:length}
Substring Expansion. Expands to up to length characters of
parameter starting at the character specified by offset. If
length is omitted, expands to the substring of parameter start-
ing at the character specified by offset. length and offset are
arithmetic expressions (see ARITHMETIC EVALUATION below).
length must evaluate to a number greater than or equal to zero.
If offset evaluates to a number less than zero, the value is
used as an offset from the end of the value of parameter. If
parameter is @, the result is length positional parameters
beginning at offset. If parameter is an array name indexed by @
or *, the result is the length members of the array beginning
with ${parameter[offset]}. A negative offset is taken relative
to one greater than the maximum index of the specified array.
Note that a negative offset must be separated from the colon by
at least one space to avoid being confused with the :- expan-
sion. Substring indexing is zero-based unless the positional
parameters are used, in which case the indexing starts at 1.
+1 untuk jawaban posix. Dalam beberapa tes timing yang belum sempurna, casemetode ini tampaknya menjadi yang tercepat dari ketiganya pada komputer x86 32-bit yang cukup lama. Ketiganya adalah jauh lebih efisien daripada contoh sederhana yang pipa untuk prosesor stdin bercabang seperti: echo $var | cut -c1. Analisis saya cukup mendasar berdasarkan 10.000.000 iterasi hanya pada satu komputer / os - YMMV. Saya hanya menggunakan komputer yang lebih lambat untuk melebih-lebihkan perbedaan dan membuatnya lebih terlihat - setidaknya pada satu platform itu.
Juan
BTW, untuk 10.000.000 iterasi, metode builtin yang dijelaskan dalam jawaban ini berjalan sekitar satu menit (pada kotak lambat yang disebutkan di atas). Pipa untuk cutrasa butuh waktu 5+ jam.
Juan
Bagaimana jika Anda ingin menemukan hal-hal yang dimulai dengan "
Justin
5
Saya tahu ini mungkin bid'ah, tetapi untuk hal-hal seperti ini saya lebih suka menggunakan grep atau egrep daripada melakukannya dari dalam shell. Ini sedikit lebih mahal (saya kira) tetapi bagi saya pembacaan solusi ini mengimbangi itu. Ini masalah selera pribadi, tentu saja.
Begitu:
myvar=" #comment asfasfasdf"
if ! echo $myvar | egrep -q '^ *#'
then
echo "not a comment"
else
echo "commented out"
fi
Ini bekerja dengan atau tanpa spasi terkemuka. Jika Anda juga ingin membuat tab terkemuka, gunakan egrep -q '^ [\ t] * #'.
Kalau dipikir-pikir, mungkin saya lebih suka egrep karena saya suka regex, tapi saya menganggap grep / egrep berguna dalam pengaturan situasi yang lebih luas.
Eduardo Ivanec
0
Ini cara lain ...
# assign to var the value of argument actual invocation
var=${1-"#default string"}
if [[ "$var" == "#"* ]]
then
echo "$var starts with a #"
fi
Cukup salin tempel konten ke file, berikan izin eksekusi, dan lihat cara kerjanya;).
bash
solusi, mungkin Anda bisa mengedit pertanyaan Anda, karena menyiratkan Anda berharap untuksh
/dash
solusi.#!
baris sebagai jalur relatif di baris yang tampaknya diambil relatif ke direktori saat ini dari proses menjalankan skrip daripada relatif di mana skrip berada.Jawaban:
Pendekatan awal Anda akan bekerja dengan baik jika Anda lolos dari hash :
Pendekatan lain akan memotong karakter pertama dari konten variabel, menggunakan "Substring Expansion":
Dari halaman manual Bash:
sumber
man bash
" harus melakukannya.Versi yang kompatibel dengan POSIX:
atau:
atau:
sumber
case
metode ini tampaknya menjadi yang tercepat dari ketiganya pada komputer x86 32-bit yang cukup lama. Ketiganya adalah jauh lebih efisien daripada contoh sederhana yang pipa untuk prosesor stdin bercabang seperti:echo $var | cut -c1
. Analisis saya cukup mendasar berdasarkan 10.000.000 iterasi hanya pada satu komputer / os - YMMV. Saya hanya menggunakan komputer yang lebih lambat untuk melebih-lebihkan perbedaan dan membuatnya lebih terlihat - setidaknya pada satu platform itu.cut
rasa butuh waktu 5+ jam.Saya tahu ini mungkin bid'ah, tetapi untuk hal-hal seperti ini saya lebih suka menggunakan grep atau egrep daripada melakukannya dari dalam shell. Ini sedikit lebih mahal (saya kira) tetapi bagi saya pembacaan solusi ini mengimbangi itu. Ini masalah selera pribadi, tentu saja.
Begitu:
Ini bekerja dengan atau tanpa spasi terkemuka. Jika Anda juga ingin membuat tab terkemuka, gunakan egrep -q '^ [\ t] * #'.
sumber
Ini cara lain ...
Cukup salin tempel konten ke file, berikan izin eksekusi, dan lihat cara kerjanya;).
Semoga ini bisa membantu!
Salam pembuka.
sumber