Эта строка пытается запустить это:
export EASY_RSA="`/etc/openvpn/easy-rsa`"
Обратите внимание на обратные галочки вокруг /etc/openvpn/easy-rsa
. Они попытаются запустить это как команду. Глядя на руководство, эта линия показана так:
export EASY_RSA=”/etc/openvpn/easy-rsa”
С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
Что бы я сделал, если бы вы контролировали ввод и могли бы ограничить доступ к сценарию, чтобы предотвратить внедрение оболочки, как указано Стефаном в комментариях:
#!/bin/bash
for arg; do
declare "$arg"
done
echo "$argument1"
sometext
Обычно для доступа к позиционным параметрам можно использовать echo $1
, $2
, $3
...
Но если вы используете эту var=value
форму, этот код подойдет лучше