Найти конкретный аргумент и передать его команде

Эта строка пытается запустить это:

export EASY_RSA="`/etc/openvpn/easy-rsa`"

Обратите внимание на обратные галочки вокруг /etc/openvpn/easy-rsa. Они попытаются запустить это как команду. Глядя на руководство, эта линия показана так:

export EASY_RSA=”/etc/openvpn/easy-rsa” 
0
23.07.2020, 01:34
2 ответа

Сzsh:

#! /bin/zsh -
inputpath=(${${(M)argv:#inputpath=*}#*=})
(($#inputpath > 0)) &&./run-command $inputpath

Будет извлекать все path в аргументах inputpath=pathсценария и сохранять непустые -в массиве $inputpath. Затем мы запускаем ./run-commandс этими входными путями в качестве аргументов, если они были найдены.

POSIXly вы могли бы сделать что-то вроде:

#! /bin/sh -
run_with_extracted_keyword() (
  cmd="${1?}" keyword="${2?}"
  shift 2
  for arg do
    case $arg in
      ("$keyword="*) set -- "$@" "${arg#*=}"
    esac
    shift
  done
  [ "$#" -gt 0 ] && exec "$cmd" "$@"
)

run_with_extracted_keyword./run-command inputpath "$@"

GNUly, вы можете сделать:

#! /bin/bash -
set -o pipefail
printf '%s\0' "$@" |
  LC_ALL=C grep -zPo '^inputpath=\K(?s:.*)' |
  xargs -r0./run-command
1
18.03.2021, 23:17

Что бы я сделал, если бы вы контролировали ввод и могли бы ограничить доступ к сценарию, чтобы предотвратить внедрение оболочки, как указано Стефаном в комментариях:

#!/bin/bash
  
for arg; do
    declare "$arg"
done

echo "$argument1"

sometext

Обычно для доступа к позиционным параметрам можно использовать echo $1, $2, $3...

Но если вы используете эту var=valueформу, этот код подойдет лучше

0
18.03.2021, 23:17

Теги

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