2013-08-24 3 views
1

много подобных вопросов, но не нашел для использования переменной во имя так:Баш косвенную ссылку по ссылке

#!/bin/bash 

# $1 should be 'dev' or 'stg' 

dev_path="/path/to/123" 
stg_path="/path/to/xyz" 

# Use $1 as input to determine which path variable to 'execute' 
${!\$1'/morepath'} 

Использование $ 1, я хочу, чтобы иметь возможность ссылаться либо $ dev_path или $ stg_path ($ 1 == 'dev' или $ 1 == 'stg') и иметь возможность ссылаться на значение $ 1_path, которое будет '/ path/to/123' или '/ path/to/xyz'.

, так что результат будет либо:

'/path/to/123/morepath' or '/path/to/xyz/morepath' 

на основе U pon $ 1 является «dev» или «stg».

Я пробовал различные итерации использования! и \ $ в разных местах с других должностей, но не повезло

ответ

3

Я думаю, что это было бы небезопасно. Если $1 получает значение, которое не является dev или stg, это может привести к синтаксической ошибке и другим непредвиденным событиям. Даже с eval это не будет хорошей идеей, если вы не добавите условный фильтр. Вы можете использовать case заявление:

case "$1" in 
dev) 
    "$dev_path"/bin/execute 
    ;; 
std) 
    "$std_path"/bin/execute 
    ;; 
*) 
    echo "Invalid argument: $1" 
    ;; 
esac 

Или убедитесь, что он действителен и использовать Eval:

[[ $1 == dev || $1 == std ]] && eval "\"\${${1}_path}/bin/execute\"" 

Использование if ... elif ... может быть действительным тоже, но метод case проще.

Что касается variable indirection, вам необходимо будет сохранить "${1}_path" другой переменной, которая не является необходимой.

Вы также можете использовать dev|std) eval ... ;; в заявлении case по вашему усмотрению.

0

Зачем нужна переменная, переменная? Почему не

MYPATH="/path/to/$1" 
$MYPATH/bin/execute 
+0

$ 1 (например, dev/stg) не должно быть задействовано, за исключением изменения имени переменной (не значения), чтобы помочь уточнить – CrackerJack9

6

Смотрите раздел руководства Баша на shell parameter expansion: (!)

Если первый символ параметра является восклицательным знаком, уровень переменной косвенности вводятся. Bash использует значение переменной, сформированной из остальной части параметра как имя переменной; эта переменная затем расширяется и это значение используется в остальной части замещения, а не значение параметра. Это называется indirect expansion. Исключением являются расширения ${!prefix } и ${!name[@]}, описанные ниже. Восклицательный знак должен немедленно следовать за левой скобкой, чтобы ввести косвенность.

[...]

Поскольку вы также хотите изменить имя (по суффикса _path), прежде чем снова расширяется, вы должны пройти через другую переменную:

# $1 should be 'dev' or 'stg' 
dev_path="/path/to/dev" 
stg_path="/path/to/stg" 

path=${1}_path # path is now either 'dev_path' or 'stg_path' 

# Run either /path/to/dev or /path/to/stg 
${!path}/bin/execute 

Конечно, если обе программы dev и stg находятся в одном каталоге, тогда нет необходимости в этом, вы можете просто развернуть $1:

/path/to/$1/bin/execute 
+0

$ 1 (например, dev/stg) не должно быть задействовано, кроме имени переменной (не значение) отредактировал вопрос, чтобы помочь уточнить – CrackerJack9

Смежные вопросы