当我想-sort
在它之后运行我的参数时,我需要对我提到的所有其他参数进行排序。例子
. MyScript.sh -sort Tree Apple 布尔值
输出应该是
苹果 布尔值 树
我试图创建一个数组并运行所有参数,但这没有成功
Array=()
while (( "$#" ))
do
Array += "$1"
shift
done
这也有我无法忽视的问题-sort
。
试试这个脚本:
#!/bin/bash
if [ "$1" = "-sort" ]; then
shift;
echo "$@" | tr ' ' '\n' | sort | tr '\n' ' ';
echo;
else
echo "$@";
fi
说明:第一个if
检查第一个参数是否为-sort
. 如果是,它会改变论点,所以-sort
会消失,但其他论点仍然存在。然后运行参数tr
,将空格分隔的列表转换为换行符分隔的列表(sort
需要),然后通过管道传递sort
最终打印排序列表(转换回空格分隔格式)。如果第一个参数不是-sort
,那么它只是按原样打印列表。
if [ "X$1" = "X-sort" ]
then shift; printf "%s\n" "$@" | sort
else printf "%s\n" "$@"
fi
该then
子句打印参数,每行一个(如果参数包含换行符,则会出现问题),并将其提供给sort
. 该else
子句按原始(未排序)顺序列出参数。X
withtest
的使用可能不是 100% 必要的,但可以避免任何对test
(aka [
) 参数的误解的可能性。
您的代码片段的一个问题是 in 周围的空格+=
:
Array += "$1"
Shell 不喜欢赋值运算符周围的空格;你需要写:
Array+="$1"
你也可以做这样的事情并根据你的要求添加它。:
#!/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