Каково значение $ {# 1}?

9

Пожалуйста, объясните использование ${#1}ниже:

getlable ()     
{
    if (( ${#1} == 0 )); then test="-"; else test="${1}"; fi;
}
Прасад
источник
1
Просто интересно: вы пытались поставить echo ${#1}перед этим утверждением, чтобы увидеть, какова ценность? Если это так, вы должны, как правило, включать в вопрос то, что вы нашли в этом исследовании, и, возможно, объяснение того, почему это не помогло.
jpmc26

Ответы:

24

${#1}длина (в количестве символов) $1которого является первым аргументом функции.

Таким образом (( ${#1} == 0 )), это сложный способ проверить, является ли первый аргумент пустым (или неустановленным, неустановленные параметры отображаются как пустые при расширении) или нет.

Чтобы проверить пустой параметр, каноническим способом является:

[ -z "$1" ]

Но там, более вероятно, намеревался проверить, был ли передан аргумент функции, и в этом случае синтаксис будет:

[ "$#" -eq 0 ]

(или (($# == 0))если вы хотите сделать свой скрипт специфичным для ksh / bash / zsh).

Однако в обоих случаях у оболочек типа Борна есть короткие пути:

test=${1:--} # set test to $1, or "-" if $1 is empty or not provided
test=${1--}  # set test to $1, or "-" if $1 is not provided

Теперь, если цель состоит в том, чтобы передать это catили другую текстовую утилиту так, чтобы -(то есть stdin) передавался, когда не предоставлен аргумент, тогда вам может вообще не понадобиться ничего из этого.

Вместо:

getlable() {
  test=${1--}
  cat -- "$test"
}

Просто делать:

getlable() {
  cat -- "$@"
}

Список аргументов функции будет передан как есть cat. Если аргумента нет, аргумент не catбудет получен (а затем считан из стандартного ввода, как если бы это был один -аргумент). И если есть один или несколько аргументов, все они будут переданы как есть cat.

Стефан Шазелас
источник
вот как вы
дадите
4

${#1} длина первого позиционного параметра.

В запущенной оболочке вы можете использовать

set -- foo bar
echo ${#1}
3

установить их.

Хауке Лагинг
источник