在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时