Как предотвратить разделение слов без предотвращения удаления пустой строки?

Моя первая рекомендация - автоматическое обновление системы.

Если предположить, что это система Debian, вы можете найти эквивалентные команды.

apt-get update
apt-get upgrade

Поместите их в ежедневное задание cron , чтобы регулярно обновлять. Однако иногда делайте это вручную, так как иногда эти обновления требуют ручного ввода. Новые версии apt-get также поддерживают автоматический переключатель для обновлений, но мне все равно нравится время от времени запускать его сам. Дает мне душевное спокойствие.

Тогда я рекомендую вам найти EOL (конец жизни) дистрибутива Linux, который вы развернули.

Предполагая, что система Debian, вы можете найти их все на этой странице. https://wiki.debian.org/DebianReleases

Например, на момент написания этого сообщения:

Version Code name   Release date        End of life date
8.0     Jessie      April 25th 2015     ~June 6th 2018 (full) / ~June 6th 2020 (LTS)

Это дает вам крайний срок 6 июня 2018 г. , если вы установили Jessie , где вам следует вернуться и обновить исходные коды Apt, чтобы перейти к следующей версии.

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

Не позволяйте вашему серверу участвовать в следующем https://shodan.io общемировом отчете об уязвимостях.

Некоторые другие шаги, которые могут иметь отношение к вашим потребностям:

  • Настройте других пользователей как обычных пользователей с ID> 1000
  • Настройте задание cron, чтобы сообщать вам обо всех файлах, доступных для записи во всем мире, по электронной почте
  • Отключить root-пароль входит в систему из SSH, чтобы избежать грубого взлома изнутри

6
29.12.2016, 21:00
3 ответа

Форма $ {параметр: + word} расширение параметра , похоже, выполняет свою работу

( xyz=2; set -- ${xyz:+"$xyz"}; echo $# )
1

( xyz=; set -- ${xyz:+"$xyz"}; echo $# )
0

( unset xyz; set -- ${xyz:+"$xyz"}; echo $# )
0

Так что в вашем случае это должно быть преобразовано в

program ${var:+"$var"}

7
27.01.2020, 20:22

Непонятно, что вы пытаетесь сделать, но не достаточно ли простого? Например:

[[ ! -z "$var" ]] && call_program_with_arg "$var" 

или

if [[ ! -z "$var" ]];then call_program "$var";fi

Если $ var пусто, ничего не происходит. Если не пусто, то вызовите нужную программу.

После обновления вопроса:

parameters=( "Param1" "Param2" )
[[ ! -z "$var" ]] && parameters+=( "$var" "Param4") || parameters+=( "Param4" )
java -cp /etc/etc MyClass "${parameters[@]}"

Тестирование:

$parameters=( "Param1" "Param2" );var="my file.java";[[ ! -z "$var" ]] && parameters+=( "$var" "Param4") || parameters+=( "Param4" );echo java -cp /etc/etc MyClass "${parameters[@]}"                                                                                                              
>java -cp /etc/etc MyClass Param1 Param2 my file.java Param4
$parameters=( "Param1" "Param2" );var="";[[ ! -z "$var" ]] && parameters+=( "$var" "Param4") || parameters+=( "Param4" );echo java -cp /etc/etc MyClass "${parameters[@]}"                                                                                                               
>java -cp /etc/etc MyClass Param1 Param2 Param4 
3
27.01.2020, 20:22

В bash и оболочках с аналогичной поддержкой массивов вы можете сделать следующее:

# default is an empty array
param=()

# if $var is not empty then add it to array
[[ "$var" ]] && param=("$var")

# use the $@-like magic for arrays
java -cp /etc/etc MyClass param1 param2 "${param[@]}" param4

Демо

demo() {
  [[ "$var" ]] && param=("$var") || param=()

  echo -n 'output: '
  printf '<%s> ' before "${param[@]}" after
  echo
}

demo # output: <before> <after> 

var=''
demo # output: <before> <after> 

var='foo bar'
demo # output: <before> <foo bar> <after> 

Примечание

См. Также https://github.com/koalaman/shellcheck/wiki/SC2086#exceptions , где снова объясняется подход из ответа iruvar .

5
27.01.2020, 20:22

Теги

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