5

当我想-sort在它之后运行我的参数时,我需要对我提到的所有其他参数进行排序。例子

. MyScript.sh -sort Tree Apple 布尔值

输出应该是

苹果
布尔值
树

我试图创建一个数组并运行所有参数,但这没有成功

Array=()
while (( "$#" ))
do
  Array += "$1"
  shift
done

这也有我无法忽视的问题-sort

4

3 回答 3

7

试试这个脚本:

#!/bin/bash

if [ "$1" = "-sort" ]; then
    shift;
    echo "$@" | tr ' ' '\n' | sort | tr '\n' ' ';
    echo;
else
    echo "$@";
fi

说明:第一个if检查第一个参数是否为-sort. 如果是,它会改变论点,所以-sort会消失,但其他论点仍然存在。然后运行参数tr,将空格分隔的列表转换为换行符分隔的列表(sort需要),然后通过管道传递sort最终打印排序列表(转换回空格分隔格式)。如果第一个参数不是-sort,那么它只是按原样打印列表。

于 2013-06-02T06:08:59.080 回答
0
if [ "X$1" = "X-sort" ]
then shift; printf "%s\n" "$@" | sort
else        printf "%s\n" "$@"
fi

then子句打印参数,每行一个(如果参数包含换行符,则会出现问题),并将其提供给sort. 该else子句按原始(未排序)顺序列出参数。Xwithtest的使用可能不是 100% 必要的,但可以避免任何对test(aka [) 参数的误解的可能性。


您的代码片段的一个问题是 in 周围的空格+=

Array += "$1"

Shell 不喜欢赋值运算符周围的空格;你需要写:

Array+="$1"
于 2013-06-02T06:48:37.037 回答
0

你也可以做这样的事情并根据你的要求添加它。:

#!/bin/bash

if [ "$1" == "-sort" ]; then
    shift;
    my_array=("$@")
    IFS=$'\n' my_sorted_array=($(sort <<<"${my_array[*]}"))
    printf "%s\n" "${my_sorted_array[@]}"
else
    echo "$@"
fi

测试:

[jaypal:~] ./s.sh -sort apple doggie ball cat
apple
ball
cat
doggie
于 2013-06-02T06:43:27.027 回答