Bash: Краткий способ перебора строк из аргументов stdin или командной строки?

Попробуйте установить nix, используя PRoot . Или вы можете собрать для вашего пользовательского префикса:

NIX_STORE_DIR=/opt/custom/store \
NIX_STATE_DIR=/opt/custom/var/nix \
NIX_DB_DIR=/opt/custom/var/nix/db \
    nix-build ...

3
23.03.2018, 16:37
2 ответа

Создайте данные для вашего лупа while read:

#!/bin/sh

if [ "$#" -gt 0 ]; then
    # We have command line arguments.
    # Output them with newlines in-between.
    printf '%s\n' "$@"
else
    # No command line arguments.
    # Just pass stdin on.
    cat
fi |
while IFS= read -r string; do
    printf 'Got "%s"\n' "$string"
done

Обратите внимание, что ваш пример concatможет быть выполнен с заменой петли while readна tr '\n' ','или аналогичной.

Кроме того, тест -tничего не говорит о том, есть ли у вас аргументы командной строки или нет.


В качестве альтернативы, для обработки аргументов командной строки и стандартного ввода (в указанном порядке):

#!/bin/sh

{
    if [ "$#" -gt 0 ]; then
        # We have command line arguments.
        # Output them with newlines in-between.
        printf '%s\n' "$@"
    fi

    if [ ! -t 0 ]; then
        # Pass stdin on.
        cat
    fi
} |
while IFS= read -r string; do
    printf 'Got "%s"\n' "$string"
done

Или, используя сокращенную -нотацию, которая нравится некоторым людям:

#!/bin/sh

{
    [ "$#" -gt 0 ] && printf '%s\n' "$@"
    [ ! -t 0 ]     && cat
} |
while IFS= read -r string; do
    printf 'Got "%s"\n' "$string"
done
9
27.01.2020, 21:09

В частности, с bashможно сделать:

if [ -t 0 ]; then
  args=("$@")
else
  readarray -t args
fi
for i in "${args[@]}"; do
  ...
done
2
27.01.2020, 21:09

Теги

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