2010-10-14 2 views
0

Я пытаюсь сообщить unix, чтобы распечатать аргументы командной строки, переданные сценарию Bourne Shell, но он не работает. Я получаю значение x в выражении echo, а не аргумент командной строки в нужном месте.Ссылка на аргумент командной строки UNIX

Это то, что я хочу:

./run абвг

б с d

это то, что я получаю:

Что ' продолжается? Я знаю, что UNIX запутано, как в то, что я ссылку в сценарии оболочки (переменный й или аргумент командной строки в позиции x'th». Как я могу пояснить, что я имею в виду?

#!/bin/sh 
x=1 
until [ $x -gt $# ] 
do 
echo $x 
x=`expr $x + 1` 
done 

EDIT : Спасибо всем за ответы, но теперь у меня есть другой вопрос: что, если вы хотите начать подсчет не по первому аргументу, а на втором или третьем? Итак, что бы я сделал, чтобы сообщить UNIX обрабатывать элементы, начиная с второе положение, и игнорировать первый?

ответ

1
echo $* 

$ й не Xth аргумента. это переменные х и expr $x+1 подобно х ++ на других языках.

+0

Хм ... хорошо. Но что, если я захочу начать печатать во втором аргументе? Поэтому вместо того, чтобы печатать b c d, он просто распечатывал b c d? – Waffles

1

Самое простое изменение в сценарий, чтобы сделать это делать то, что вы спросили это:

#!/bin/sh 
x=1 
until [ $x -gt $# ] 
do 
    eval "echo \${$x}" 
    x=`expr $x + 1` 
done 

ОДНАКО (и это большой однако), с помощью Eval (особенно на входе пользователя) является огромным проблема безопасности. Лучший способ заключается в использовании сдвига и первый позиционный переменный аргумент так:

#!/bin/sh 

while [ $# -gt 0 ]; do 
    x=$1 
    shift 
    echo ${x} 
done 
+0

Как добавленное примечание, если вы используете функции, то позиционные аргументы являются аргументами функции, а не аргументами программы. Это полезно, но что-то нужно знать. – kanaka

1

Если вы хотите начать подсчет 2-й аргумента

for i in ${@:2} 
do 
    echo $i 
done 
Смежные вопросы