добавление и изменение параметра в bash - PullRequest
0 голосов
/ 26 февраля 2019

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

Я пытаюсь найти способ, которым я могу изменить M26 (or M27, M28, L26, L27....) на M0000026.00поэтому позже в скрипте я могу вызвать новую форму параметра

Я знаю, что мог бы сделать что-то вроде:

./test.sh M26

if [ "$1" = M26 ]

   then

   set -- "M0000026.00" "${@:1}"

fi

some function для вызова $1 в строке файла/..../.../.../$1/.../..

но я ищу более общий способ, поэтому мне не нужно вводить все возможные операторы if для каждого трехсимвольного параметра, который у меня есть

1 Ответ

0 голосов
/ 26 февраля 2019

Если ваша версия bash поддерживает ассоциативные массивы, вы можете сделать что-то вроде этого:

# Declare an associative array to contain your argument mappings
declare -A map=( [M26]="M0000026.00" [M27]="whatever" ["param with spaces"]="foo" )

# Declare a regular array to hold your remapped args
args=()

# Loop through the shell parameters and remap them into args()
while (( $# )); do
   # If "$1" exists as a key in map, then use the mapped value.
   # Otherwise, just use "$1"
   args+=( "${map["$1"]-$1}" )
   shift
done

# At this point, you can either just use the args array directly and ignore
# $1, $2, etc. 
# Or you can use set to reassign $1, $2, etc from args, like so:
set -- "${args[@]}"

Кроме того, вам не нужно объявлять map в одной строке, как я.Для удобства обслуживания (особенно если у вас много сопоставлений) вы можете сделать это следующим образом:

declare -A map=()
map["M26"]="M0000026.00"
map["M27"]="whatever"
...
map["Z99"]="foo bar"
...