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

Bash 变量中字符串的排序列表,bash,shell,sorting,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) 但它仍然显示

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

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
我不明白为什么这种方法不起作用

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

更新: 这是我正在编写的代码

我有以下环境变量:

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
}
create_app_dir(){
#获取名称为的所有变量以APP_PATH开头*
本地参数列表=`echo${!APP_PATH*}`
echo“PARAMLIST=${PARAMLIST}”

local SORTEDLIST=$(sort-t_2;-k3n,因为根据定义,sort只处理行。man sort:

排序-对文本文件的行进行排序


SORTEDLIST=$(sort-t“-k3n,3,因为sort仅根据定义处理行。man sort:

排序-对文本文件的行进行排序

SORTEDLIST=$(sort-t“-k3n,3试试这个:

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

试试这个:

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


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变量使用所有大写字母;此约定用于指示用于更改程序行为的环境变量。

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变量使用所有大写字母;此约定用于指示用于更改程序行为的环境变量。

我刚刚尝试过,但仍然不起作用。我已经用我正在处理的部分代码和您建议的解决方案更新了这个问题。@FadhlieIkram我的和他的sol注意(它们几乎相同)使用您的示例代码在我的机器上工作。这很奇怪,它不在我的机器上。可能是不同的bash版本。无论如何,我已经设法使它工作了,但只有在我将列表迭代到一个临时文件中,然后我才调用该文件进行排序。我接受这个答案,感谢您的帮助:)。我刚刚试过,但仍然不起作用。我已经用我正在处理的部分代码更新了这个问题,以及你提出的解决方案。@FadhlieIkram我的和他的解决方案(几乎相同)使用您的示例代码在我的机器上工作。这很奇怪,它不在我的机器上。可能是不同的bash版本。无论如何,我已经设法使它工作了,但只有在我将列表迭代到一个临时文件中,然后我才调用该文件进行排序。我接受这个答案,感谢您的帮助:)。您在分类列表中得到的实际顺序是什么?@abhinandrasad确切地说是这个列表=“APP\u PATH\u 10\u TARGET APP\u PATH\u 1\u TARGET APP\u PATH\u 2\u TARGET APP\u PATH\u 3\u TARGET”您在分类列表中得到的实际顺序是什么?@abhinandrasad确切地说是这个列表=“APP\u PATH\u 10\u TARGET APP\u PATH\u PATH\u 1\u TARGET APP\u PATH\u 2\u TARGET APP\u PATH\u PATH\u 3\u TARGET”