Bash: странный результат синтаксического анализа?

У вас есть такие строки:

`/usr/bin/rsync -av /var/games/minecraft $BKDIR/games/minecraft --exclude 'plugins/dynmap/web'`

Обратные кавычки означают выполнение вывода команды между ними. Таким образом, команда rsyncзапускается, создает некоторый вывод, и оболочка пытается выполнить этот вывод . Просто уберите обратные галочки и все будет в порядке:

/usr/bin/rsync -av /var/games/minecraft $BKDIR/games/minecraft --exclude 'plugins/dynmap/web'

-1
04.12.2018, 00:05
1 ответ

$$— это специальная переменная, которая расширяется до идентификатора процесса оболочки, в данном случае в командной строке еще до запуска вашего скрипта. Попробуйте что-то вроде echo $$. Вам нужно будет экранировать знаки доллара с помощью обратной косой черты или поместить их в одинарные кавычки, чтобы они не расширялись, т.е. echo '$$$$'.

Двойные кавычки не помогают, они просто предотвращают разбиение расширенного значения на слова, как в случае с обычными переменными($fooи"$foo").

Кроме того, в вашем цикле вы shiftтолько один раз, даже в тех случаях, когда вы также используете второй аргумент. Это означает, что аргументы ваших опций также обрабатываются как сами опции :

.
$./test.sh --one --two --three --four --five xyz
--two
--three
--four
--five
xyz

Если вы этого не хотите, вам потребуется shiftдополнительное время после использования$2:

while [[ "$#" != 0 ]] ; do
  case "$1" in
    --one)
      varone="$2"
      shift
      ;;
    --two)
      vartwo="$2"
      shift
      ;;
    #...
  esac
  shift
done
0
28.01.2020, 05:12

Теги

Похожие вопросы