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

#!/bin/bash

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

echo $MOREF

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

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


当前回答

还有两种方法:

请记住,空间在Bash中非常重要。因此,如果要运行命令,请使用原样,而不引入任何空格。

下面将harsil分配给L,然后打印L=$“苛刻”echo“$L”下面将命令tr的输出分配给L2。tr正在对另一个变量L1进行运算。L2=$(echo“$L1”| tr[:上:][:下:])

其他回答

Mac/OSX现在有旧的Bash版本,即GNUbash,版本3.2.57(1)-发布(arm64-apple-darwin21)。在这种情况下,可以使用:

new_variable="$(some_command)"

具体示例:

newvar="$(echo $var | tr -d '123')"

注意(),而不是Bash 4中通常的{}。

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

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

如果要使用多行/多个命令执行此操作,则可以执行以下操作:

output=$( bash <<EOF
# Multiline/multiple command/s
EOF
)

Or:

output=$(
# Multiline/multiple command/s
)

例子:

#!/bin/bash
output="$( bash <<EOF
echo first
echo second
echo third
EOF
)"
echo "$output"

输出:

first
second
third

使用heredoc,您可以通过将长的单行代码分解为多行代码来非常容易地简化事情。另一个例子:

output="$( ssh -p $port $user@$domain <<EOF
# Breakdown your long ssh command into multiline here.
EOF
)"

这是另一种方式,很适合与一些无法正确突出显示您创建的每一个复杂代码的文本编辑器一起使用:

read -r -d '' str < <(cat somefile.txt)
echo "${#str}"
echo "$str"

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

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

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