{"id":4793,"date":"2021-09-08T09:59:16","date_gmt":"2021-09-08T00:59:16","guid":{"rendered":"\/blog\/?p=4793"},"modified":"2023-09-21T09:26:30","modified_gmt":"2023-09-21T00:26:30","slug":"bash%eb%a1%9c-stack-%ea%b5%ac%ec%a1%b0-%ea%b5%ac%ed%98%84","status":"publish","type":"post","link":"https:\/\/hasu0707.duckdns.org\/blog\/?p=4793","title":{"rendered":"bash\ub85c Stack \uad6c\uc870 \uad6c\ud604"},"content":{"rendered":"\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">######################################################################\n# Stack \ud568\uc218: Stack\uc744 \uc0dd\uc131\ud55c\ub2e4.\n# Example: func_stack_new name\n######################################################################\nfunc_stack_new() {\n  : ${1?'Missing stack name'}\n  if func_stack_exists $1\n  then\n    echo \"Stack already exists -- $1\" >&amp;2\n    return 1\n  fi\n\n  eval \"declare -ag _stack_$1\"\n  eval \"declare -ig _stack_$1_i\"\n  eval \"let _stack_$1_i=0\"\n  return 0\n}\n\n######################################################################\n# Stack \ud568\uc218: Stack\uc744 \uc81c\uac70\ud55c\ub2e4.\n# Example: func_stack_destroy name\n######################################################################\nfunc_stack_destroy() {\n  : ${1?'Missing stack name'}\n  eval \"unset _stack_$1 _stack_$1_i\"\n  return 0\n}\n\n######################################################################\n# Stack \ud568\uc218: Push\n# Example: func_stack_push stack item ...\n######################################################################\nfunc_stack_push() {\n  : ${1?'Missing stack name'}\n  : ${2?'Missing item(s) to push'}\n\n  if func_no_such_stack $1\n  then\n    echo \"No such stack -- $1\" >&amp;2\n    return 1\n  fi\n\n  stack=$1\n  shift 1\n\n  while (( $# > 0 ))\n  do\n    eval '_i=$'\"_stack_${stack}_i\"\n    eval \"_stack_${stack}[$_i]='$1'\"\n    eval \"let _stack_${stack}_i+=1\"\n    shift 1\n  done\n\n  unset _i\n  return 0\n}\n\n######################################################################\n# Stack \ud568\uc218: Pop\n# Example: func_stack_pop mystack top\n#          echo \"Got $top\"\n######################################################################\nfunc_stack_pop() {\n  : ${1?'Missing stack name'}\n  : ${2?'Missing name of variable for popped result'}\n\n  eval 'let _i=$'\"_stack_$1_i\"\n  if func_no_such_stack $1\n  then\n    echo \"No such stack -- $1\" >&amp;2\n    return 1\n  fi\n\n  if [[ \"$_i\" -eq 0 ]]\n  then\n    echo \"Empty stack -- $1\" >&amp;2\n    return 1\n  fi\n\n  let _i-=1\n  eval \"$2\"='$'\"{_stack_$1[$_i]}\"\n  eval \"unset _stack_$1[$_i]\"\n  eval \"_stack_$1_i=$_i\"\n  unset _i\n  return 0\n}\n\n######################################################################\n# Stack \ud568\uc218: Stack \uc804\uccb4\ub97c \ucd9c\ub825\ud55c\ub2e4.\n# Example: func_stack_print name\n######################################################################\nfunc_stack_print() {\n  : ${1?'Missing stack name'}\n\n  if func_no_such_stack $1\n  then\n    echo \"No such stack -- $1\" >&amp;2\n    return 1\n  fi\n\n  tmp=\"\"\n  eval 'let _i=$'_stack_$1_i\n  while (( $_i > 0 ))\n  do\n    let _i=${_i}-1\n    eval 'e=$'\"{_stack_$1[$_i]}\"\n    tmp=\"$tmp $e\"\n  done\n  echo \"(\" $tmp \")\"\n}\n\n######################################################################\n# Stack \ud568\uc218: Stack \ud06c\uae30\ub97c \uc54c\uc544\ub0b8\ub2e4.\n# Example: func_stack_size mystack n\n#          echo \"Size is $n\"\n######################################################################\nfunc_stack_size() {\n  : ${1?'Missing stack name'}\n  : ${2?'Missing name of variable for stack size result'}\n  if func_no_such_stack $1\n  then\n    echo \"No such stack -- $1\" >&amp;2\n    return 1\n  fi\n  eval \"$2\"='$'\"{#_stack_$1[*]}\"\n}\n\nfunc_stack_exists() {\n  : ${1?'Missing stack name'}\n\n  eval '_i=$'\"_stack_$1_i\"\n  if [[ -z \"$_i\" ]]\n  then\n    return 1\n  else\n    return 0\n  fi\n}\n\nfunc_no_such_stack() {\n  : ${1?'Missing stack name'}\n  func_stack_exists $1\n  ret=$?\n  declare -i x\n  let x=\"1-$ret\"\n  return $x\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[39],"tags":[],"class_list":["post-4793","post","type-post","status-publish","format-standard","hentry","category-os_linux_unix_macos"],"_links":{"self":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4793","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4793"}],"version-history":[{"count":0,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4793\/revisions"}],"wp:attachment":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4793"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4793"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}