我有一个非常简单的脚本,大致如下:

#!/bin/bash

VAR1="$1"
MOREF='sudo run command against $VAR1 | grep name | cut -c7-'

echo $MOREF

当我从命令行运行这个脚本并向它传递参数时,我没有得到任何输出。然而,当我运行$MOREF变量中包含的命令时,我能够获得输出。

如何获取需要在脚本中运行的命令的结果,将其保存到变量中,然后在屏幕上输出该变量?


当前回答

有些人可能觉得这很有用。变量替换中的整数值,技巧是使用$(())双括号:

N=3
M=3
COUNT=$N-1
ARR[0]=3
ARR[1]=2
ARR[2]=4
ARR[3]=1

while (( COUNT < ${#ARR[@]} ))
do
  ARR[$COUNT]=$((ARR[COUNT]*M))
  (( COUNT=$COUNT+$N ))
done

其他回答

有些人可能觉得这很有用。变量替换中的整数值,技巧是使用$(())双括号:

N=3
M=3
COUNT=$N-1
ARR[0]=3
ARR[1]=2
ARR[2]=4
ARR[3]=1

while (( COUNT < ${#ARR[@]} ))
do
  ARR[$COUNT]=$((ARR[COUNT]*M))
  (( COUNT=$COUNT+$N ))
done
$(sudo run command)

如果你要使用撇号,你需要“,而不是”。此字符称为“背景音”(或“重音符”):

#!/bin/bash

VAR1="$1"
VAR2="$2"

MOREF=`sudo run command against "$VAR1" | grep name | cut -c7-`

echo "$MOREF"

如果您尝试执行的命令失败,它会将输出写入错误流,然后打印到控制台。

要避免这种情况,必须重定向错误流:

result=$(ls -l something_that_does_not_exist 2>&1)

正如他们已经向您指出的那样,您应该使用“倒勾”。

提议的另一种$(命令)也很有效,而且它也更容易阅读,但请注意,它仅适用于Bash或KornShell(以及由此派生的shell),因此,如果您的脚本必须在各种Unix系统上真正可移植,那么您应该更喜欢旧的backticks表示法。

除了反引号“command”之外,还可以使用$(命令)或“$(命令”进行命令替换,我觉得这更容易阅读,并且允许嵌套。

OUTPUT=$(ls -1)
echo "${OUTPUT}"

MULTILINE=$(ls \
   -1)
echo "${MULTILINE}"

引号(“)对于保留多行变量值很重要;在赋值的右侧是可选的,因为不执行单词分割,所以OUTPUT=$(ls-1)可以正常工作。