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”]&中断;完成;完成
-可以。很好,非常感谢。最后一个是最紧凑的,对阴性病例测试良好