Bash - присвоить массив в переменную как строку

Вы можете безопасно использовать ext3 с опцией noatime: тогда только фактические записи файлов будут касаться вашего флэш-устройства в режиме записи. Журнал ext3fs - хорошая вещь для встроенной системы, которая может внезапно остаться без питания.

Я лично эксплуатировал таким образом несколько Raspberry PI, оснащенных простыми картами памяти SD, в течение нескольких лет (24/7, без резервного копирования UPS и с внезапными перебоями питания), и мне еще не приходилось заменять карты, и у меня не было никаких проблем с запуском после восстановления питания.

Что касается vfat, как я уже говорил, журналирование является преимуществом.

Edit: более того, я запускаю их с rw-mounted root fs

3
08.01.2017, 07:49
4 ответа

конкретный ответ: whipe вилки !

Поскольку здесь уже используются bashisms, sed , tr или любой другой внешний инструмент бесполезны:

IFS='-' read -r -a host_name_array < <(hostname)
#removing the last part of string after last "-"
unset host_name_array[${#host_name_array[@]}-1]

shorted=${host_name_array[*]}
echo ${shorted// /-}

Или проще:

Это намного короче, быстрее и проще :

read myvar < <(hostname)
echo ${myvar%-*}

И если вам действительно нужен host_name_array по другим причинам:

read shorted < <(hostname)
host_name_array=(${shorted//-/ })
shorted=${shorted%-*}

Итак, у вас есть массив и сокращенное имя хоста:

declare -p host_name_array shorted

вернет что-то вроде:

declare -a host_name_array='([0]="tech" [1]="news" [2]="blog" [3]="324344")'
declare -- shorted="tech-news-blog"
0
27.01.2020, 21:11

(...) представляет подоболочку. Таким образом, $ URL не будет установлен после этого (все еще будет иметь значение, которое было до подоболочки). Вы хотите:

IFS=-
read -r -a host_name_array <<< "$(hostname)" 
unset 'host_name_array[${#host_name_array[@]}-1]'
URL="${host_name_array[*]}"

"$ {host_name_array [*]}" объединяет элементы в массивах по первому символу $ IFS точно так же, как "$ *" . в стандарте sh .

Если вы используете подоболочку потому, что вы не хотите изменять $ IFS глобально, вы можете сделать это в функции, в которой вы указываете $ IFS локальная область видимости:

f() {
  local IFS=-
  ...
}
f

Или используйте подстановку команд, которая также создает подоболочку, но позволяет передавать данные в родительскую оболочку:

URL=$(IFS=-; printf '%s\n' "${host_name_array[*]}")

Хотя здесь я бы использовал стандартное расширение sh , чтобы удалить этот конечный компонент:

URL=$(uname -n) # uname -n is the standard equivalent of hostname
URL=${URL%-*}

Он имеет несколько преимуществ по сравнению с вышеупомянутым:

  • он работает, даже если текст содержит символы новой строки (хотя здесь очень маловероятно для имен хостов);
  • если текст не содержит - , он ничего не удаляет,
  • он более эффективен. чтение <<< $ (имя хоста) означает запуск имя хоста , чтение его вывода через конвейер, сохранение его во временном файле и чтение чтение первой строки из этого;
  • он не забивает пространство имен переменных этими временными переменными
  • он короче,
  • он переносится. Нет необходимости устанавливать bash для запуска этого кода. Системный sh будет достаточно.

В любом случае, не забывайте заключать ваши переменные в кавычки при использовании их в контекстах списка:

printf '%s\n' "$URL"

При выполнении:

 echo $ URL 

Вы вызываете оператор split + glob. Итак, если $ IFS по-прежнему содержит - , этот $ URL будет разделен на - и echo выведет эти слова, разделенные пробелами.

2
27.01.2020, 21:11

Когда IFS = '-' читать -r -a host_name_array <<< "$ (hostname)" запущено, массив равен (блог технических новостей 324344) .

После удаления последнего элемента с unset 'host_name_array [$ {# host_name_array [@]} - 1]' , массив будет (блог технических новостей) .

Итак, чтобы передать это в echo tech-news-blog , необходимо будет выполнить некоторую замену, поскольку echo "$ {host_name_array [*]}" даст блог технических новостей :

С tr: echo "$ {host_name_array [*]}" | tr '' '-'

sed: echo "$ {host_name_array [*]}" | sed 's / / - / g'

3
27.01.2020, 21:11

Вы можете сделать это, выводя элементы, разделенные -, а затем отделить последние - путем расширения параметров:

$ var=$(printf '%s-' "${host_name_array[@]}")

$ echo "$var"
foo-bar-spam-egg-

$ var="${var%-}"

$ echo "$var"
foo-bar-spam-egg

Также вам нужно ${host_name_array[@]} вместо ${host_name_array[*]}, чтобы не выводить элементы целиком, разделенные первым символом IFS.


То, что вы пытаетесь сделать, может быть достигнуто простым расширением параметров:

${var%-*}

Пример:

$ var=$(hostname)

$ echo "${var%-*}"
3
27.01.2020, 21:11

Теги

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