В чем разница между файлом grep apple и grep & ldquo; apple & rdquo; файл?

Вы можете установить пакет libimage-exiftool-perl:

sudo apt-get install libimage-exiftool-perl

Затем запустить:

exiftool -AudioBitrate GoldLion.mp3

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

Audio Bitrate : 192 kbps
1
задан 25 September 2014 в 02:32

1 ответ

Двойные кавычки позволяют оценивать, одинарные кавычки предотвращают оценку, никакие кавычки не допускают расширение подстановочных знаков при использовании в командной строке. Как надуманные примеры:

[user@work test]$ ls .
A.txt B.txt C.txt D.cpp

# The following is the same as writing echo 'A.txt B.txt C.txt D.cpp'
[user@work test]$ echo *
A.txt B.txt C.txt D.cpp

[user@work test]$ echo "*"
*

[user@work test]$ echo '*'
*

# The following is the same as writing echo 'A.txt B.txt C.txt'
[user@work test]$ echo *.txt
A.txt B.txt C.txt

[user@work test]$ echo "*.txt"
*.txt

[user@work test]$ echo '*.txt'
*.txt

[user@work test]$ myname=is Fred; echo $myname
bash: Fred: command not found

[user@work test]$ myname=is\ Fred; echo $myname
is Fred

[user@work test]$ myname="is Fred"; echo $myname
is Fred

[user@work test]$ myname='is Fred'; echo $myname
is Fred

Понимание того, как работает кавычки, имеет решающее значение для понимания Bash. Например:

# for will operate on each file name separately (like an array), looping 3 times.
[user@work test]$ for f in $(echo *txt); do echo "$f"; done;
A.txt
B.txt
C.txt

# for will see only the string, 'A.txt B.txt C.txt' and loop just once.
[user@work test]$ for f in "$(echo *txt)"; do echo "$f"; done;
A.txt B.txt C.txt

# this just returns the string - it can't be evaluated in single quotes.
[user@work test]$ for f in '$(echo *txt)'; do echo "$f"; done;
$(echo *txt)

Вы можете использовать одинарные кавычки для передачи команды через переменную. Одиночные кавычки предотвратят оценку. Двойные кавычки будут оцениваться.

# This returns three distinct elements, like an array.
[user@work test]$ echo='echo *.txt'; echo $($echo)
A.txt B.txt C.txt

# This returns what looks like three elements, but it is actually a single string.
[user@work test]$ echo='echo *.txt'; echo "$($echo)"
A.txt B.txt C.txt

# This cannot be evaluated, so it returns whatever is between quotes, literally.
[user@work test]$ echo='echo *.txt'; echo '$($echo)'
$($echo)

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

Вам нужно получить полное представление о котировках, чтобы эффективно использовать Bash. Очень важно!

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

23
ответ дан 24 May 2018 в 17:20
  • 1
    Как бы вы использовали двойные кавычки внутри двойных кавычек ??? Это опечатка? И почему я должен избегать двойных кавычек внутри одиночных кавычек? Наверное, вы смешали предложения? – Byte Commander 15 October 2015 в 18:38
  • 2
    @ByteCommander Да, понятие двойных кавычек, помещенных внутри двойных кавычек, используется довольно часто - см. этот пост для заметного рабочего примера. Обычно это делается для защиты строк, содержащих пробелы, часто по отношению к строкам пути. Двойные кавычки могут использоваться в одинарных кавычках с или без экранирования, но они будут интерпретироваться буквально, то есть они не приведут к оценке. Я уточню этот момент в сообщении. – AsymLabs 15 October 2015 в 21:06

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

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