У меня есть специализированный .profile, который я использую в ksh, и ниже функция, которую я создал для пропуска назад и вперед от каталогов с чрезмерно сложными или длинными именами.
Как Вы видите, пути хранятся в массиве (BOOKMARKS[]
) отслеживать их и ссылаться на них в более позднее время. Я хочу смочь удалить определенные значения из массива, с помощью оператора выбора (или OPTARG при необходимости) так, чтобы я мог просто ввести bmk -d #
удалить путь в связанном индексе.
Я возился с array +A and -A
, но это только что завершило завинчивание мой массив (что оставляют в закомментированном коде, может не быть симпатичным... Я не корректировал его).
Какие-либо предложения/подсказки, как создать ту функциональность?Спасибо!
# To bookmark the current directory you are in for easy navigation back and forth from multiple non-aliased directories
# Use like 'bmk' (sets the current directory to a bookmark number) to go back to this directory, i.e. type 'bmk 3' (for the 3rd)
# To find out what directories are linked to which numbers, type 'bmk -l' (lowercase L)
# For every new directory bookmarked, the number will increase so the first time you run 'bmk' it will be 1 then 2,3,4...etc. for every consecutive run therea
fter
# TODO: finish -d (delete bookmark entry) function
make_bookmark()
{
if [[ $# -eq 0 ]]; then
BOOKMARKS[${COUNTER}]=${PWD}
(( COUNTER=COUNTER+1 ))
else
case $1 in
-l) NUM_OF_ELEMENTS=${#BOOKMARKS[*]}
while [[ ${COUNTER} -lt ${NUM_OF_ELEMENTS} ]]
do
(( ACTUAL_NUM=i+1 ))
echo ${ACTUAL_NUM}":"${BOOKMARKS[${i}]}
(( COUNTER=COUNTER+1 ))
done
break ;;
#-d) ACTUAL_NUM=$2
#(( REMOVE=${ACTUAL_NUM}-1 ))
#echo "Removing path ${BOOKMARKS[${REMOVE}]} from 'bmk'..."
#NUM_OF_ELEMENTS=${#BOOKMARKS[*]}
#while [[ ${NUM_OF_ELEMENTS} -gt 0 ]]
#do
#if [[ ${NUM_OF_ELEMENTS} -ne ${ACTUAL_NUM} ]]; then
# TEMP_ARR=$(echo "${BOOKMARKS[*]}")
# (( NUM_OF_ELEMENTS=${NUM_OF_ELEMENTS}-1 ))
#fi
#echo $TEMP_ARR
#done
#break
#for VALUE in ${TEMP_ARR}
#do
# set +A BOOKMARK ${TEMP_ARR}
#done
#echo ${BOOKMARK[*]}
#break ;;
*) (( INDEX=$1-1 ))
cd ${BOOKMARKS[${INDEX}]}
break ;;
esac
fi
}
Массивы в оболочке Korn (а также Bash и другие) разрежены, поэтому если вы используете unset
для удаления членов массива, то вы не сможете использовать размер массива в качестве индекса к последнему члену и другие ограничения.
Вот несколько полезных фрагментов (второй цикл для
можно сразу же использовать):
array=(1 2 3)
unset array[2]
echo ${array[2]} # null
indices=(${!array[@]}) # create an array of the indices of "array"
size=${#indices[@]} # the size of "array" is the number of indices into it
size=${#array[@]} # same
echo ${array[@]: -1} # you can use slices to get array elements, -1 is the last one, etc.
for element in ${array[@]}; do # iterate over the array without an index
for index in ${indices[@]} # iterate over the array WITH an index
do
echo "Index: ${index}, Element: ${array[index]}"
done
for index in ${!array[@]} # iterate over the array WITH an index, directly
Последний может устранить необходимость в счетчике.
Вот еще пара полезных приемов:
array+=("new element") # append a new element without referring to an index
((counter++)) # shorter than ((counter=counter+1)) or ((counter+=1))
if [[ $var == 3 ]] # you can use the more "natural" comparison operators inside double square brackets
while [[ $var < 11 ]] # another example
echo ${array[${index}-1] # math inside an array subscript
Все это предполагает ksh93, некоторые вещи могут не работать в более ранних версиях.
Вы можете использовать Unset. Например, для удаления элемента массива 1
unset array[0]
удалить весь массив
unset array