Как я могу присвоить вывод команды к переменной оболочки?

Я пошел бы с этим как первый шаг:

ls /etc/*release

Хинду, RedHat, Arch & SuSE назвали файл, например. /etc/gentoo-release. Кажется, популярен, проверяет этот сайт о файлах версии.

Debian & Ubuntu должна иметь a /etc/lsb-release который содержит информацию о выпуске также и обнаружится с предыдущей командой.

Другой быстрый uname -rv. Если установленное ядро будет ядром дистрибутива запаса, то Вы будете обычно иногда находить имя там.

79
17.02.2017, 16:55
2 ответа

Присвоение оболочки является отдельным словом без пространства после знака "равно". Таким образом, то, что Вы записали, присваивает пустое значение thefile; кроме того, так как присвоение сгруппировано с командой, оно делает thefile переменная среды и присвоение локальны для той конкретной команды, т.е. только вызова к ls видит присвоенное значение.

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

thefile=$(ls -t -U | grep -m 1 "Screen Shot")

(Некоторая литература показывает альтернативный синтаксис thefile=`ls …`; синтаксис одинарной левой кавычки эквивалентен синтаксису долларовых круглых скобок за исключением того, что заключение в кавычки в одинарных левых кавычках иногда является странным, поэтому просто используйте $(…).)

Другие комментарии о Вашем сценарии:

  • Объединение -t (вид ко времени) с -U (не сортируйте), не имеет смысла; просто используйте -t.
  • Вместо использования grep для соответствия снимкам экрана это более ясно передать подстановочный знак ls и используйте head получать первый файл:

    thefile=$(ls -t *"Screen Shot"* | head -n 1)
    
  • Это обычно - плохая идея проанализировать вывод ls. Это могло перестать работать вполне плохо, если у Вас есть имена файлов с непечатаемыми символами. Однако сортировка файлов по дате является трудной без ls, таким образом, это - приемлемое решение, если Вы знаете, что у Вас не будет непечатных символов или обратных косых черт в именах файлов.

  • Всегда используйте двойные кавычки вокруг подстановок переменных, т.е. здесь запишите

    echo "Most recent screenshot is: $thefile"
    

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

  • Вам не нужны точки с запятой в конце строки. Они избыточны, но безопасны.
  • В сценарии оболочки это часто - хорошая идея включать set -e. Это говорит оболочке выходить, если какая-либо команда перестала работать (путем возврата ненулевого состояния).

Если у Вас есть GNU, находят (в особенности, если Вы работаете, не встроил Linux или Cygwin), существует другой подход к нахождению нового файла: иметь find перечислите файлы и их даты и использование sort и tail извлечь самый молодой файл.

thefile=$(find -maxdepth 1 -type f -name "*Screen Shot*" -printf "%T@ %p" |
          sort -k 1n | tail -n 1)

Если Вы готовы записать этот сценарий в zsh вместо удара, существует намного более легкий способ поймать новейший файл, потому что zsh имеет спецификаторы шарика, которые разрешают, чтобы подстановочный знак соответствовал не только на именах, но также и на метаданных файла. (om[1]) часть после шаблона является спецификаторами шарика; om виды соответствуют путем увеличения возраста (т.е. ко времени изменения, новейшему первый) и [1] извлекает первое соответствие только. Целое соответствие должно быть в круглых скобках, потому что это - технически массив, так как globbing возвращает список файлов, даже если [1] средства, что в данном случае список содержит (самое большее) один файл.

#!/bin/zsh
set -e
cd ~/Desktop
thefile=(*"Screen Shot"*(om[1]))
echo "Most recent screenshot is: $thefile"
112
27.01.2020, 19:31
  • 1
    Ничего себе! Больше информации, чем я возможно, возможно, надеялся на. Благодарите Вас много раз за свой ответ; я действительно ценю все усилия, которые Вы прикладываете к этому! Вы только что показали мне, что я действительно, действительно имейте много для изучения. Я прочь для покупки книги по удару :P. –  Nathan G. 04.07.2011, 03:10
  • 2
    Это - то, что я назвал бы категорическим ответом! :) –  alex 04.07.2011, 09:19

Если вы хотите сделать это с помощью многострочной/многострочной команды/с, вы можете сделать это:

output=$( bash <<EOF
#multiline/multiple command/s
EOF
)

Или:

output=$(
#multiline/multiple command/s
)

Пример:

#!/bin/bash
output="$( bash <<EOF
echo first
echo second
echo third
EOF
)"
echo "$output"

Выход:

first
second
third
4
27.01.2020, 19:31

Теги

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