Saya memiliki variabel multiline, dan saya hanya ingin baris pertama dalam variabel itu. Script berikut menunjukkan masalah:
#!/bin/bash
STRINGTEST="Onlygetthefirstline
butnotthesecond
orthethird"
echo " Take the first line and send to standard output:"
echo ${STRINGTEST%%$'\n'*}
# Output is as follows:
# Onlygetthefirstline
echo " Set the value of the variable to the first line of the variable:"
STRINGTEST=${STRINGTEST%%$'\n'*}
echo " Send the modified variable to standard output:"
echo $STRINGTEST
# Output is as follows:
# Onlygetthefirstline butnotthesecond orthethird
Pertanyaan: Mengapa ${STRINGTEST%%$'\n'*}
mengembalikan baris pertama ketika ditempatkan setelah echo
perintah, tetapi mengganti baris baru dengan spasi ketika ditempatkan setelah penugasan?
$'...'
bukan bash.Jawaban:
Mungkin ada cara lain untuk mengarsipkan apa yang ingin Anda lakukan, tetapi ini berhasil
sumber
$STRINGTEST
tidak mengandung kartu kosong atau wildcard. Perhatikan juga bahwa baris kosong (seperti pada baris pertama dalam variabel itu) diabaikan.STRINGTEST=(${STRINGTEST[@]})
tidak masuk akal dan setara denganSTRINGTEST=($STRINGTEST)
karenaSTRINGTEST
sebelumnya didefinisikan sebagai variabel skalar (bukan array ).mungkin tidak paling efisien tetapi satu liner ...
sumber
firstLine=`echo "${test_var}" | sed -n 1p
juga bekerja jika Anda memiliki alasan untuk menggunakan sed bukan (misalnya, itu berarti Anda dapat sekaligus melakukan penggantian ke garis:echo "${test_var}" | sed -nE '1 s/# *(.*)/\1/p'
.Kode itu berfungsi untuk saya dengan semua versi bash yang saya coba antara 2.05b dan 4.3. Kemungkinan besar Anda mencoba menjalankan skrip itu dengan shell yang berbeda yang tidak mendukung
$'...'
bentuk kutipan.Itu
$'...'
sintaks tidak standarsh
sintaks (belum) dan hanya didukung (per 2015/05/22 dan AFAIK) olehksh93
(di mana ia berasal),zsh
,bash
, versi terbaru darimksh
dansh
atau baru versi FreeBSD .Saya akan bertaruh bahwa Anda mencoba untuk menjalankan bahwa script dengan
sh
alih-alihbash
dan Andash
didasarkan pada versiash
,pdksh
,yash
atauksh88
yang tidak mendukung itu belum.Jika Anda ingin membuat kode itu POSIX 2008 kompatibel, Anda harus menuliskannya:
Kemudian, Anda dapat menafsirkannya dengan shell yang sesuai dengan POSIX
bash
atau yang lebih ramping / lebih cepat seperti milik Andash
.(dan ingat bahwa meninggalkan variabel yang tidak dikutip dalam konteks daftar memiliki arti yang sangat istimewa dalam shell mirip Bourne).
sumber
Ini bekerja untuk saya:
Dan itu juga berfungsi untuk baris kosong:
sumber
read
sekali menjadi variabel sederhana (bukanreadarray
plus pengindeksan).Dengan Bash built-in
read
dan di sini-string:Menggunakan ekspansi parameter POSIX:
sumber