2012-06-22 25 views
5

Vì vậy, tôi có một kịch bản bash mà cần phải có một số tùy ý các đối số dòng lệnh và đặt chúng vào một chuỗi duy nhấtgrabbing tất cả các đối số sau tranh luận thứ n và concatenating chúng lại với nhau trong bash

Ví dụ về những gì người dùng sẽ gõ in:

give <environment> <email> <any number of integers separated by spaces> 
give testing [email protected] 1 2 3 4 5 

Tôi muốn nhận tất cả các đối số từ $ 3 đến $ # và ghép chúng vào một chuỗi.

của tôi (có lẽ là khủng khiếp) giải pháp ngay bây giờ là

if [ $# -gt 3 ] 
then 
    env="env="$1 
    email="email="$2 
    entList="" 

    for i in {3..$#} 
    do 
     if [ $i -eq 3 ] 
      then 
        entList=$3 
        shift 
      fi; 
      if [ $i -gt 3 ] 
      then 
        entList=$entList","$3 
        shift 
      fi; 
    done 
fi; 

tôi xử lý các trường hợp chỉ có ba đối số khác một chút, và rằng một hoạt động tốt.

giá trị cuối cùng của $entList cho ví dụ give testing [email protected] 1 2 3 4 5 nên là: 1,2,3,4,5

Ngay bây giờ khi tôi chạy này tôi nhận được lỗi sau:

/usr/local/bin/ngive.sh: line 29: [: {3..5}: integer expression expected 
/usr/local/bin/ngive.sh: line 34: [: {3..5}: integer expression expected 

dòng 29 và 34 là:

line 29: if [ $i -eq 3 ] 
line 34: if [ $i -gt 3 ] 

Mọi trợ giúp sẽ được đánh giá cao.

+1

Một giải pháp chung là lưu 3 đối số đầu tiên, ví dụ: trong biến: 'var1 =" $ 1 "; var2 = "$ 2"; var3 = "$ 3" 'và sau đó sử dụng' shift 3' để loại bỏ 3 đối số đầu tiên, và sau đó sử dụng '" $ * "' để tạo một chuỗi chứa các thông số khác, dấu cách cách nhau: 'rest =" $ * "' . –

Trả lời

6

Bạn đang đi đúng hướng. Dưới đây là gợi ý của tôi:

if [ $# -ge 3 ]; then 

    env="$1" 
    email="$2" 
    entlist="$3" 

    while shift && [ -n "$3" ]; do 
    entlist="${entlist},$3" 
    done 

    echo "entlist=$entlist" 

else 

    echo "Arguments: $*" 

fi 

Lưu ý rằng các biến nên luôn luôn được đặt bên dấu ngoặc kép. Tôi không chắc tại sao bạn lại thiết lập env=env=$1, nhưng tôi nghi ngờ rằng nếu bạn muốn tái chế giá trị đó sau này, bạn nên làm điều đó theo chương trình thay vì bằng cách đánh giá biến như thể nó là một câu lệnh, trong trường hợp đó là kế hoạch của bạn.

4

Skip đầu tiên ba đối số sử dụng một mảng con:

all=(${@}) 
IFS=',' 
threeplus="${all[*]:3}" 
+0

Chỉ cần rõ ràng, việc gán cho 'IFS' và mảng được trích dẫn với' * 'làm chỉ số làm cho ký tự đầu tiên của nội dung' IFS' được xuất ra giữa mỗi phần tử của mảng. –

1

Lý do bạn đang nhận được những thông báo lỗi là trong:

for i in {3..$#} 

Việc mở rộng cú đúp được thực hiện trước khi việc mở rộng tham số và vì vậy tuyên bố if sau đây được đánh giá là:

if [ {3..$#} -eq 3 ] 

không hợp lệ.

Thay đổi tuyên bố for bạn để sử dụng C phong cách:

for ((i = 3; i <= $#; i++)) 

Sử dụng phong cách này để so sánh số nguyên:

if (($# > 3)) 

if ((i == 3)) 

if ((i > 3)) 

Đặt thông số của bạn bên trong dấu ngoặc kép:

env="env=$1" 
email="email=$2" 

entList="$entList,$3" 

mặc dù có dấu ngoặc kép là không cần thiết kể từ khi chia tách từ không được thực hiện ở phía bên phải của một bài tập và bạn' không gán các ký tự đặc biệt như khoảng trắng, dấu chấm phẩy, đường ống, vv

Các vấn đề liên quan