运行shell脚本后,变量会丢失它们的值

时间:2016-04-05 15:25:31

标签: shell variables

我做了一个简单的shell脚本:

#!/bin/sh
file_name=$1
state=`cat "$file_name" | grep "port protocol" | awk '{print $4}'`
echo $state
reason=`cat "$file_name" | grep "port protocol"`
echo $reason

输出值$ state和$ reason。 但是,当我跑步时..

echo $state

..在控制台中它不会输出任何内容。似乎变量失去了它的价值。这是正常行为还是我应该对脚本有所帮助?

谢谢!

1 个答案:

答案 0 :(得分:1)

假设您正在运行自己的脚本,例如./script.shsh script.sh,那么这就是预期的行为。子进程不能改变其父进程的环境。您从shell运行shell脚本这一事实并未改变此规则。

可以做的是获取脚本而不是执行它,在本地环境中设置这些变量:

. script.sh

这有效地运行当前shell中脚本的行,因此将在那里设置变量。

虽然我已引起您的注意,但我建议您对脚本进行以下更改:

#!/bin/sh
file_name=$1
state=$(awk '/port protocol/ {print $4}' "$file_name")
echo "$state"
reason=$(grep "port protocol" "$file_name")
echo "$reason"

简而言之,引用您的变量,避免对cat进行无用的调用,并在awk中使用模式匹配,而不是将grep传递给它。