Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Bash中使用循环检查变量_Bash_Loops_Variables - Fatal编程技术网

在Bash中使用循环检查变量

在Bash中使用循环检查变量,bash,loops,variables,Bash,Loops,Variables,我构建了一个脚本,您可以在其中设置特定文件中的变量 现在我想编写一个脚本,检查文件中的所有变量是否为空/未设置 以下是一个示例文件: #variables.tmp export foo=1 export bar= 以下是我的代码,我试图找出是否已全部设置: #!/bin/bash PATHTOVARIABLES=/usr/local #read variables source $PATHTOVARIABLES/variables.tmp #seperate comments from

我构建了一个脚本,您可以在其中设置特定文件中的变量

现在我想编写一个脚本,检查文件中的所有变量是否为空/未设置

以下是一个示例文件:

#variables.tmp
export foo=1
export bar=
以下是我的代码,我试图找出是否已全部设置:

#!/bin/bash

PATHTOVARIABLES=/usr/local

#read variables
source $PATHTOVARIABLES/variables.tmp

#seperate comments from variables in file export.tmp
cat $PATHTOVARIABLES/variables.tmp | grep export > $PATHTOVARIABLES/export.tmp

#get variables in form "${var}"
sed -i "s/export /\"\$\{/g" $PATHTOVARIABLES/export.tmp
sed -i "s/=.*/\}\"/g" $PATHTOVARIABLES/export.tmp

#for-loop to read in variables
for i in `cat $PATHTOVARIABLES/export.tmp`
do

#check if variables are set or not
  if [ -z $i ]; then
    echo "Variable " $i " set"
  else
    echo " Variable not set"
  fi

done

rm $PATHTOVARIABLES/export.tmp
作为回报,无论变量是否设置,我都会得到“变量未设置”

我使用了我在那里发现的
if
条件:

你能解释一下我的代码有什么问题吗?我是bash脚本新手,请耐心等待;-)

要求对系统目录进行写访问从来都不是一个好主意。我冒昧地把它重新定义为我家里的东西

source $PATHTOVARIABLES/variables.tmp
此时,
foo
被设置为
1
,而
bar
被取消设置

cat $PATHTOVARIABLES/variables.tmp | grep export > $PATHTOVARIABLES/export.tmp

#get variables in form "${var}"
sed -i "s/export /\"\$\{/g" $PATHTOVARIABLES/export.tmp
sed -i "s/=.*/\}\"/g" $PATHTOVARIABLES/export.tmp
此时,导出。tmp包含:

"${foo}"
"${bar}"
按设计工作

#for-loop to read in variables
for i in `cat $PATHTOVARIABLES/export.tmp`
do
此时,
i
包含字符串
“${foo}”
(在第二个循环中,
“${bar}”

否,您正在检查变量
i
是否为空。它包含
“${foo}”
,它不是空的,因此条件为false,因此

echo " Variable not set"
计算机完全按照你告诉他们的去做,而不是你想让他们做的去做

我通过在适当的位置添加行
echo$foo
echo$bar
cat$pathtovaries/export.tmp
,和
echo$I
,大大缩小了脚本不再满足期望的范围。你可以自己做这个,给出一个更短的问题

如果您正在寻找一种方法来检查
i
中命名的变量是否已设置, 那么您要查找的命令是
eval
(下面是警告)。

for i in `cat $PATHTOVARIABLES/export.tmp`
do
    eval "tmp=${i}"    # expands to tmp="${foo}" / tmp="${bar}" and gets evaluated

    if [[ -z $tmp ]]
    then
        echo "Variable ${i} is not set."
    else
        echo "Variable ${i} is set to ${tmp}."
    fi
done

注意事项:

对外部输入使用
eval
潜在危险的。如果攻击者能够修补您的脚本提供给
eval
(在本例中为文件
variables.tmp
)的任何内容,则他可以让您的脚本以执行脚本的任何用户的权限执行命令(在您的例子中,
root
——这就是为什么将某些东西测试为
root
不是一个好主意)

我看不出在您的具体案例中会发生这种情况,但我询问了用户chepner,他似乎不同意

要求对系统目录进行写访问从来都不是一个好主意。我冒昧地在我的home dir中重新定义了它

source $PATHTOVARIABLES/variables.tmp
此时,
foo
被设置为
1
,而
bar
被取消设置

cat $PATHTOVARIABLES/variables.tmp | grep export > $PATHTOVARIABLES/export.tmp

#get variables in form "${var}"
sed -i "s/export /\"\$\{/g" $PATHTOVARIABLES/export.tmp
sed -i "s/=.*/\}\"/g" $PATHTOVARIABLES/export.tmp
此时,导出。tmp包含:

"${foo}"
"${bar}"
按设计工作

#for-loop to read in variables
for i in `cat $PATHTOVARIABLES/export.tmp`
do
此时,
i
包含字符串
“${foo}”
(在第二个循环中,
“${bar}”

否,您正在检查变量
i
是否为空。它包含
“${foo}”
,该变量不是空的,因此条件为false,因此

echo " Variable not set"
计算机完全按照你告诉他们的去做,而不是你想让他们做的去做

我通过在适当的位置添加行
echo$foo
echo$bar
cat$pathtovaries/export.tmp
,和
echo$I
,大大缩小了脚本不再满足期望的范围。你可以自己做这个,给出一个更短的问题

如果您正在寻找一种方法来检查
i
中命名的变量是否已设置, 那么您要查找的命令是
eval
(下面是警告)。

for i in `cat $PATHTOVARIABLES/export.tmp`
do
    eval "tmp=${i}"    # expands to tmp="${foo}" / tmp="${bar}" and gets evaluated

    if [[ -z $tmp ]]
    then
        echo "Variable ${i} is not set."
    else
        echo "Variable ${i} is set to ${tmp}."
    fi
done

注意事项:

对外部输入使用
eval
潜在危险的。如果攻击者能够修补您的脚本提供给
eval
(在本例中为文件
variables.tmp
)的任何内容,则他可以让您的脚本以执行脚本的任何用户的权限执行命令(在您的例子中,
root
——这就是为什么将某些东西测试为
root
不是一个好主意)


我看不出在您的特定情况下会发生这种情况,但我询问了用户切普纳,他似乎不同意。

首先,请注意,根据定义,变量是在
source
命令之后设置的;
bar=
将变量设置为空字符串

不需要
grep
或临时文件;您可以迭代 查看
bash
中的文件,并在读取变量时检查每个变量 文件。使用间接参数展开查找以字符串形式命名的参数的值

#!/bin/bash

PATHTOVARIABLES=/usr/local

#read variables
source $PATHTOVARIABLES/variables.tmp

# Get the name of each exported value
while IFS='= ' read tag name value; do
    [[ $tag == export ]] || continue
    # Indirect expansion: get the value of
    # the parameter whose name is $name
    value=${!name}
    if [[ -z $value ]]; then
        echo "$name has empty value"
    else
       echo "$name has value ${!name}"
    fi
done < "$PATHTOVARIABLES/variables.tmp"
!/bin/bash
PATHTOVARIABLES=/usr/local
#读取变量
source$PATHTOVARIABLES/variables.tmp
#获取每个导出值的名称
当IFS='='读取标记名值时,执行以下操作
[$tag==export]| |继续
#间接扩展:获取
#名称为$name的参数
value=${!name}
如果[[-z$value]];则
echo“$name有空值”
其他的
echo“$name具有值${!name}”
fi
完成<“$PATHTOVARIABLES/variables.tmp”

有一些特殊的情况,你可能需要考虑的是:你没有明确地提到:一个“代码>出口导出/代码>命令可以设置多个变量的值,而<代码>导出< /代码>命令可以输出一个或多个名称而不实际为它们设置值。

source
命令;
bar=
将变量设置为空字符串

不需要
grep
或临时文件;您可以迭代 查看
bash
中的文件,并在读取变量时检查每个变量 文件。使用间接参数展开查找以字符串形式命名的参数的值

#!/bin/bash

PATHTOVARIABLES=/usr/local

#read variables
source $PATHTOVARIABLES/variables.tmp

# Get the name of each exported value
while IFS='= ' read tag name value; do
    [[ $tag == export ]] || continue
    # Indirect expansion: get the value of
    # the parameter whose name is $name
    value=${!name}
    if [[ -z $value ]]; then
        echo "$name has empty value"
    else
       echo "$name has value ${!name}"
    fi
done < "$PATHTOVARIABLES/variables.tmp"
!/bin/bash
PATHTOVARIABLES=/usr/local
#读取变量
source$PATHTOVARIABLES/variables.tmp
#获取每个导出值的名称
当IFS='='读取标记na时