Незначительная проблема со сценариями bash, чтобы заставить функцию принимать все аргументы после первоначального вызова функции в виде одной строки - PullRequest
2 голосов
/ 02 августа 2010

Я пытаюсь написать простой bash-скрипт, который принимает все аргументы и интерпретирует их просто как строку.

Другими словами: tweet Testing out my command-line tweetings. #commandlinetweets

Принимает все аргументы и просто использует их прямо как строку.

Вот основная форма, которая у меня есть на данный момент:

function tweet()
{
echo "Tweeting using curl."
curl -u tchalvak "http://twitter.com/statuses/update.xml" -d status="$@"
echo "Tweet done if spammed info back above."
echo "Tweeted using username tchalvak with status $@"
}

Прямо сейчас ошибочный результат запуска функции:

$ tweet TEst again and again and again.
Tweeting using curl.
Enter host password for user 'tchalvak':
<?xml version="1.0" encoding="UTF-8"?>
<hash>
  <request>/statuses/update.xml</request>
  <error>Status is a duplicate.</error>
</hash>
curl: (6) Couldn't resolve host 'again'
curl: (6) Couldn't resolve host 'and'
curl: (6) Couldn't resolve host 'again'
curl: (6) Couldn't resolve host 'and'
curl: (6) Couldn't resolve host 'again.'
Tweet done if spammed info back above.
Tweeted using username tchalvak with status TEst again and again and again.

Итак, как мне получить из нескольких аргументов, что «все эти технически множественные аргументы должны учитываться как одна строковая переменная внутри функции»?

Редактировать : Извините, я должен уточнить, что я решил жестко закодировать имя пользователя для максимальной пуленепробиваемости синтаксиса твита.

Окончательное решение (до тех пор, пока вы игнорируете проблемы интерпретации команд, такие как #, хэши не проходят и подобные проблемы, которые вызовет этот грязный метод, хе):

function tweet()
{
STATUS="$*"
echo "Tweeting using curl."
curl -u tchalvak "http://twitter.com/statuses/update.xml" -d status="$STATUS"
echo "Tweet done if spammed info back above."
echo "Tweeted using username tchalvak with status $STATUS"
}

Ответы [ 4 ]

2 голосов
/ 02 августа 2010

$ 1 будет именем пользователя
, а тест будет текстом, который вы хотите отправить в Твиттере
Shift пропустит $ 1
, используйте $ * для использования остальных аргументов

USER=$1
shift
STATUS="$*"
echo "Tweeting using curl."
curl -u $USER "http://twitter.com/statuses/update.xml" -d status="$STATUS"
echo "Tweet done if spammed info back above."
echo "Tweeted using username $USER with status $STATUS"

образец выводится следующим образом

./tweet tchalvak TEst again and again and again.
Tweeting using curl.
Enter host password for user 'tchalvak':
Tweet done if spammed info back above.
Tweeted using username tchalvak with status TEst again and again and again.
1 голос
/ 02 августа 2010

Почему бы не использовать кавычки -

Вызов функции с: tweet "bla bla bla"

и вместо $ @ используйте "$ {1}", чтобы указать всю строку в качестве первого аргумента.

1 голос
/ 02 августа 2010
tweet "TEst again and again and again."

Ваш вызов передается в 6 отдельных аргументах, а "$@" передает их правильно, как шесть. Эта команда имеет один аргумент, который будет передан как один.

добавлено в ответ на комментарий :

bind_args() {
    $url = $1;
    shift;
    echo "url is $url with $# arguments"
    set -- "$*"
    echo "now there is only $# argument: |$1|"
}

Где url и shift там, если вам нужно что-то подобное. Очевидно, что ключом является «$ *», что не является особенным в том смысле, в котором «$ @» является особенным. set -- сбрасывает позиционные параметры.

В качестве личного удобства это нормально, но, вероятно, это сбивает с толку людей, которые ожидают нормального поведения оболочки

0 голосов
/ 02 августа 2010

Используйте «$ *» вместо «$ @». Со страницы руководства bash:

       *      Expands to the positional parameters, starting from one.  When the expansion
              occurs  within  double quotes, it expands to a single word with the value of
              each parameter separated by the first character of the IFS special variable.
              That  is,  "$*" is equivalent to "$1c$2c...", where c is the first character
              of the value of the IFS variable.  If IFS is unset, the parameters are sepa-
              rated  by  spaces.  If IFS is null, the parameters are joined without inter-
              vening separators.
       @      Expands to the positional parameters, starting from one.  When the expansion
              occurs  within  double  quotes,  each  parameter expands to a separate word.
              That is, "$@" is equivalent to "$1" "$2" ...  If the double-quoted expansion
              occurs  within  a  word, the expansion of the first parameter is joined with
              the beginning part of the original word,  and  the  expansion  of  the  last
              parameter is joined with the last part of the original word.  When there are
              no positional parameters, "$@" and $@ expand  to  nothing  (i.e.,  they  are
              removed).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...