Что делать с необязательным вводом в сценарии оболочки?

No estoy seguro de si esto causa el problema, pero la siguiente parte de la configuración es definitivamente incorrecta:

add_header Strict-Transport-Security "max-age=31536000;
#includeSubDomains" always;

Esto dará como resultado el siguiente encabezado de respuesta HTTP:

Strict-Transport-Security: max-age=31536000;
   #includeSubDomains: 

Parece que olvidó cerrar la cita en la configuración, por lo que da como resultado un encabezado corrupto. Algunos navegadores ignoran tales encabezados rotos, otros no.

3
20.07.2019, 10:08
1 ответ

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

Расширение параметра ${$1:-5}недействительно и должно быть записано как ${1:-5}, чтобы оно расширялось до 5, если $1пусто или не установлено.

Кроме того, ваш awkкод вызывает sort, который немного запутан, в частности потому, что его можно легко вставить в конвейер как собственную стадию:

awk '{ print length(), NR, $0 }' unix1.txt | 
sort -rn |
head -n "${1:-5}" |
sed 's/[^ ]* //' |
sort -n

Чтобы немного упростить (замените sedнаcut)и чтобы сделать вывод более «табличным», мы можем вывести промежуточный результат из awkс табуляцией в качестве разделителя вывода:

awk -v OFS="\t" '{ print length(), NR, $0 }' unix1.txt | 
sort -rn |
head -n ${1:-5} |
cut -f 2- |
sort -n

Для данных данныхэто выведет следующее для количества строк вывода по умолчанию:

2       kbjkbkbbnbnmbnmnmmnbmnbmjbjkb
4       asjdsakdbakjsdbasbkj
5       asjdsakdbakjsdbasbkj
16      ffdsdfggdgdgdfgdfgdf112233
17      qwertyuiopsdfghjklxcvbnm,fghjk

Чтобы обработать несколько файлов в вашем скрипте, я бы предложил зациклиться на заданных именах файлов. Может что-то вроде

#!/bin/sh

n=${1:-5}
shift

for name do
    if [ "$#" -gt 1 ]; then
        printf 'File: %s\n' "$name"
    fi

    awk -v OFS="\t" '{ print length(), NR, $0 }' "$name" | 
    sort -rn |
    head -n "$n"
    cut -f 2- |
    sort -n
done

Этот сценарий будет вызываться как

./script.sh 10 file1 file2 file3 etc

Обратите внимание, что это требует , чтобы первый аргумент всегда был числом (и чтобы в сценарии не было ничегоbash-определенного, поэтому я использую /bin/shв качестве интерпретатора )]. Чтобы использовать правильные параметры командной строки для присвоения номера сценарию, например. как

./script -n 10 file1 file2

вам придется изучить возможность использования getoptsдля синтаксического анализа командной строки. На этом сайте (есть много примеров тому, что вы можете начать с тега ).

4
27.01.2020, 21:17

Теги

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