对变量中的字符串排序列表

时间:2018-11-19 06:11:34

标签: bash shell sorting

我有下面的代码,想排序的字符串列表。

LIST="APP_PATH_10_TARGET APP_PATH_1_TARGET APP_PATH_2_TARGET APP_PATH_3_TARGET"

我的目标是将其分类为:

"APP_PATH_1_TARGET APP_PATH_2_TARGET APP_PATH_3_TARGET APP_PATH_10_TARGET"

所以我做到了:

SORTEDLIST=$(echo ${LIST} | sort -t"_" -k3n,3)

但是它仍然显示:

SORTEDLIST=APP_PATH_10_TARGET APP_PATH_1_TARGET APP_PATH_2_TARGET APP_PATH_3_TARGET

我不知道为什么排序不起作用。

================================================ =================

更新: 这是我正在处理的代码。

我有这个ENV变量:

APP_PATH_1_TARGET="/prd/example/1"
APP_PATH_2_TARGET="/prd/example/2"
APP_PATH_3_TARGET="/prd/example/3"
APP_PATH_10_TARGET="/prd/example/4"

该代码无效,因为该列表的顺序不正确:

create_app_dir(){
  # Get all variables with name starts with APP_PATH*
  local PARAMLIST=`echo ${!APP_PATH*}`
  echo "PARAMLIST=${PARAMLIST}"
  local SORTEDLIST=$(sort -t_ -k3n <<< ${PARAMLIST// /$'\n'}|tr -s "\n" " ")
  echo "SORTEDLIST=${SORTEDLIST}"

  # Iterate the list and create dir if doesn't exist
  for p in ${SORTEDLIST}; do
    if [[ "${p}" = *_TARGET ]] && [ ! -d "${p}" ]; then

      echo "[+] Creating application directory:${!p}"
      ./make_dir.sh "${!p}"

      if [ $? -ne 0 ]; then
        echo "[-] Error: Unable to create dir." >&2
        return 1
      fi
    fi
  done
}

3 个答案:

答案 0 :(得分:3)

因为按定义排序仅适用于行。男人排序:

  

排序-文本文件的排序行

SORTEDLIST=$(sort -t"_" -k3n,3 <<< ${LIST// /$'\n'}|tr -s "\n" " ")

答案 1 :(得分:0)

尝试一下:

 SORTEDLIST = $(sort -t_ -k3n filename | tr -s '\n\r' ' ')

  SORTEDLIST = $(sort -t_ -k3n filename | tr -s '\n' ' ')

答案 2 :(得分:0)

sort按顺序排列。要对个单词进行排序,您需要将每个单词重新写成一行:

SORTEDLIST=$(printf "%s\n" $LIST | sort -t_ -k3n)

由于您使用的是Bash,因此最好使用真实列表,这样您才能获得正确的报价:

LIST=(APP_PATH_10_TARGET APP_PATH_1_TARGET APP_PATH_2_TARGET APP_PATH_3_TARGET)
SORTEDLIST=($(printf "%s\n" "${LIST[@]}" | sort -t_ -k3n))

for p in "${SORTEDLIST[@]}"

此外,您应该避免对shell变量使用全大写;该约定用于指示旨在更改程序行为的环境变量。