Как я могу свести к минимуму код, необходимый для запуска этой настраиваемой функции?

Я хотел бы сократить один из моих сценариев, и у меня есть идея na, но я не знаю, как это сделать. У вас есть такой код:

COMMAND="find /etc -type "
case $1:
 "directory") $COMMAND d
 ;;
esac

Конечно, это короткая версия :) И теперь я хочу уметь сокращать это, а не бушуть, что $ COMMAND везде, поэтому я хотел бы что-то вроде этого:

$COMMAND <the case statement return value>

, но я не хочу использовать переменную для хранения результата.

Спасибо :) Надеюсь, вы поняли, чего я хочу: D

EDIT 1: его можно создать функцию и передать параметр find как $ 1, как указано Serg. Теперь, ЕСЛИ я хотел сделать это просто без функции, я уверен, что есть способ: D Не так, как Серг не решал его, мне просто интересно: D

1
задан 12 November 2015 в 13:47

4 ответа

Поместите его в функцию:

MyFind () {
  COMMAND="find /etc -type "
  case $1:
   "directory") $COMMAND d
   ;;
  esac
}

Теперь вы всегда можете использовать его как MyFind $TYPE

Что касается вашего 1-го комментария [!d3 ]

Вы также можете поместить только оператор case в функцию

FType () {
  case $1 in
    "directory") echo d;;
    "file") echo f;;
  esac
}

COMMAND="find /etc -type "
$COMMAND $(FType $TYPE) 

4
ответ дан 23 May 2018 в 15:51
  • 1
    Я знаю, что могу пойти как в случае: «что-то»). $ Command d something command l something command s, но Id нравится избегать писать команду все время. Есть ли способ сделать это как: $ COMMAND {case case}? – IcyIcyIce 12 November 2015 в 06:54
[F1]
2
ответ дан 23 May 2018 в 15:51
  • 1
    Да, возможное решение, следовательно, поддерживается, но это означает, что OP должен написать несколько строк, подобных этому, для проверки нескольких типов. Например, для проверки всех типов, перечисленных на странице find man, это будет 8 строк кода. Это может работать для простых скриптов, но для сложных сценариев может быть избыточным, а структура case ...esac предпочтительнее, кроме того, что он выполняет ту же работу. Главное, однако, что OP хотел написать команду find один раз и просто дать букву в качестве аргумента для сортировки «стандартного». find, другими словами, упростить процесс. Nonethelss, мне нравится ваш ответ – Sergiy Kolodyazhnyy 12 November 2015 в 10:59
  • 2
    Замечание: нет необходимости заключать переменные, содержащие пробелы в двойных кавычках в [[]] (и строки без пробелов): [[ $1 == directory ]] [...]. – kos 12 November 2015 в 11:07

Другой подход:

declare -A foo    # associative array

foo["directory"]="d"
foo["file"]="f"
foo["link"]="l"

find /etc -type ${foo["$1"]}
2
ответ дан 23 May 2018 в 15:51

Еще одна идея добавить к уже широкому набору опций из превосходного ответа Сержа.

Возможно, вы сможете использовать alias для этого - возможно, с некоторыми небольшими изменениями в том, как вы сейчас это делаете вещи.

alias - это просто слово, которое вы выбираете для сопоставления с большей строкой, которую оболочка будет расширять каждый раз, когда она встречается с ней. Возможно, наиболее часто используемым случаем является применение «по умолчанию» к существующей команде, например:

alias ls='ls -a --color=auto'

Однако нет необходимости, чтобы ваш alias был назван в честь существующей команды - или даже короче, чем шаблон назначения - так что вы могли бы, например, alias tgzcreator='tar -czvf'

alias es используют ресурс с оболочкой, в которой они определены. «Persistent» alias es для вас можно настроить в ~/.bash_aliases, который должен быть автоматически загружен с помощью наиболее хорошо написанных сценариев .bashrc по умолчанию.

Обратите внимание на пару советов: [ ! d6] Вместо того, чтобы беспокоиться в конкретном сценарии, будет ли ранее установленный alias мешать вашему коду, вы можете префикс его с обратной косой чертой, чтобы предотвратить пропущение alias. например Обычно я alias cp до cp -i, чтобы случайно не перезаписывать вещи, но в некоторых сценариях я явно хочу перезаписать вещи. (Я не собираюсь использовать какое-то ужасное обходное решение, например, создание известного пользователя un alias ed!) Итак, в этом скрипте я буду использовать \cp src dst alias. Возможно, по умолчанию не найдены источники в сценариях оболочки , которые запускают свою собственную неинтерактивную копию оболочки. Вы можете убедиться, что они расширены, установив опцию expand_aliases в вашем скрипте. Я получил это от: https://stackoverflow.com/questions/2197461/how-to-set-an-alias-inside-a-bash-shell-script-so-that-is-it-visible-from-the -ou

Итак, исходя из ограниченного контекста, доступного в вашем сообщении, вы можете сделать что-то , если вот так:

shopt -s expand_aliases
alias get_etc_dir='find /etc -type d'
alias get_etc_fil='find /etc -type f'

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

(Также я бы предложил переместить это в Unix / Linux SE, считая, что это идеальный вариант для вещи, которые не являются специфичными для Ubuntu?)

1
ответ дан 23 May 2018 в 15:51
  • 1
    Очень хорошо. Я бы упростил это еще дальше: псевдоним расширяется до строки, точно так же, как присвоение переменной. Поэтому выполнение alias findStuff='find /etc/ -type, а затем вызов его с помощью findStuff d будет работать. Не уверен, что это будет работать в скрипте, хотя, поскольку я никогда не использовал псевдонимы в скриптах, в основном функции – Sergiy Kolodyazhnyy 12 November 2015 в 12:50
  • 2
    Правда. Когда я сказал, что он не поддерживает ту же параметризацию, что и исходный $COMMAND, я имел в виду условное сжатие параметра directory только в d. Вероятно, это должно быть сделано с использованием только одного из ваших методов, а не добавления alias в микс! Но да, конечно, если вам просто нужен параметр literal, просто введите его после. – underscore_d 12 November 2015 в 14:21

Другие вопросы по тегам:

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