Melewati argumen dari file ke skrip bash

10

Saya punya situasi ini:

./
./myscript.sh
./arguments.txt
./test.sh

Di dalam myscript.sh, saya harus menjalankan file test.sh, menyampaikan argumen yang terkandung di dalamnya arguments.txt.

myscript.sh adalah:

arguments=$(cat arguments.txt)
source test.sh $arguments

Ini berfungsi dengan baik jika jika arguments.txt berisi paling banyak satu argumen:

firstargument 

Substitusi adalah:

++ source test.sh 'firstargument'

Tetapi masalahnya adalah dengan dua atau lebih argumen. Ia melakukan ini:

++ source test.sh 'firstargument secondargument'

Juga, saya tidak tahu sebelumnya jumlah argumen di dalamnya arguments.txt. Bisa ada nol atau lebih.

Federico Ponzi
sumber
Apa yang Anda gambarkan bukanlah perilaku default bash. Apakah Anda benar-benar menggunakan bash, atau shell lain (seperti zsh, yang akan melakukan ini)?
Patrick
@ Patrick Hai, ini benar-benar pesta. Tapi saya sudah mendapatkan jawabannya, terima kasih!
Federico Ponzi
Apakah Anda benar-benar menulis source test.sh "$arguments"dengan tanda kutip? Itu akan menjadi salah satu penjelasan untuk deskripsi Anda
glenn jackman
Saya mencoba dengan dan tanpa tanda kutip ganda. Dengan substitusi bash saya selalu mendapatkan singlequote. Jadi source test.sh "$arguments"dan source test.sh $argumentskeduanya menghasilkan source test.sh 'firstargument secondargument'.
Federico Ponzi

Jawaban:

6

Dengan asumsi setiap baris arguments.txtmewakili argumen terpisah, dengan bash 4 Anda dapat membaca arguments.txtke dalam array menggunakan mapfile(setiap baris dari file masuk sebagai elemen array, secara berurutan) dan kemudian meneruskan array ke perintah

mapfile -t <arguments.txt
source test.sh "${MAPFILE[@]}"

Keuntungannya adalah bahwa pemisahan pada ruang yang tertanam di dalam garis dihindari

Dengan versi bash yang lebih rendah

IFS=$'\n' read -ra arr -d '' <arguments.txt
source test.sh "${arr[@]}"
iruvar
sumber
Di dalam file arguments.txt argumen dipisahkan oleh ruang. Btw saya mencoba sesuatu yang sangat mirip menggunakan array dan untuk tetapi tidak berhasil dan tidak tahu mengapa. Terima kasih banyak!
Federico Ponzi
2

Anda dapat melakukannya dengan awk. Sebagai contoh:

arguments=`awk '{a = $1 " " a} END {print a}' arguments.txt`

Edit setelah membaca komentar Anda:

arguments=`awk '{i = 0; while(i<=NF){i++; a = a " "$i}} END {print a}'
Rim
sumber
1

Saya akan menyarankan menggunakan fungsi dengan while / do loop untuk beralih melalui file argumen.

Cukup buat file yang berisi fungsi dan panggil file test.sh di dalam fungsi untuk beralih melalui argumen yang terdapat dalam file arguments.txt.

#!/bin/sh
# Calling script

function_name ()
  {
    while read line;
      do
        . ~/path_to/test.sh $line
         do_something_commands # print to screen or file or do nothing
      done < ~/path_to_/argument_file.txt
  }

function_name # Call the function
  do_something_commands # print to screen or file or do nothing
Carl Lindgren
sumber