#!/bin/bash # shellcheck disable=SC2155 if ! type "include" > /dev/null 2>&1; then include() { . "$(cd "$(dirname "$1")" && pwd)/${2}"; }; fi include "${BASH_SOURCE[0]}" ../pragma_once.bash if ! pragma_once ${BASH_SOURCE[0]}; then return 0; fi include "${BASH_SOURCE[0]}" ./global_rely/export.bash # shellcheck source=./global_rely/export.bash list_size() { local list_str=$1 IFS=":" read -r -a array <<<"$list_str" # 用冒号分割字符串到数组 _ret_=${#array[@]} # 将数组的大小存入全局变量 _ret_ } list_insert_element() { local list_str=$1 local pos=$2 local element=$3 # 要插入的新元素 IFS=":" read -r -a array <<<"$list_str" list_size "$list_str" local size=$_ret_ if ((pos < 0 || pos > size)); then echo "list_insert_element error! pos:${pos} size:${size} list:$list_str" exit 1 fi new_array=("${array[@]:0:pos}" "$element" "${array[@]:pos}") _ret_=$( IFS=":" echo "${new_array[*]}" ) } list_insert_element_if_not_exist() { local list_str=$1 local pos=$2 local element=$3 list_find_element "$list_str" "$element" if [[ $_ret_ != "-1" ]]; then _ret_="$list_str" return 0 fi list_insert_element "$list_str" "$pos" "$element" } list_append_element() { local list_str=$1 local element=$2 list_size "$list_str" list_insert_element "$list_str" "$_ret_" "$element" } list_prepend_all_element() { local list_str=$1 local element=$2 local result="" IFS=":" read -r -a array <<<"$list_str" for i in "${!array[@]}"; do result+="$element${array[$i]}:" done _ret_="${result%:}" } list_append_all_element() { local list_str=$1 local element=$2 local result="" IFS=":" read -r -a array <<<"$list_str" for i in "${!array[@]}"; do result+="${array[$i]}$element:" done _ret_="${result%:}" } list_append_element_if_not_exist() { local list_str=$1 local element=$2 list_size "$list_str" list_insert_element_if_not_exist "$list_str" "$_ret_" "$element" } list_prepend_element() { local list_str=$1 local element=$2 list_insert_element "$list_str" "0" "$element" } list_prepend_element_if_not_exist() { local list_str=$1 local element=$2 list_insert_element_if_not_exist "$list_str" "0" "$element" } list_remove_at() { local list_str=$1 local pos=$2 IFS=":" read -r -a array <<<"$list_str" list_size "$list_str" local size=$_ret_ if [[ ${size} == 1 ]]; then _ret_="" fi if ((pos < 0 || pos >= size)); then echo "list_remove_at error! pos:${pos} size:${size} list:$list_str" exit 1 fi new_array=("${array[@]:0:pos}" "${array[@]:pos+1}") _ret_=$( IFS=":" echo "${new_array[*]}" ) } list_remove_last() { local list_str=$1 list_size "$list_str" local index=$((_ret_ - 1)) list_remove_at "$list_str" "$index" } list_remove_first() { local list_str=$1 list_remove_at "$list_str" "0" } list_find_element_regex() { local list_str=$1 local regex=$2 IFS=":" read -r -a array <<<"$list_str" local i for i in "${!array[@]}"; do if [[ "${array[$i]}" =~ $regex ]]; then _ret_="$i" return 0 fi done _ret_="-1" } list_find_element() { local list_str=$1 local element=$2 local regex="^${element}$" list_find_element_regex "$list_str" "$regex" } list_remove_element_if_exist() { local list_str=$1 local element=$2 list_find_element "$list_str" "$element" local pos=$_ret_ if [[ "$pos" == "-1" ]]; then _ret_="$list_str" return 0 fi list_remove_at "$list_str" "$pos" } # =========================== 测试 =========================== test_list_size() { local test_string="apple:banana:cherry:date:grape" local expected_size=5 list_size "$test_string" local size=$_ret_ if [[ "$size" -ne $expected_size ]]; then echo "Size test failed:" echo " Input list: '$test_string'" echo " Expected: $expected_size" echo " Got: $size" exit 1 fi } test_list_insert_element() { local test_string="apple:banana:cherry:date:grape" local insert_pos=2 local insert_element="orange" local expected_inserted="apple:banana:orange:cherry:date:grape" list_insert_element "$test_string" "$insert_pos" "$insert_element" local inserted=$_ret_ if [[ "$inserted" != "$expected_inserted" ]]; then echo "Insert test failed:" echo " Input list: '$test_string'" echo " Insert Position: $insert_pos" echo " Insert Element: '$insert_element'" echo " Expected: '$expected_inserted'" echo " Got: '$inserted'" exit 1 fi # Test inserting into an empty string local empty_string="" local expected_inserted_empty="orange" list_insert_element "$empty_string" 0 "$insert_element" local inserted_empty=$_ret_ if [[ "$inserted_empty" != "$expected_inserted_empty" ]]; then echo "Insert test with empty string failed:" echo " Input list: '$empty_string'" echo " Insert Position: 0" echo " Insert Element: '$insert_element'" echo " Expected: '$expected_inserted_empty'" echo " Got: '$inserted_empty'" exit 1 fi } test_list_remove_at() { local test_string="apple:banana:orange:cherry:date:grape" local remove_pos=1 local expected_removed_at="apple:orange:cherry:date:grape" list_remove_at "$test_string" "$remove_pos" local removed_at=$_ret_ if [[ "$removed_at" != "$expected_removed_at" ]]; then echo "Remove at test failed:" echo " Input list: '$test_string'" echo " Remove Position: $remove_pos" echo " Expected: '$expected_removed_at'" echo " Got: '$removed_at'" exit 1 fi } test_list_find_element() { local test_string="apple:banana:cherry:date:grape" local find_element="banana" local expected_find_index=1 list_find_element "$test_string" "$find_element" local find_index=$_ret_ if [[ "$find_index" -ne $expected_find_index ]]; then echo "Find element test failed:" echo " Input list: '$test_string'" echo " Element: '$find_element'" echo " Expected: $expected_find_index" echo " Got: $find_index" exit 1 fi } test_list_remove_element_if_exist() { local test_string="apple:banana:cherry:date:grape" local remove_element="cherry" local expected_after_remove="apple:banana:date:grape" list_remove_element_if_exist "$test_string" "$remove_element" local after_remove=$_ret_ if [[ "$after_remove" != "$expected_after_remove" ]]; then echo "Remove '$remove_element' test failed:" echo " Input list: '$test_string'" echo " Expected: '$expected_after_remove'" echo " Got: '$after_remove'" exit 1 fi } test_list_remove_non_existent_element() { local test_string="apple:banana:cherry:date:grape" local expected_after_not_exist="apple:banana:cherry:date:grape" list_remove_element_if_exist "$test_string" "pear" local after_not_exist=$_ret_ if [[ "$after_not_exist" != "$expected_after_not_exist" ]]; then echo "Remove 'pear' (not exist) test failed:" echo " Input list: '$test_string'" echo " Expected: '$expected_after_not_exist'" echo " Got: '$after_not_exist'" exit 1 fi } test_list_append_element() { local test_string="apple:banana:cherry:date:grape" local append_element="new_element" local expected_appended="apple:banana:cherry:date:grape:new_element" list_append_element "$test_string" "$append_element" local appended=$_ret_ if [[ "$appended" != "$expected_appended" ]]; then echo "Append test failed:" echo " Input list: '$test_string'" echo " Append Element: '$append_element'" echo " Expected: '$expected_appended'" echo " Got: '$appended'" exit 1 fi } test_list_prepend_element() { local test_string="apple:banana:cherry:date:grape" local prepend_element="new_element" local expected_prepended="new_element:apple:banana:cherry:date:grape" list_prepend_element "$test_string" "$prepend_element" local prepended=$_ret_ if [[ "$prepended" != "$expected_prepended" ]]; then echo "Prepend test failed:" echo " Input list: '$test_string'" echo " Prepend Element: '$prepend_element'" echo " Expected: '$expected_prepended'" echo " Got: '$prepended'" exit 1 fi } test_list_find_element_regex() { local test_string="apple:banana:cherry:date:grape" # Test element found local regex="^banana$" local expected_index=1 list_find_element_regex "$test_string" "$regex" local found_index=$_ret_ if [[ "$found_index" -ne $expected_index ]]; then echo "Find element regex test failed:" echo " Input list: '$test_string'" echo " Regex: '$regex'" echo " Expected index: $expected_index" echo " Got index: $found_index" exit 1 fi # Test element not found local not_found_regex="^pear$" local expected_not_found="-1" list_find_element_regex "$test_string" "$not_found_regex" local not_found_index=$_ret_ if [[ "$not_found_index" != "$expected_not_found" ]]; then echo "Find element regex test for not found failed:" echo " Input list: '$test_string'" echo " Regex: '$not_found_regex'" echo " Expected index: $expected_not_found" echo " Got index: $not_found_index" exit 1 fi } # test_list_size # test_list_insert_element # test_list_remove_at # test_list_find_element # test_list_remove_element_if_exist # test_list_remove_non_existent_element # test_list_append_element # test_list_prepend_element # test_list_find_element_regex return 0