Имеет ли сценарий оболочки аналогичный тип списка python [duplicate]

В Python обычно используются 4 скобки ().

  1. Он действует так же, как и большинство других основных языков - это конструкция, которая вынуждает приоритет оценки, например в математической формуле. Это также означает, что он используется только тогда, когда это необходимо, например, когда вам нужно убедиться, что добавления и вычитания происходят сначала перед умножениями и делениями.
  2. Это конструкция для группировки неизменяемых значений вместе в том же духе, что и аналогичная запись набора в математике. Мы называем это кортежем в Python. Кортеж также является основным типом. Это конструктор, который создает пустой кортеж и повышает приоритет приоритета оператора.
  3. Он используется для группировки импортированных имен в операторах импорта, поэтому вам не нужно использовать разделитель нескольких строк \. Это в основном стилистика.
  4. В таких длинных инструкциях, как

    decision = (is_female and under_30 and single
                or
                is_male and above_35 and single)

, скобка является альтернативным синтаксисом, чтобы избежать попадания в столбик 80 и использовать \ для продолжения инструкции.

В любых других случаях, например, внутри предикатов if, while, for и return я настоятельно рекомендую не использовать (), если это необходимо или удобство чтения (определяется 4 пунктами выше). Один из способов получить эту точку в том, что в математике (1) и просто 1 означает точно то же самое. То же самое справедливо и в Python.

Люди, идущие из языков C-семейства, немного привыкнут к этому, потому что () необходимы в предикатах потока управления на этих языках по историческим причинам .

Последнее слово для операторов return, если вы только возвращаете 1 значение, опустите (). Но если вы возвращаете несколько значений, нормально использовать (), потому что теперь вы возвращаете группировку, а () обеспечивает визуальную визуализацию. Однако этот последний момент стилистичен и подчинен предпочтению. Помните, что ключевые слова return возвращают результат инструкции. Поэтому, если вы используете только , в своих операторах множественного присваивания и конструкциях кортежей, опустите (), но если вы используете () для распаковки значений и кортежей, используйте (), когда вы возвращаете несколько значений в return. Держите его согласованным.

42
задан codeforester 3 June 2017 в 20:27
поделиться

7 ответов

Вы могли бы сделать:

if [[ " ${arr[*]} " == *" d "* ]]; then
    echo "arr contains d"
fi

Это даст ложные срабатывания, например, если вы ищете «a» - эта подстрока находится в объединенной строке, но не как элемент массива.

Самый безопасный способ - перебрать массив, пока не найдете элемент:

array_contains () {
    local seeking=$1; shift
    local in=1
    for element; do
        if [[ $element == $seeking ]]; then
            in=0
            break
        fi
    done
    return $in
}

arr=(a b c "d e" f g)
array_contains "a b" "${arr[@]}" && echo yes || echo no    # no
array_contains "d e" "${arr[@]}" && echo yes || echo no    # yes

Вот «чистая» версия, в которой вы просто передайте имя массива, а не все его элементы

array_contains2 () { 
    local array="$1[@]"
    local seeking=$2
    local in=1
    for element in "${!array}"; do
        if [[ $element == $seeking ]]; then
            in=0
            break
        fi
    done
    return $in
}

array_contains2 arr "a b"  && echo yes || echo no    # no
array_contains2 arr "d e"  && echo yes || echo no    # yes
67
ответ дан glenn jackman 15 August 2018 в 16:31
поделиться
  • 1
    Этот код работает как для числовых, так и для строковых значений? Например, если мой массив содержит как строки, так и массив, могу ли я искать их? – QuantumLicht 16 January 2013 в 23:17
  • 2
    да. Bash обрабатывает числовые значения как строки без затруднений – glenn jackman 17 January 2013 в 03:49
  • 3
    @glennjackman, пожалуйста, скажите мне, почему shift требуется здесь – Lorinc Nyitrai 11 July 2014 в 12:43
  • 4
    для удаления первого элемента позиционных параметров. – glenn jackman 11 July 2014 в 16:44
  • 5
    В моей реализации мне пришлось изменить & quot; $ {! Array} & quot; к & quot; $ {array [@]} & quot; работать. Я оценил "array_contains & quot;" и "array_contains2" предложения более безопасны, потому что многие, кто использует grep, возвращают ложные срабатывания. – Eduardo Lucio 5 August 2015 в 16:12

FWIW, вот что я использовал:

expr "${arr[*]}" : ".*\<$item\>"

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

0
ответ дан Edward Falk 15 August 2018 в 16:31
поделиться

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

Например, чтобы найти индекс 'd':

arr=(a b c d)    
temp=`echo ${arr[@]}`
temp=( ${temp%%d*} )
index=${#temp[@]}

Вы можете превратить это в функцию, подобную:

get-index() {

    Item=$1
    Array="$2[@]"

    ArgArray=( ${!Array} )
    NewArray=( ${!Array%%${Item}*} )

    Index=${#NewArray[@]}

    [[ ${#ArgArray[@]} == ${#NewArray[@]} ]] && echo -1 || echo $Index

}

. Тогда вы могли бы вызвать:

get-index d arr

, и она будет откликнуться назад 3, что было бы назначено с помощью:

index=`get-index d arr`
1
ответ дан Jasonovich 15 August 2018 в 16:31
поделиться

Если элементы массива не содержат пробелов, другое (возможно, более читаемое) решение будет:

if echo ${arr[@]} | grep -q -w "d"; then 
    echo "is in array"
else 
    echo "is not in array"
fi
11
ответ дан jesjimher 15 August 2018 в 16:31
поделиться
  • 1
    +1. Хороший ответ. Это решение работает для меня, чтобы проверить, существует ли число в массиве чисел. В то время как решение @Steven Penny не работает на 100% правильно в моем случае для массива чисел. if echo $ {combination_p2_idx [@]} | grep -q -w $ subset_id; тогда – Good Will 8 September 2016 в 17:54
  • 2
    Я согласен с @GoodWill. Это должен быть принятый ответ. Другие варианты были не такими надежными. – Grr 10 February 2017 в 16:35

1) Инициализировать массив arr и добавить элементы

2) задать переменную для поиска SEARCH_STRING

3) проверить, содержит ли ваш массив элемент

arr=()
arr+=('a')
arr+=('b')
arr+=('c')

SEARCH_STRING='b'

if [[ " ${arr[*]} " == *"$SEARCH_STRING"* ]];
then
    echo "YES, your arr contains $SEARCH_STRING"
else
    echo "NO, your arr does not contain $SEARCH_STRING"
fi
5
ответ дан Marcin Wasiluk 15 August 2018 в 16:31
поделиться
  • 1
    Это был единственный ответ в теме, который работал для меня, спасибо! – Sishaar Rao 10 March 2017 в 04:03
  • 2
    Это фантастически лаконично, и я смог использовать это с помощью BASH_ARGV, чтобы проверить, было ли задано определенное слово в качестве аргумента, для которого требуется другое одноразовое настроение, без необходимости делать какой-то argparse, который является излишним для Это дело. – dragon788 1 June 2018 в 14:13
array=("word" "two words") # let's look for "two words"

с использованием grep и printf:

(printf '%s\n' "${array[@]}" | grep -x -q "two words") && <run_your_if_found_command_here>

с помощью for:

(for e in "${array[@]}"; do [[ "$e" == "two words" ]] && exit 0; done; exit 1) && <run_your_if_found_command_here>

Для not_found результатов добавьте || <run_your_if_notfound_command_here>

0
ответ дан Qwerty 15 August 2018 в 16:31
поделиться

Очевидные предостережения в стороне, если ваш массив действительно похож на тот, что указан выше, вы можете сделать

if [[ ${arr[*]} =~ d ]]
then
  do your thing
else
  do something
fi
22
ответ дан Steven Penny 15 August 2018 в 16:31
поделиться
  • 1
    +1 для обучения чему-то новому. Но d будет соответствовать xdy. – Olaf Dietsche 16 January 2013 в 22:20
  • 2
    @OlafDietsche Это можно решить, написав его if [[ ${arr[*]} =~ $(echo '\<d\>') ]] ( source ) – Stefan van den Akker 9 August 2014 в 13:51
  • 3
    Спасибо, что было полезно. Но как я могу отрицать результат, если у меня нет другого? Это сэкономит некоторый избыточный код. @Steven Penny – Sven M. 14 May 2017 в 22:02
  • 4
    @SvenM. если [[ ! $ {arr [*]} = ~ d]]? – rwenz3l 12 June 2017 в 08:19