В bash-скрипте я хочу передать строку, которая содержится в переменной и содержит до 3 подстрок, разделенных символом «+». Каждая подстрока будет иметь определенное числовое значение, вроде восьмеричного режима.
Я хотел бы разбить строку на подстроки, преобразовать их в их числовые значения и добавить значения вместе.
Например, если мои подстроки и значения:
И моя переменная, содержащая их в строке:
my_outfit=shirt+trousers
Я бы хотел, чтобы переменная с именем outfit_value
имела значение 6. Как мне это сделать?
Я думал о том, чтобы установить IFS
в '+' и прочитать переменную в массив, затем выполнить цикл по массиву и преобразовать каждый элемент в его значение. К сожалению, моя голова превращается в заварной крем, когда я думаю о получении этих числовых элементов значения и выполнении арифметического выражения.
РЕДАКТИРОВАТЬ:
Это то, что у меня до сих пор, кажется, работает, но я хотел бы знать, есть ли какие-либо проблемы, или это можно было бы сделать более безопасно / эффективно:
my_outfit=hat+shirt+trousers
oIFS=$IFS
IFS=+
read -a clothes <<< "$my_outfit"
IFS=$oIFS
outfit_value=0
for string in ${clothes[@]}
do
if [[ $string = "hat" ]]
then
add_value=1
elif [[ $string = "shirt" ]]
then
add_value=2
elif [[ $string = "trousers" ]]
then
add_value=4
fi
let outfit_value="$outfit_value"+"$add_value"
done
echo "OUTFIT VALUE is $outfit_value"
С ударом, в арифметическом контексте оценки, имена переменной не требуют $
префикс. Это означает, что это возможно:
# set up the variables
hat=1 shirt=2 trousers=4
string="my_outfit=shirt+trousers"
# evaluate the equation
(( $string ))
echo $my_outfit
выводы
6
Вот вариант Вашего исходного метода, но использующий массивы удара. Обратите внимание, что нет никакой потребности сохранить восстановление разделитель полей - можно просто присвоить временную ценность когда Вы read
строка
#!/bin/bash
# create a map (lookup table) from items to values
declare -A values=( [hat]=1 [shirt]=2 [trousers]=4 )
# (an ASSOCIATIVE array)
my_outfit='hat+shirt+trousers'
# convert the string to a simple (INDEXED) array
IFS=+ read -r -a my_items <<< "$my_outfit"
# loop over the array of items, looking up and summing the values
outfit_value=0
for item in "${my_items[@]}"; do
((outfit_value += values[$item]))
done
printf 'OUTFIT VALUE is %s\n' "$outfit_value"
checkinstall
вместо make install
, если это возможно, чтобы быть в состоянии удалить такое программное обеспечение легко. См. help.ubuntu.com/community/CheckInstall
– muru
14 October 2017 в 04:57