2011-08-05 25 views
11

tôi đang cố gắng để có được một kịch bản bash mà tạo ra JSDoc cho các thông số cho như thế nàylinux shell thêm vào thông số biến chỉ huy

./jsdoc.sh file.js another.js maybe-a-third.js 

Tôi đang bị mắc kẹt trên làm thế nào để vượt qua một số lượng chưa được biết các thông số để vỏ tiếp theo chỉ huy.

(còn, không biết làm thế nào để kiểm tra xem param tồn tại, chỉ khi không exitst if [ -z ... ])

Mã này làm việc cho đến hai thông số, nhưng rõ ràng không phải là cách đúng đắn để đi về nó ...

#!/bin/bash 

# would like to know how to do positive check 
if [ -z "$1" ] 
then echo no param 
else 
     d=$PWD 
     cd ~/projects/jsdoc-toolkit/ 

     # this bit is obviously not the right approach 
     if [ -z "$2" ] 
     then java -jar jsrun.jar app/run.js -a -t=templates/jsdoc/ $d/$1 
     else java -jar jsrun.jar app/run.js -a -t=templates/jsdoc/ $d/$1 $d/$2 
     fi 

     cp -R out/jsdoc $d 
fi 

Bất kỳ con trỏ nào khác về cách tôi có thể đạt được điều này sẽ được đánh giá cao.

Edit: Cập nhật kịch bản theo câu trả lời @ skjaidev của - hạnh phúc ngày;)

#!/bin/bash 

d=$PWD 

for i in $*; do 
    params=" $params $d/$i" 
done 

if [ -n "$1" ]; then 
     cd ~/projects/jsdoc-toolkit/ 
     java -jar jsrun.jar app/run.js -a -t=templates/jsdoc/ $params 
     cp -R out/jsdoc $d 
fi 
+1

Sử dụng '" $ @ "' thay vì '$ * 'để đảm bảo an toàn. Tôi cũng sẽ sử dụng 'if (($ #> 0))' - "$ #" là số đối số. –

Trả lời

11

$ * có tất cả các thông số. Bạn có thể lặp qua chúng

for i in $*; 
do 
    params=" $params $d/$i" 
done 
your_cmd $params 
+12

Trong trường hợp này, luôn luôn sử dụng '" $ @ "' thay vì '$ *' - trước đây sẽ giữ lại các đối số chứa khoảng trắng, sau đó sẽ bị tách từ vỏ. –

+0

+1 cho Glenn đó. – jman

+1

Mặc dù '" $ @ "' sẽ giữ khoảng trống trong phần mở rộng của nó, việc mở rộng tiếp theo của '$ i' sẽ hoàn tác tác dụng và khi' $ params' được mở rộng ở dòng cuối cùng thì tên tệp có khoảng trắng được nhúng sẽ vẫn dẫn đến nhiều các đối số mà người ta mong đợi. Một giải pháp cụ thể của Bash là sử dụng các mảng như được đề xuất bởi @glennjackman –

3

-n là nghịch đảo của -z, và "[email protected]" là cách kinh điển để vượt qua tất cả các thông số trên để một subcommand. Điều này và nhiều hơn nữa có thể được tìm thấy thông qua man bash.

+0

Thật tuyệt vời - gần như đã được giải quyết. Điều cuối cùng là làm thế nào để tôi thêm '$ d /' vào mỗi paramater, để bắt chước '$ d/$ 1 $ d/$ 2' nhưng với' $ @ '? –

12

Để xử lý các đối số chứa khoảng trắng, hãy sử dụng "[email protected]" để lặp lại và lưu trữ để sử dụng sau này trong một mảng.

#!/bin/bash 
if (($# == 0)); then 
    echo "usage: $0 file ..." 
    exit 
fi 
dir=$(pwd) 
declare -a params 
for file in "[email protected]"; do params+=("$dir/$file"); done 
cd ~/projects/jsdoc-toolkit/ 
java -jar jsrun.jar app/run.js -a -t=templates/jsdoc/ "${params[@]}" 
cp -R out/jsdoc "$dir" 
0

tính năng Bash cụ thể (mảng trong trường hợp này) có thể tránh được thông qua sử dụng cẩn thận của IFS biến và [email protected] tham số đặc biệt.

#!/bin/sh 

dir=$(pwd) 

NEW_ARGV="" 
# carefully modify original arguments individually and separate them with newlines 
# in a new variable (in case they contain spaces) 
NEW_ARGV="" 
for var in "${@}" 
do 
    NEW_ARGV="${NEW_ARGV} 
${dir}/${var}" 
done 

SV_IFS=${IFS} 
# temporarily set IFS to a newline as per NEW_ARGV setup 
IFS=" 
" 
# reset [email protected] with the modified newline-separated arguments 
set -- ${NEW_ARGV} 
IFS=${SV_IFS} 

# for testing, demonstrate each param is preserved 
c=0 
for i in "${@}" 
do 
    c=`expr ${c} + 1` 
    echo "args-via-var #${c}: \"${i}\"" 
done 

cd ~/projects/jsdoc-toolkit/ 
java -jar jsrun.jar app/run.js -a -t=templates/jsdoc/ "${@}" 
cp -R out/jsdoc "${dir}" 

Đó không phải là cần thiết để thiết lập lại [email protected], nhưng làm như vậy tránh rối tung với IFS ở nhiều nơi. Không qua [email protected], bạn phải đặt IFS ở mọi nơi mở rộng $NEW_ARGV.

Những người có mắt để xem chi tiết sẽ lưu ý rằng phương pháp này không bảo toàn các thông số khi chúng chứa các dòng mới. Có thể sử dụng bất kỳ ký tự điều khiển nào thay cho dòng mới, ngoại trừ khóa học NUL và có thể ASCII FS (tách tệp, aka ctrl-\) sẽ có ý nghĩa và rất khó xảy ra trong tên tệp hợp lệ.

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