Проблемы со ссылками на аргументы командной строки UNIX - PullRequest
0 голосов
/ 14 октября 2010

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

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

. / Run abcd

abcd

вот что я получаю:

1 2 3 4

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

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

РЕДАКТИРОВАТЬ: Спасибо всем за ответы, но теперь у меня есть еще один вопрос: что, если вы хотите начать считать не с первого аргумента, а со второго или третьего? Итак, что бы я сделал, чтобы сказать UNIX для обработки элементовначиная со второй позиции и игнорируя первую?

Ответы [ 4 ]

1 голос
/ 14 октября 2010

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

for i in ${@:2}
do
  echo $i
done
1 голос
/ 14 октября 2010

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

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

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

#!/bin/sh

while [ $# -gt 0 ]; do
    x=$1
    shift
    echo ${x}
done
1 голос
/ 14 октября 2010
echo $*

$ x - это не x-й аргумент.Это переменная x, а expr $x+1 похож на x ++ в других языках.

0 голосов
/ 14 октября 2010

Решение, не использующее shift:

#!/bin/sh

for arg in "$@"; do
  printf "%s " "$arg"
done
echo
...