Truyền đối số từ tệp vào tập lệnh bash


10

Tôi đã gặp tình huống này:

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

Bên trong myscript.sh, tôi phải chạy tập tin test.sh, chuyển cho nó các đối số chứa bên trong arguments.txt.

myscript.sh là:

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

Điều này hoạt động tốt nếu nếu argument.txt chứa nhiều nhất một đối số:

firstargument 

Sự thay thế là:

++ source test.sh 'firstargument'

Nhưng vấn đề là với hai hoặc nhiều đối số. Nó làm điều này:

++ source test.sh 'firstargument secondargument'

Ngoài ra, tôi không biết trước số lượng đối số bên trong arguments.txt. Có thể có 0 hoặc nhiều hơn.


Những gì bạn đang mô tả không phải là hành vi mặc định của bash. Bạn có thực sự sử dụng bash, hoặc một số shell khác (chẳng hạn như zsh, sẽ làm điều này)?
Patrick

@Patrick Xin chào, đó là bash thực sự. Btw tôi đã có câu trả lời cảm ơn nào!
Federico Ponzi

Bạn đang thực sự viết source test.sh "$arguments"với dấu ngoặc kép? Đó sẽ là một lời giải thích cho mô tả của bạn
glenn jackman

Tôi đã thử cả có và không có dấu ngoặc kép. Với sự thay thế của bash, tôi luôn nhận được một lần duy nhất. Vì vậy, source test.sh "$arguments"source test.sh $argumentscả hai kết quả trong source test.sh 'firstargument secondargument'.
Federico Ponzi

Câu trả lời:


6

Giả sử mỗi dòng arguments.txtđại diện cho một đối số riêng biệt, với bash 4, bạn có thể đọc arguments.txtvào một mảng bằng cách sử dụng mapfile(mỗi dòng từ tệp đi vào dưới dạng một phần tử mảng, theo thứ tự) và sau đó chuyển mảng cho lệnh

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

Ưu điểm là tránh chia tách trên các không gian được nhúng bên trong các dòng

Với các phiên bản thấp hơn của bash

IFS=$'\n' read -ra arr -d '' <arguments.txt
source test.sh "${arr[@]}"

Trong tệp argument.txt, các đối số được phân tách bằng dấu cách. Btw tôi đã thử một cái gì đó rất giống nhau bằng cách sử dụng mảng và một for nhưng không hoạt động và không biết tại sao. Vâng, cảm ơn rất nhiều!
Federico Ponzi

2

Bạn có thể làm điều này với awk. Ví dụ:

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

Chỉnh sửa sau khi đọc bình luận của bạn:

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

1

Tôi sẽ đề nghị sử dụng một hàm với vòng lặp while / do để lặp qua tệp đối số.

Chỉ cần tạo một tệp chứa hàm và sau đó gọi tệp test.sh trong hàm để lặp qua các đối số có trong tệp argument.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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.