В чем разница между $ (var), "$ (var)", $ ((var)), ((условие)) и т. Д. В shell? - PullRequest
0 голосов
/ 02 июня 2018

Я начинаю со сценария оболочки и не понимаю разницы между

$(var), "$(var)", $(( var ))

или просто в условных выражениях.Как

while [ condition ] while (( condition)) or while (condition) 

Я искал в Google, но ничего ...

1 Ответ

0 голосов
/ 02 июня 2018
  1. $(var) является подстановкой команды - она ​​выполнит команду с именем var и поместит вывод в текущую команду.пример:

    getent passwd $(whoami)
    
  2. "$(var)" - то же самое, что и выше, за исключением кавычек, вывод команды будет заменен на текущую команду как одно слово.Рассмотрим разницу между

    printf "%s\n" $(uname -a)
    

    и

    printf "%s\n" "$(uname -a)"
    
  3. $(( var )) - это арифметическое расширение, в котором вычисляется арифметическое выражение, содержащееся в переменной var.Пример:

    var='6*7'
    echo "$((var))"
    

В общем, если вам не нужны определенные побочные эффекты, всегда заключайте в кавычки расширения: Последствия для безопасности, связанные с забыванием заключить в кавычки переменную в оболочке bash / POSIX


Для while (а также if) следующая часть - это команда .Условное ветвление будет определяться статусом выхода команды: 0 - «истина», все остальное - «ложь».

Бывает, что [ является псевдонимом длякоманда test (при условии, что последний аргумент [ должен быть ])

Эти два цикла while эквивалентны по своей бесконечности:

while true; do ...
while [ 1 -eq 1 ]; do
while [ $(id -u root) = "0" ]; do ...

Использование одиночногоВ скобках командный конвейер, следующий за while, помещается в подоболочку.Изменения, которые вы вносите в оболочку в подоболочке, исчезают после ее завершения.Например, чтобы зациклить, когда в / tmp более 10 файлов, мы могли бы сделать:

while (cd /tmp; n=(*); [ "${#n[@]}" -gt 10 ]); do ...

При выходе из подоболочки текущий каталог больше не является / tmp, а переменная n не существует.

Двойные скобки обозначают арифметическое выражение:

while (( x * y < 100 )); do ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...