Bagaimana cara mencetak "-n" tanpa mengeluarkan baris baru?

16

Saya mencoba mencetak -nmenggunakan echoperintah. Tetapi jika saya cukup mengetik echo -n, itu hanya mengeluarkan baris baru, tidak muncul -n, malah menerbitkan baris baru.

OS bintang
sumber
Apakah echo -n -- -nberfungsi (tidak memiliki kotak linux yang mudah untuk diuji)?
n0rd
Saya menginstal Ubuntu di mesin virtual dan tampaknya sangat lambat, tunggu.
Bintang OS
1
Saya sudah memeriksa - tidak. Mungkin karena itu perintah bash internal dan tidak menggunakan getopt(???) untuk mengurai baris perintah
n0rd
1
Pertanyaan ini ditanyakan dan dijawab di pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html - - " Menyelaraskan aplikasi yang ... mungkin mengharapkan gaung a -n, harus menggunakan utilitas printf yang berasal dari Kesembilan Sistem edisi "
Brandin
Pertanyaan populer pertama yang saya buat. Yay?
Bintang OS

Jawaban:

28

Masalahnya adalah bahwa echomenafsirkan -nsebagai argumen. Pada implementasi default bash, itu berarti (dari help echo):

  -n  do not append a newline

Ada berbagai cara untuk menyiasatinya:

  1. Buat menjadi sesuatu yang bukan pilihan dengan memasukkan karakter lain. Sebagai contoh, katakan echountuk tidak mencetak baris baru -n, kemudian kirim untuk mengartikan backslash lolos dengan -edan tambahkan baris baru secara eksplisit.

    $ echo -ne '-n\n'
    -n
  2. Atau, cukup masukkan spasi

    $ echo " -n"
     -n

    Namun, itu menambah ruang yang mungkin tidak Anda inginkan.

  3. Gunakan karakter non-cetak sebelum itu. Sini. Saya menggunakan backspace ( \b)

    $ echo -e "\b-n"
    -n

    Ini juga menambahkan karakter tambahan yang mungkin tidak Anda inginkan.

  4. Gunakan tipu daya

    $ echo n- | rev
    -n

    The revperintah hanya mencetak output terbalik.

  5. Gunakan alat yang tepat untuk pekerjaan itu

    $ printf -- '-n\n'
    -n
terdon
sumber
Anda benar bahwa karakter apa pun yang valid akan dilakukan.
Pilot6
@ Pilot6 ya tapi masalah dengan pendekatan itu (milik Anda dan milik saya) adalah itu menambah karakter tambahan. Itu dapat menyebabkan masalah di telepon. Apalagi jika Anda ingin menguraikannya dan mencoba sesuatu seperti grep '^-n'. pritnfadalah cara untuk pergi, sungguh.
terdon
Yah, printfmemang lebih baik, tetapi pertanyaannya adalah tentang adil echo.
Pilot6
2
Sepertinya echo -e "-n\c"melakukan hal yang tepat.
Pilot6
1
\cditekan output lebih lanjut
Pilot6
15

Terkadang merupakan ide bagus untuk menggunakan alat yang tepat. Anda bisa menggunakan printf:

% printf "-n\n"       
-n
AB
sumber
1
Ini adalah ide yang bagus, karena ada banyak varian echo, sementara printfstandarnya lebih baik .
200_sukses
Ini adalah ide yang lebih disukai untuk portabilitas
Sergiy Kolodyazhnyy
7

Anda dapat menggunakan perintah ini, tetapi itu menambah ruang ekstra.

echo -e  "\r-n"

Ini semacam peretasan.

-e mengaktifkan simbol perintah backslash.

\r adalah carriage return.

Sebenarnya setiap \karakter yang valid akan dilakukan di sembarang string.

Anda dapat melihat yang valid oleh help echo.

echo "-n"tidak berfungsi karena -ndigunakan sebagai parameter untuk echo.

PS Solusi IMHO terbaik adalah

echo -e "-n\c"

Itu tidak menambahkan karakter tambahan .

echo -e "-n\n"

mencetak sama tetapi dengan char baris baru.

Pilot6
sumber
1
Wov! Ini lebih baik dari milikku; dapatkah Anda menjelaskan sedikit untuk "pemula" ;-)
Sadi
Terima kasih, saya juga memperhatikan bahwa tidak masalah di mana Anda menambahkan carriage return, di awal atau di akhir.
Sadi
@Sadi ya, itu karena menambahkan apa pun menjadikannya opsi yang tidak valid. -nvalid, -nfootidak demikian yang akan dicetak.
terdon
@terdon man echomemilikinya juga. Tetapi helpsedikit lebih baik.
Pilot6
Saya tahu ia memilikinya, hanya saja tidak relevan. /bin/echoadalah hal yang sama sekali berbeda dan ketika Anda menjalankan echodi bash, Anda mendapatkan builtin yang bisa sangat berbeda tergantung pada shell Anda.
terdon
5

Saya pikir jika Anda hanya ingin menggunakan echo, ini harus memuaskan Anda:

echo "-n "

Ini berfungsi karena sementara -nadalah opsi yang valid untuk echo, -ndengan spasi setelahnya tidak. Karena ini bukan opsi, echocetak saja.

Sadi
sumber
Sebagian besar pemirsa di sini mungkin hanya ingin "-n", bukan "-n".
Bintang OS
5

Kalian benar-benar terlalu memikirkannya.

 echo -e \\055n

Atau tanpa baris baru

 echo -en \\055n
Joshua
sumber
Bagaimana berpikiran printf "-n\n" berlebihan?
Dmitry Grigoryev
Yup, saya baru saja menjawab seperti ini. Akan menghapus jawaban saya. Ini relatif portabel karena bekerja dengan gema /bin/echoecho -e "\055n"
bawaan
-en bukan yang saya inginkan.
Bintang OS
2

Untuk memperluas jawaban AB, satu-satunya cara portabel untuk digunakan echoadalah tidak menggunakan opsi apa pun seperti -n. Pertimbangkan penggunaannya printfjika tersedia. Halaman referensi ini memberikan lebih banyak detail dan menjelaskan dengan sangat baik kapan dan bagaimana echodan printfharus digunakan:

Saat ini, gema (1) hanya portabel jika Anda menghilangkan tanda dan menghindari urutan. Gunakan printf (1) sebagai gantinya, jika Anda membutuhkan lebih dari teks biasa.

Dmitry Grigoryev
sumber
Saya sudah Anda akan memperpanjang jawaban, silakan edit jawabannya.
Bintang OS
Saya tidak yakin itu ide yang baik untuk mengubah jawaban orang lain ke titik ketika itu akan memiliki lebih banyak teks dari saya daripada dari penulis asli.
Dmitry Grigoryev
2

Di skrip Bash Anda dapat menjalankan:

echo -n -
echo n

Atau dalam cangkang interacive:

echo -n - ; echo n

Ini echoadalah -karakter dan nkarakter.

jiwopene
sumber
Apakah kamu sudah mencobanya? Ini salah.
Pilot6
Output perintah pertama -pilot6@Pilot6:~$. Keluaran kedua n.
Pilot6
@ Pilot6 Tergantung pada apakah Anda menjalankannya di terminal interaktif atau dalam skrip bash, yang tidak ditentukan dalam pertanyaan. OTOH jika Anda membutuhkannya di terminal, cukup sederhana untuk hanya menggabungkan dua baris dengan &&- Saya tidak akan mengatakan jawaban ini salah .
user12205
Saya akan mengeditnya sehingga menjadi lebih jelas untuk skrip bash.
Bintang OS
1

Tiga cara lain:

$ echo -e '\x2dn' # ASCII hexadecimal value
-n
$ echo -e '\u002dn' # Unicode code point
-n
$ echo -e '\u2dn' # Unicode code point shortened
-n
kos
sumber
0

Anda bisa lari

printf -n;echo

Diuji dalam Busybox Ash

jiwopene
sumber
Abu? Abu? POKEMON yang saya maksud, apa?
Bintang OS
Saya menjalankan 'busybox ash'
jiwopene
Ucapkan "Busybox" atau "Busybox Ash". Bukan hanya "Ash" karena orang mungkin berpikir tentang karakter pokemon atau abu dari gunung berapi.
Bintang OS
Lebih baik. alt255alt255
OS Bintang
@ StarOS ashadalah nama Shell Almquist.
muru