Pertanyaan Bantu dekomposisi baris ini di skrip bash


Saya butuh bantuan untuk memahami apa arti dari beberapa baris ini. Saya perlu membuat beberapa perubahan pada skrip bash untuk magang saya, dan karena saya baru mulai membaca bash hari ini, saya mengalami kesulitan memahami apa artinya ini.

node="\\\\$1"

echo $node`echo $2|sed 's/\//\\\\/g'`

Terima kasih sebelumnya


2
2017-09-05 04:28


asal




Jawaban:


Baris ini menambahkan dua backslashes ke argumen pertama pada skrip. Backslash pertama di setiap pasangan lolos yang kedua.

node="\\\\$1"

Baris ini mengambil hasil dari yang sebelumnya dan menambahkan hasil mengganti masing-masing garis miring di argumen kedua dengan dua garis miring terbalik.

echo $node`echo $2|sed 's/\//\\\\/g'`

Jika Anda memanggil skrip Anda seperti ini:

scriptname abc /def/ghi/jkl

kemudian $node akan menjadi "\\ abc" dan berikut ini akan digemakan:

\\abc\\def\\ghi\\jkl

Itu $1 dan $2 disebut sebagai parameter posisi dan mewakili argumen pertama dan kedua ke skrip Anda. Jika Anda ingin merujuk semuanya bersama-sama terlepas dari berapa banyak (hingga batas yang diizinkan oleh sistem Anda), Anda akan menggunakannya $@ atau $*.

Berikut ini cara yang lebih baik untuk menulis dua baris tersebut:

node='\\'"$1"

Dengan menggunakan tanda kutip tunggal di sekitar garis miring terbalik, Anda tidak perlu menghindarinya. Menggunakan tanda kutip ganda di sekitar parameter posisi memungkinkan untuk diperluas.

echo $node$(echo $2 | sed 's|/|\\\\|g')

Menggunakan $() bukannya backticks lebih mudah dibaca, mereka dapat dengan mudah ditumpuk dan mengutip dan melarikan diri disederhanakan. Dengan menggunakan pemisah alternatif (dalam hal ini simbol pipa) dengan sed Anda tidak perlu melarikan diri dari slash dan semuanya lebih mudah dibaca. Garis-garis miring belakang masih harus dilepaskan dalam kasus ini sejak sed memproses mereka daripada Bash.

Jika Anda tidak terbiasa $() (atau backticks) mereka melakukan substitusi perintah yang berarti bahwa output dari perintah terlampir diganti di tempat mereka.

Anda mungkin tidak akrab dengan sed. Ini adalah utilitas yang bersifat eksternal untuk Bash (atau shell lain) yang dapat mengambil Stream karakter dan mengeditnya. Perintah khusus yang digunakan di sini adalah s yang merupakan pengganti. Ini akan menggantikan apa yang ditemukan antara pembatas kedua dan ketiga (biasanya garis miring, tetapi Anda dapat menggunakan hampir semua karakter) untuk pola antara pembatas pertama dan kedua. Itu g adalah pengubah yang menyebabkan substitusi dibuat secara global (yaitu setiap kali terjadi di baris masukan). Proses ini diulang untuk setiap baris input. Dalam contoh Anda hanya ada satu baris input - output dari gema.


4
2017-09-05 06:16



Wow, itu sangat membantu :) Terima kasih. - iman453


Baris 1: node adalah variabel yang disetel dari baris perintah. Jadi, jika Anda melakukannya

runme.sh test

node akan sama dengan "\ test". Slash pertama lolos dari garis miring kedua, memperlakukannya sebagai garis miring bukan pengubah khusus.

Kemudian, ia menggantikan semua backslashes di nama dengan dua garis miring ke depan, seperti begitu

> runme.sh test/ing

\\test\\ing

Kemudian, itu mungkin ditafsirkan oleh program lain, yang menembus garis miring, sehingga membutuhkan ada dua dari mereka.


1
2017-09-05 04:36



Anda memiliki terminologi Anda terbalik: / adalah garis miring "maju". `\` adalah backslash. - Dennis Williamson


Tidak jelas bagian mana dari garis yang sulit Anda pahami, jadi saya akan mencoba menjelaskan apa yang saya anggap bagian yang lengket.

Skrip yang Anda kerjakan membutuhkan setidaknya dua argumen. Argumen-argumen ini diakses dalam skrip oleh nama-nama $ 1 dan $ 2. Pada baris pertama, backslash pertama melepaskan karakter yang mengikutinya, backslash kedua, sehingga pasangan dievaluasi sebagai backslash tunggal literal. Hal yang sama berlaku untuk sepasang backslashes kedua. Itu $ 1 diganti dengan nilai argumen pertama pada skrip. Jika skrip dijalankan sebagai

myscript apple banana/cantaloupe

nilai dari simpul akan menjadi "\\ apple", tanpa tanda kutip.

Perintah-perintah di dalam kutu belakang (`) dieksekusi, kemudian kutu belakang dan perintah yang diapit digantikan oleh output dari perintah-perintah itu. Itu sed perintah menggantikan setiap garis miring ke depan dalam aliran inputnya dengan sepasang backslashes. Sejak $ 2 dalam contoh ini adalah "pisang / blewah", hasil dari perintah dalam kutu belakang adalah "banana \\ cantaloupe". Output dari baris kedua adalah nilai dari simpul digabung dengan hasil ekspresi back-tick, atau "\\ applebanana \\ cantaloupe".


1
2017-09-05 06:42