我有一个非常简单的脚本,大致如下:
#!/bin/bash
VAR1="$1"
MOREF='sudo run command against $VAR1 | grep name | cut -c7-'
echo $MOREF
当我从命令行运行这个脚本并向它传递参数时,我没有得到任何输出。然而,当我运行$MOREF变量中包含的命令时,我能够获得输出。
如何获取需要在脚本中运行的命令的结果,将其保存到变量中,然后在屏幕上输出该变量?
我有一个非常简单的脚本,大致如下:
#!/bin/bash
VAR1="$1"
MOREF='sudo run command against $VAR1 | grep name | cut -c7-'
echo $MOREF
当我从命令行运行这个脚本并向它传递参数时,我没有得到任何输出。然而,当我运行$MOREF变量中包含的命令时,我能够获得输出。
如何获取需要在脚本中运行的命令的结果,将其保存到变量中,然后在屏幕上输出该变量?
当前回答
如果要使用多行/多个命令执行此操作,则可以执行以下操作:
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
)"
其他回答
Mac/OSX现在有旧的Bash版本,即GNUbash,版本3.2.57(1)-发布(arm64-apple-darwin21)。在这种情况下,可以使用:
new_variable="$(some_command)"
具体示例:
newvar="$(echo $var | tr -d '123')"
注意(),而不是Bash 4中通常的{}。
正如他们已经向您指出的那样,您应该使用“倒勾”。
提议的另一种$(命令)也很有效,而且它也更容易阅读,但请注意,它仅适用于Bash或KornShell(以及由此派生的shell),因此,如果您的脚本必须在各种Unix系统上真正可移植,那么您应该更喜欢旧的backticks表示法。
只是为了与众不同:
MOREF=$(sudo run command against $VAR1 | grep name | cut -c7-)
可以使用反引号(也称为重音坟墓)或$()。
喜欢:
OUTPUT=$(x+2);
OUTPUT=`x+2`;
两者都有相同的效果。但是OUTPUT=$(x+2)更可读,并且是最新的。
还有两种方法:
请记住,空间在Bash中非常重要。因此,如果要运行命令,请使用原样,而不引入任何空格。
下面将harsil分配给L,然后打印L=$“苛刻”echo“$L”下面将命令tr的输出分配给L2。tr正在对另一个变量L1进行运算。L2=$(echo“$L1”| tr[:上:][:下:])