В сценарии оболочки bash может $ 2 равняться нескольким аргументам в командной строке, или мне нужно $ 3, $ 4 и т. Д.?

Файлы, имена которых украшены UUID и расширением 'dtapart', как это, скорее всего, являются частично загруженными файлами, сгенерированными менеджером загрузки DownThemAll . Если это так, причина, по которой он не может быть вызван должным образом, заключается в том, что это была незавершенная загрузка.

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

0
13.07.2017, 00:21
3 ответа

$2всегда будет только вторым аргументом. $@— это массив всех аргументов, поэтому, если вам нужно второе до конца, вы можете сделать:

... | mailx -s "MS_CASE_ST*.csv file contains data.  Please research" "${@:2}"

:2указывает смещение в расширении параметра при расширении массива $@

7
28.01.2020, 02:13

Для поддержки нескольких получателей с этим конкретным скриптом используйте $1в качестве элемента пути, а затем уберите его из списка позиционных параметров. Теперь список $@содержит только получателей.

#!/bin/bash

dir=$1
shift

shopt -s nullglob

for file in "/usr/app/tst/$dir/MS_CASE_ST"*.csv; do
    uuencode "$file" "$( basename "$file" )"  # or uuencode "$file" "${file##*/}"
done | mailx -s 'MS_CASE_ST*.csv file(s) contains data. Please Research' "$@"

Несколько замечаний:

  • Будьте осторожны и используйте двойные кавычки для любых расширений переменных, иначе у вас возникнут проблемы, когда имя пути содержит пробелы или подстановочные символы имени файла и т. д. (и статические строки с одинарными кавычками ).

  • Заключение $@как "$@"гарантирует, что оно расширяется до отдельных элементов в кавычках.

  • Установив параметр оболочки nullglobв bash, мы гарантируем, что шаблон подстановки, который использует цикл, расширяется до ничего , если он не соответствует ни одному существующему имени пути.

1
28.01.2020, 02:13

Этот вопрос, кажется, путает аргументы оболочки с командой read. Они разные:

  1. Оболочка:

    set -- foo bar baz buzz zap bang ; echo $2
    

    Выводится только второе слово:

    bar
    
  2. Команда readс двумя именами переменных:

    echo foo bar baz buzz zap bang | (read x y ; echo $y )
    

    Выводит все, включая второе слово и дальше:

    bar baz buzz zap bang
    
0
28.01.2020, 02:13

Теги

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