在放在花括号中的“ while”循环中分配变量无效

时间:2019-05-09 15:41:21

标签: bash

bash脚本获取参数,对其进行排序,修改并将其输出到文件中。 我也尝试将最后排序的参数保存在变量中,但是它不起作用。该变量为空。变量的分配在大括号内的管道“ while循环”中。

我尝试在脚本开始处引入变量,但没有效果。

#!/bin/bash

# Set work dir to place where the script located
cd "$(dirname "$0")"

# Read args
for arg in "$@"
do    
    echo "$arg"
done | sort | { 
while read -r line 
do  
    echo "$line" + "modifier"
    last_sorted_arg="$line" # It does not work
done } > sorted_modified_args.txt


# Empty string - not Ok
echo "$last_sorted_arg"

sleep 3

我可以使用一个临时文件和两个循环来解决该问题,但是看起来不太好。有没有临时文件和两个循环的方法吗?

#!/bin/bash

cd "$(dirname "$0")"

for arg in "$@"
do    
    echo "$arg"
done | sort > sorted_args.txt


while read -r line 
do  
    last_sorted_arg="$line"
done < sorted_args.txt

# Ok
echo "$last_sorted_arg"


# It works too
while read -r line 
do  
    echo "$line" + "modifier"
done < sorted_args.txt > sorted_modified_args.txt

sleep 3

1 个答案:

答案 0 :(得分:1)

局部变量在子过程中丢失。

编辑:删除了不起作用的代码,试图使工作接近原始代码。

排序方式可以不同:

#!/bin/bash

last_sorted_arg=$( printf "%s\n" "$@" | sort -n | tee sorted_modified_args.txt | tail -1)
echo "last=${last_sorted_arg}"