GNU/Linux >> Belajar Linux >  >> Linux

Pergantian Perintah:Memisahkan Pada Baris Baru Tapi Bukan Spasi?

Saya tahu saya dapat menyelesaikan masalah ini dengan beberapa cara, tetapi saya ingin tahu apakah ada cara untuk melakukannya hanya dengan menggunakan bash bawaan, dan jika tidak, apa cara paling efisien untuk melakukannya.

Saya memiliki file dengan konten seperti

AAA
B C DDD
FOO BAR

yang saya maksud hanya memiliki beberapa baris dan setiap baris mungkin memiliki spasi atau tidak. Saya ingin menjalankan perintah seperti

cmd AAA "B C DDD" "FOO BAR"

Jika saya menggunakan cmd $(< file) Saya mengerti

cmd AAA B C DDD FOO BAR

dan jika saya menggunakan cmd "$(< file)" Saya mengerti

cmd "AAA B C DDD FOO BAR"

Bagaimana cara agar setiap baris diperlakukan tepat satu parameter?

Jawaban yang Diterima:

Portabel:

set -f              # turn off globbing
IFS='
'                   # split at newlines only
cmd $(cat <file)
unset IFS
set +f

Atau menggunakan subkulit untuk membuat IFS dan opsi berubah secara lokal:

( set -f; IFS='
'; exec cmd $(cat <file) )

Shell melakukan pemisahan bidang dan pembuatan nama file pada hasil substitusi variabel atau perintah yang tidak dalam tanda kutip ganda. Jadi, Anda perlu mematikan pembuatan nama file dengan set -f , dan konfigurasikan pemisahan bidang dengan IFS untuk membuat hanya baris baru yang memisahkan bidang.

Tidak banyak yang bisa diperoleh dengan konstruksi bash atau ksh. Anda dapat membuat IFS lokal ke suatu fungsi, tetapi tidak set -f .

Di bash atau ksh93, Anda dapat menyimpan bidang dalam array, jika Anda perlu meneruskannya ke beberapa perintah. Anda perlu mengontrol ekspansi pada saat Anda membangun array. Kemudian "${a[@]}" diperluas ke elemen larik, satu per kata.

set -f; IFS=$'n'
a=($(cat <file))
set +f; unset IFS
cmd "${a[@]}"

Linux
  1. Substitusi Perintah Menggunakan “?

  2. Perintah Tidak Ditemukan Di Zsh, Tetapi Ditemukan Di Bash?

  3. Gnu Awk Errno Tidak Disetel Pada Kegagalan Perintah?

  1. ifrename:perintah tidak ditemukan

  2. rm:perintah tidak ditemukan

  3. mv:perintah tidak ditemukan

  1. ln:perintah tidak ditemukan

  2. Perintah Conda bekerja di command prompt tetapi tidak di skrip bash

  3. `ssh <host>` adalah shell login, tetapi `ssh <host> <command>` bukan?