我有下面的代码,想排序的字符串列表。
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
}
答案 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变量使用全大写;该约定用于指示旨在更改程序行为的环境变量。