我有一个非常简单的脚本,大致如下:
#!/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=$(x+2);
OUTPUT=`x+2`;
两者都有相同的效果。但是OUTPUT=$(x+2)更可读,并且是最新的。
其他回答
如果要使用多行/多个命令执行此操作,则可以执行以下操作:
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
)"
$(sudo run command)
如果你要使用撇号,你需要“,而不是”。此字符称为“背景音”(或“重音符”):
#!/bin/bash
VAR1="$1"
VAR2="$2"
MOREF=`sudo run command against "$VAR1" | grep name | cut -c7-`
echo "$MOREF"
除了反引号“command”之外,还可以使用$(命令)或“$(命令”进行命令替换,我觉得这更容易阅读,并且允许嵌套。
OUTPUT=$(ls -1)
echo "${OUTPUT}"
MULTILINE=$(ls \
-1)
echo "${MULTILINE}"
引号(“)对于保留多行变量值很重要;在赋值的右侧是可选的,因为不执行单词分割,所以OUTPUT=$(ls-1)可以正常工作。
您需要使用
$(此处为命令)
or
`command-here`
实例
#!/bin/bash
VAR1="$1"
VAR2="$2"
MOREF="$(sudo run command against "$VAR1" | grep name | cut -c7-)"
echo "$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