Bash Unix Shell脚本接受输入和设置系统变量

时间:2012-03-12 18:17:23

标签: bash shell unix

我正在尝试修改现有的shell脚本以接受用户输入并处理一些系统导出。以下是较大脚本的摘录。运行此脚本后,我回显$ TEST_DIR并且我没有收到任何回复。有什么想法吗?

#!/bin/sh

if [ -z "$TEST_DIR" ]
then
    echo "TEST_DIR was not set, please enter the path: "
    read input_variable
    export TEST_DIR=$input_variable
    exit 1
fi

3 个答案:

答案 0 :(得分:3)

将其另存为script.sh

#!/bin/bash

if [ -z "$TEST_DIR" ]
then
    echo "TEST_DIR was not set, please enter the path: "
    read input_variable
    export TEST_DIR=$input_variable
fi

然后像这样运行:

. ./script.sh

或等同地:

source ./script.sh

source在当前环境中运行脚本,因此允许您在脚本中修改环境。没有它,每个作为shell进程的子进程运行的命令只会获得当前环境的副本。

注意我删除了exit行,因为它会在这种情况下终止shell。

答案 1 :(得分:1)

问题是你在子shell中运行脚本 - 它正确地设置你的TEST_DIR,但是shell退出了,而且父shell没有保留更改。

你可能最好将这个功能从父shell中获取。 Shell脚本不能修改调用shell的环境,但是函数可以修改它正在执行的shell。

答案 2 :(得分:1)

您可能不想exit 1;用来表示失败。您可以使用exit 0来表示成功 - 但是,如下所述,在这种情况下,您也不希望这样做。

另一个问题是,如果您将脚本作为子进程运行,则它不会影响父进程的环境。

要解决此问题,在POSIX shell中,您需要使用:

. your_script.sh

或者,在bash中,您还可以使用:

source your_script.sh

脚本不必是可执行的,只是可读的,并且将在$PATH上搜索,除非您指定包含斜杠的名称,就像其他命令一样。

而且,当您执行.source时,您肯定不希望脚本中有任何exit,因为这会导致主shell退出。 shell读取文件就像您在标准输入(或多或少)中键入它一样,因此执行的exit将退出shell。