После публикации этой истории я понял, что сочетание Bash и Powershell может быть более мощным. Это потому, что он позволяет мне создавать сценарии, которые работают как в Windows, так и в Linux!

Это позволяет реализовать процессы установки «двойным щелчком» или однострочник, размещенный на GitHub, который можно запускать в любой среде.

Итак, как мы это делаем?

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

Наблюдение №1: условия несовместимы

К сожалению, когда я играл с конструкциями условий, я не нашел версию, работающую на обоих языках.

Синтаксис if достаточно отличается в Bash и Powershell. Например, синтаксис if в bash содержит ключевое слово «then» и заканчивается «fi», тогда как в PowerShell он заключен в фигурные скобки.

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

Наблюдение №2: функции имеют одинаковый синтаксис в Powershell и Bash

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

Наблюдение № 3: Синтаксис ссылок на переменные одинаков

Это (необязательное) наблюдение позволяет нам писать немного более чистый код. В обоих языках обращение к переменным выполняется с помощью $varname.

Кроме того, мы можем вызвать функцию, где мы собираем ее имя со строками и переменными.

Более того, некоторые переменные в одном языке определяются автоматически, а в другом нет.

Это позволяет нам создать 2 функции, одну для bash и одну для Powershell, с разными именами.

Сценарий

Объединив эти наблюдения, я пришел к следующему решению:

#!/bin/bash

function choose
{
    echo "hi from bash"
    exit
}

function choosetrue
{
    echo "hi from pwsh"
    exit
}

"choose$true"
$(&"choose$true")

Запуск в Bash

При запуске в Bash $true ничего не оценивает, поскольку эта переменная не определяется Bash при запуске скрипта.

Строка «choose$true» оценивается как «выбрать», и поэтому вызывается функция «выбрать».

Обратите внимание, что выход требуется для предотвращения перехода к (недопустимому) коду powershell.

Запуск в Powershell

$true определено в Powershell и имеет строковое представление «true».

строка «choose$true» оценивается как «choosetrue», но, поскольку мы запускаем Powershell, эта строка не работает, потому что это просто строка.

Строка после этого оценивает «choosetrue» и вызывает его как функцию.

Заключительные слова

Найдя решение, я поискал в Интернете «гибридный скрипт» и нашел довольно интересные результаты:

  1. Файлы гибридных скриптов (github.com)
  2. «linux — Можно ли написать один скрипт, работающий в bash/shell и PowerShell? - Переполнение стека"

Я думаю, что это довольно изящные головоломки, которые помогают вдохновлять и развивать творческий потенциал.

Спасибо!