An open API service indexing awesome lists of open source software.

https://github.com/alexskrypnyk/shellvar

Utility to work with shell variables.
https://github.com/alexskrypnyk/shellvar

bash extractor shell shell-script variable

Last synced: 4 months ago
JSON representation

Utility to work with shell variables.

Awesome Lists containing this project

README

          



Shellvar logo

Utility to work with shell variables

[![GitHub Issues](https://img.shields.io/github/issues/AlexSkrypnyk/shellvar.svg)](https://github.com/AlexSkrypnyk/shellvar/issues)
[![GitHub Pull Requests](https://img.shields.io/github/issues-pr/AlexSkrypnyk/shellvar.svg)](https://github.com/AlexSkrypnyk/shellvar/pulls)
[![Test PHP](https://github.com/AlexSkrypnyk/shellvar/actions/workflows/test-php.yml/badge.svg)](https://github.com/AlexSkrypnyk/shellvar/actions/workflows/test-php.yml)
[![codecov](https://codecov.io/gh/AlexSkrypnyk/shellvar/graph/badge.svg?token=7WEB1IXBYT)](https://codecov.io/gh/AlexSkrypnyk/shellvar)
![GitHub release (latest by date)](https://img.shields.io/github/v/release/AlexSkrypnyk/shellvar)
![LICENSE](https://img.shields.io/github/license/AlexSkrypnyk/shellvar)
![Renovate](https://img.shields.io/badge/renovate-enabled-green?logo=renovatebot)

[![Docker Pulls](https://img.shields.io/docker/pulls/drevops/shellvar?logo=docker)](https://hub.docker.com/r/drevops/shellvar)
![amd64](https://img.shields.io/badge/arch-linux%2Famd64-brightgreen)

---

## Features

- Lint variables:
- Report on shell variables that are not in `${VAR}` format.
- Fix shell variables that are not in `${VAR}` format.
- Extract variables:
- Scan a file or a directory containing shell scripts and extract found
variables with comments and assigned values with [advanced interpolation
support](tests/phpunit/Fixtures/test-data-real.sh).
- Filter variables: exclude local, exclude by prefix, exclude from a list in
file.
- Format output as a _CSV_, _Markdown table_ or _Markdown blocks_ (defined in
the template).
- Extend filters and formatters with your own custom classes.

## Installation

Download the latest version of the `shellvar` from
the [releases page](https://github.com/AlexSkrypnyk/shellvar/releases)
and run on host machine:

```bash
./shellvar [command] [options] path/to/script.sh
```

or run as a Docker container:

```bash
docker run -v $(pwd):/app drevops/shellvar [command] [options] path/to/script.sh
```

## Usage - Lint

- Report on shell variables that are not in `${VAR}` format.
- Fix shell variables that are not in `${VAR}` format.

### Lint file or directory

```bash
./shellvar lint path/to/script.sh

./shellvar lint path/to/dir

./shellvar lint --extension=sh --extension=bash --extension=bats path/to/dir
```

Example:

```bash
./shellvar lint tests/phpunit/Fixtures/unwrapped.sh

./shellvar lint tests/phpunit/Fixtures

./shellvar lint --extension=sh --extension=bash --extension=bats tests/phpunit/Fixtures
```

### Fix file or directory

```bash
./shellvar lint --fix path/to/script.sh

./shellvar lint --fix path/to/dir

./shellvar lint --fix --extension=sh --extension=bash --extension=bats path/to/dir
```

Example:

```bash
./shellvar lint --fix tests/phpunit/Fixtures/unwrapped.sh

./shellvar lint --fix tests/phpunit/Fixtures

./shellvar lint --fix --extension=sh --extension=bash --extension=bats tests/phpunit/Fixtures
```

## Usage - Extract

By default, variable names, descriptions (taken from the comments) and their
values are printed to STDOUT in the _CSV_ format. You can also change the output
format to _Markdown table_ or _Markdown blocks_.

Given the following shell script (
see [extended example](tests/phpunit/Fixtures/test-data.sh) used in tests):

```bash
# Assignment to scalar value.
VAR1=val1
# Assignment to another variable.
VAR2="${VAR1}"
# Parameter expansion.
VAR3=${val3:-abc}
# Parameter expansion with a default value using
# another variable $VAR3.
#
# Continuation of the multi-line comment.
VAR4=${val4:-$VAR3}
```

### CSV (default)

```bash
./shellvar extract path/to/script.sh
```

```csv
Name;"Default value";Description
VAR1;val1;"Assignment to scalar value."
VAR2;${VAR1};"Assignment to another variable."
VAR3;abc;"Parameter expansion."
VAR4;${VAR3};"Parameter expansion with a default value using another variable $VAR3.

Continuation of the multi-line comment."
```

### Markdown table

```bash
./shellvar extract --format=md-table path/to/script.sh
```

Click to see output

```markdown
| Name | Default value | Description |
|--------|---------------|----------------------------------------------------------------------------------------------------------------------------------|
| `VAR1` | `val1` | Assignment to scalar value. |
| `VAR2` | `${VAR1}` | Assignment to another variable. |
| `VAR3` | `abc` | Parameter expansion. |
| `VAR4` | `${VAR3}` | Parameter expansion with a default value using
another variable `$VAR3`.

Continuation of the multi-line comment. |
```

which renders as

| Name | Default value | Description |
|--------|---------------|-------------------------------------------------------------------------------------------------------------------------------|
| `VAR1` | `val1` | Assignment to scalar value. |
| `VAR2` | `${VAR1}` | Assignment to another variable. |
| `VAR3` | `abc` | Parameter expansion. |
| `VAR4` | `${VAR3}` | Parameter expansion with a default value using
another variable `$VAR3`.

Continuation of the multi-line comment. |

### Markdown blocks

```bash
./shellvar extract --format=md-blocks path/to/script.sh
```

Click to see output

```markdown
### `VAR1`

Assignment to scalar value.

Default value: `val1`

### `VAR2`

Assignment to another variable.

Default value: `${VAR1}`

### `VAR3`

Parameter expansion.

Default value: `abc`

### `VAR4`

Parameter expansion with a default value using
another variable `$VAR3`.

Continuation of the multi-line comment.

Default value: `${VAR3}`

```

which renders as

### `VAR1`

Assignment to scalar value.

Default value: `val1`

### `VAR2`

Assignment to another variable.

Default value: `${VAR1}`

### `VAR3`

Parameter expansion.

Default value: `abc`

### `VAR4`

Parameter expansion with a default value using
another variable `$VAR3`.

Continuation of the multi-line comment.

Default value: `${VAR3}`

#### Advanced: Markdown blocks with links and custom template

```bash
./shellvar extract --format=md-blocks --md-link-vars --md-block-template-file=path/to/template.md path/to/script.sh
```

Click to see output

```markdown
### `VAR1`

Assignment to scalar value.

Default value: `val1`

Path: `1.sh`

Paths: `1.sh`

### `VAR2`

Assignment to another variable.

Default value: `${VAR1}`

Path: `1.sh`

Paths: `1.sh`

### `VAR3`

Parameter expansion.

Default value: `abc`

Path: `1.sh`

Paths: `1.sh`

### `VAR4`

Parameter expansion with a default value using
another
variable [`$VAR3`](#VAR3).

Continuation of the multi-line comment.

Default value: `${VAR3}`

Path: `1.sh`

Paths: `1.sh`

```

which renders as

### `VAR1`

Assignment to scalar value.

Default value: `val1`

Path: `1.sh`

Paths: `1.sh`

### `VAR2`

Assignment to another variable.

Default value: `${VAR1}`

Path: `1.sh`

Paths: `1.sh`

### `VAR3`

Parameter expansion.

Default value: `abc`

Path: `1.sh`

Paths: `1.sh`

### `VAR4`

Parameter expansion with a default value using
another
variable [`$VAR3`](#VAR3).

Continuation of the multi-line comment.

Default value: `${VAR3}`

Path: `1.sh`

Paths: `1.sh`

### Column manipulation

Control the order and visibility of columns in tabular output formats (CSV and Markdown table).

#### Reorder columns

```bash
./shellvar extract --format=csv --column-order="Description,Name" path/to/script.sh
```

This will output columns in the order: Description, Name, Default value (unspecified columns are appended).

#### Show only specific columns

```bash
./shellvar extract --format=md-table --only-columns="Name,Description" path/to/script.sh
```

This will output only the Name and Description columns.

#### Exclude columns

```bash
./shellvar extract --format=csv --exclude-columns="Default value" path/to/script.sh
```

This will output all columns except "Default value".

#### Combine column options

```bash
./shellvar extract --format=csv --only-columns="Name,Description,Default value" --column-order="Description,Name" path/to/script.sh
```

This will first filter to only the specified columns, then reorder them.

### Options

There are options for different phases: extraction, filtering and formatting.

"Multiple values allowed" means that you can specify the option multiple times
like so: `--exclude-prefix=VAR1 --exclude-prefix=VAR2` etc.

#### Extraction

| Name | Description | Default value |
|------------------------------------|--------------------------------------------------------------------------------------|---------------|
| `paths` | File or directory to scan. Multiple files separated by space. | |
| `--skip-text=SKIP` | Skip variable extraction if the comment has this specified text. | `@skip` |
| `--skip-description-prefix=PREFIX` | Skip description lines that start with the provided prefix. Multiple values allowed. | |

#### Filtering

| Name | Description | Default value |
|----------------------------|---------------------------------------------------------------------------------------------------------------|---------------|
| `--exclude-local` | Remove local variables. | |
| `--exclude-prefix=PREFIX` | Exclude variables that start with the provided prefix. Multiple values allowed | | |
| `--exclude-from-file=FILE` | A path to a file that contains variables to be excluded from the extraction process. Multiple values allowed. | |

#### Format

| Name | Description | Default value |
|------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------|
| `--format=FORMAT` | The output format: CSV (`csv`), Markdown table (`md-table`), Markdown blocks (`md-blocks`). | `csv` |
| `--sort` | Sort variables in ascending order by name. | |
| `--unset` | A string to represent a value for variables that are defined but have no set value. | `UNSET` |
| `--fields=FIELDS` | Semicolon-separated list of fields. Each field is a key-label pair in the format "key=label". If label is omitted, key is used as label. | `name=Name;default_value="Default value;description=Description` |
| `--path-strip-prefix=PREFIX` | Strip the provided prefix from the path. | |
| `--csv-separator=SEPARATOR` | Separator for the CSV output format. | `;` |
| `--column-order=COLUMNS` | Comma-separated list of column names to specify output order. Columns not specified are appended in their original order. Only applies to tabular formats (csv, md-table). | |
| `--only-columns=COLUMNS` | Comma-separated list of column names to include. Only these columns will appear in output. Only applies to tabular formats (csv, md-table). | |
| `--exclude-columns=COLUMNS` | Comma-separated list of column names to exclude from output. Only applies to tabular formats (csv, md-table). | |
| `--md-link-vars` | Link variables within usages to their definitions in the Markdown output format. | |
| `--md-link-vars-anchor-case` | The case of the anchors when linking variables. Can be one of "preserve", "lower" or "upper". | `preserve` |
| `--md-no-inline-code-wrap-vars` | Do not wrap variables to show them as inline code in the Markdown output format. | |
| `--md-no-inline-code-wrap-numbers` | Do not wrap numbers to show them as inline code in the Markdown output format. | |
| `--md-inline-code-extra-file=FILE` | A path to a file that contains additional strings to be formatted as inline code in the Markdown output format. Multiple values allowed. | |
| `--md-block-template-file=FILE` | A path to a Markdown template file used for Markdown blocks (md-blocks) output format. `{{ name }}`, `{{ description }}`, `{{ default_value }}` and `{{ path }}` tokens can be used within the template. | |

## Maintenance

composer install
composer lint
composer lint:fix
composer test
composer build

### Docker publishing

Shellvar
is [published as a Docker image](https://hub.docker.com/r/drevops/shellvar) with
the following tags:

- `XX.YY.ZZ` tag - when release tag is published on GitHub.
- `latest` - when release tag is published on GitHub.
- `canary` - on every push to `main` branch

---
_This repository was created using the [Scaffold](https://getscaffold.dev/) project template_