Bash 链接命令,直到变量不为空或未定义?
我试图用一个可执行文件填充一个变量,以便以后调用。我知道以下内容是错误的,因为它正在测试返回值,但我不确定如何正确执行(添加了包装以便于查看): 更准确地说,我知道我可以用一堆Bash 链接命令,直到变量不为空或未定义?,bash,shell,command,variable-assignment,chain,Bash,Shell,Command,Variable Assignment,Chain,我试图用一个可执行文件填充一个变量,以便以后调用。我知道以下内容是错误的,因为它正在测试返回值,但我不确定如何正确执行(添加了包装以便于查看): 更准确地说,我知道我可以用一堆if语句来实现它,但我试图避免它,因为它会展开成大约4或8个块: if [ -z "$CHECKSEC" ]; then CHECKSEC=`which checksec 2>/dev/null` fi ... if [ -z "$CHECKSEC" ]; then echo "Unable to loca
if
语句来实现它,但我试图避免它,因为它会展开成大约4或8个块:
if [ -z "$CHECKSEC" ]; then
CHECKSEC=`which checksec 2>/dev/null`
fi
...
if [ -z "$CHECKSEC" ]; then
echo "Unable to locate checksec. If you have it, be sure its on PATH. If"
echo " you need it, you can download it from http://www.trapkit.de/tools/."
exit 1;
fi
是否可以像我正在尝试的那样,链接命令来填充变量?(或者这是一个“你为什么要那样做”?)
如果是这样,我如何链接命令,以便当变量不是空的且不是未定义的时,[特定]处理停止?这将在$PATH和/usr/local/bin中查找“not\u This”、“ls”和“nor\u This”
应该找到“ls”
#!/bin/bash
locate_cmd()
{
which "$1" || ls /usr/local/bin/"$1" 2>/dev/null
}
c=`locate_cmd not_this` || c=`locate_cmd ls` || c=`locate_cmd nor_that` || echo nope
echo cmd=$c
这将在$PATH和/usr/local/bin中查找“not_This”、“ls”和“nor_This”
应该找到“ls”
#!/bin/bash
locate_cmd()
{
which "$1" || ls /usr/local/bin/"$1" 2>/dev/null
}
c=`locate_cmd not_this` || c=`locate_cmd ls` || c=`locate_cmd nor_that` || echo nope
echo cmd=$c
这将在$PATH和/usr/local/bin中查找“not_This”、“ls”和“nor_This”
应该找到“ls”
#!/bin/bash
locate_cmd()
{
which "$1" || ls /usr/local/bin/"$1" 2>/dev/null
}
c=`locate_cmd not_this` || c=`locate_cmd ls` || c=`locate_cmd nor_that` || echo nope
echo cmd=$c
这将在$PATH和/usr/local/bin中查找“not_This”、“ls”和“nor_This”
应该找到“ls”
#!/bin/bash
locate_cmd()
{
which "$1" || ls /usr/local/bin/"$1" 2>/dev/null
}
c=`locate_cmd not_this` || c=`locate_cmd ls` || c=`locate_cmd nor_that` || echo nope
echo cmd=$c
用蛮力做你似乎想做的事情的方法是:
CHECKSEC=$(which checksec 2>/dev/null ||
which checksec.sh 2>/dev/null ||
ls /usr/local/bin/checksec 2>/dev/null ||
ls /usr/local/bin/checksec.sh 2>/dev/null
)
它不是特别优雅,但它应该能胜任这项工作。使用$(…)
代替反勾号(`…`
)通常是一个好主意。很容易使用:
CHECKSEC=$( {which checksec || which checksec.sh ||
ls /usr/local/bin/checksec || ls /usr/local/bin/checksec.sh; } 2>/dev/null)
以减少重定向的数量。我们也很容易考虑:
CHECKSEC=$( { PATH=$PATH:/usr/local/bin; which checksec || which checksec.sh; } 2>/dev/null)
因此,
将在/usr/local/bin
中查找作为最后手段。执行您似乎试图执行的操作的暴力方式是:
CHECKSEC=$(which checksec 2>/dev/null ||
which checksec.sh 2>/dev/null ||
ls /usr/local/bin/checksec 2>/dev/null ||
ls /usr/local/bin/checksec.sh 2>/dev/null
)
它不是特别优雅,但它应该能胜任这项工作。使用$(…)
代替反勾号(`…`
)通常是一个好主意。很容易使用:
CHECKSEC=$( {which checksec || which checksec.sh ||
ls /usr/local/bin/checksec || ls /usr/local/bin/checksec.sh; } 2>/dev/null)
以减少重定向的数量。我们也很容易考虑:
CHECKSEC=$( { PATH=$PATH:/usr/local/bin; which checksec || which checksec.sh; } 2>/dev/null)
因此,将在/usr/local/bin
中查找作为最后手段。执行您似乎试图执行的操作的暴力方式是:
CHECKSEC=$(which checksec 2>/dev/null ||
which checksec.sh 2>/dev/null ||
ls /usr/local/bin/checksec 2>/dev/null ||
ls /usr/local/bin/checksec.sh 2>/dev/null
)
它不是特别优雅,但它应该能胜任这项工作。使用$(…)
代替反勾号(`…`
)通常是一个好主意。很容易使用:
CHECKSEC=$( {which checksec || which checksec.sh ||
ls /usr/local/bin/checksec || ls /usr/local/bin/checksec.sh; } 2>/dev/null)
以减少重定向的数量。我们也很容易考虑:
CHECKSEC=$( { PATH=$PATH:/usr/local/bin; which checksec || which checksec.sh; } 2>/dev/null)
因此,将在/usr/local/bin
中查找作为最后手段。执行您似乎试图执行的操作的暴力方式是:
CHECKSEC=$(which checksec 2>/dev/null ||
which checksec.sh 2>/dev/null ||
ls /usr/local/bin/checksec 2>/dev/null ||
ls /usr/local/bin/checksec.sh 2>/dev/null
)
它不是特别优雅,但它应该能胜任这项工作。使用$(…)
代替反勾号(`…`
)通常是一个好主意。很容易使用:
CHECKSEC=$( {which checksec || which checksec.sh ||
ls /usr/local/bin/checksec || ls /usr/local/bin/checksec.sh; } 2>/dev/null)
以减少重定向的数量。我们也很容易考虑:
CHECKSEC=$( { PATH=$PATH:/usr/local/bin; which checksec || which checksec.sh; } 2>/dev/null)
这样,哪个
将在/usr/local/bin
中查找作为最后手段。太好了,非常感谢。最后一个版本最紧凑,在阴性情况下测试良好。严格来说,最后一个版本与ls
版本并不完全相同;如果脚本不可执行,它不会在/usr/local/bin
中列出脚本,而ls
变量将列出脚本。我的怀疑是“没关系”,但你需要意识到其中的区别。(我刚才才注意到。)“我的怀疑是“没关系”…-是的,那是一个错误,我没有意识到他在等待。再次感谢。你让这看起来很容易。我想它把问题放在了“不知道如何打开电脑的狂热程序员”周围。我应该搜索什么?我选择了一些明显的术语,比如标签中使用的术语。我得到了单变量/单命令命中率;而且我没有得到优雅的一行程序。有时,多年的经验是无法替代的。如果有什么安慰的话,我首先想到的是for dir in…
,这看起来不错,直到我意识到您正在寻找checksec
或checksec.sh
,这可以通过嵌套循环处理(一个在目录上,一个在两个脚本名上),但是,您使用which
来查找路径和ls
,所以这看起来不太好,但是命令和cmd的name-上嵌套了循环,其中ls;在checksec checksec.sh中输入do作为名称;do CHECKSEC=$($cmd$name 2>/dev/null);[-n“$CHECKSEC”]&中断;完成;完成
-可以。很好,非常感谢。最后一个版本最紧凑,在阴性情况下测试良好。严格来说,最后一个版本与ls
版本并不完全相同;如果脚本不可执行,它不会在/usr/local/bin
中列出脚本,而ls
变量将列出脚本。我的怀疑是“没关系”,但你需要意识到其中的区别。(我刚才才注意到。)“我的怀疑是“没关系”…-是的,那是一个错误,我没有意识到他在等待。再次感谢。你让这看起来很容易。我想它把问题放在了“不知道如何打开电脑的狂热程序员”周围。我应该搜索什么?我选择了一些明显的术语,比如标签中使用的术语。我得到了单变量/单命令命中率;而且我没有得到优雅的一行程序。有时,多年的经验是无法替代的。如果有什么安慰的话,我首先想到的是for dir in…
,这看起来不错,直到我意识到您正在寻找checksec
或checksec.sh
,这可以通过嵌套循环处理(一个在目录上,一个在两个脚本名上),但是,您使用which
来查找路径和ls
,所以这看起来不太好,但是命令和cmd的name-上嵌套了循环,其中ls;在checksec checksec.sh中输入do作为名称;do CHECKSEC=$($cmd$name 2>/dev/null);[-n“$CHECKSEC”]&中断;完成;完成
-可以。很好,非常感谢。最后一个是最紧凑的,对阴性病例测试良好