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.


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[@]}"

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}'

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.