将BASH脚本变量用于已执行的命令

时间:2015-02-07 14:22:30

标签: bash variables

有人可以帮忙解决这个问题,因为我似乎无法找到解决方案。我有以下脚本可以正常工作:

#!/bin/bash

#Checks the number of lines in the userdomains file

NUM=`awk 'END {print NR}' /etc/userdomains.hristian`;

echo $NUM


#Prints out a particular line from the file (should work with $NUM eventually)

USER=`sed -n 4p /etc/userdomains.hristian`

echo $USER


#Edits the output so that only the username is left

USER2=`echo $USER | awk '{print $NF}'`

echo $USER2

但是,当我用变量$ NUM替换第12行的4时,就像这样,它不起作用:

USER=`sed -n $NUMp /etc/userdomains.hristian`

我尝试了许多不同的引号组合和$ {},但是它们似乎都没有用,因为我是一个BASH新手。请帮助:)

2 个答案:

答案 0 :(得分:2)

我不确定你已经尝试了什么,但这对我有用:

$ cat out
line 1
line 2
line 3
line 4
line 5
$ num=4
$ a=`sed -n ${num}p out`
$ echo "$a"
line 4

要明确的是,这里的问题是您需要将$num的扩展与sed命令中的p分开。那是花括号的作用。 请注意,我使用的是小写变量名。应该保留大写的shell以供shell使用。我还建议使用更现代的$()语法进行命令替换:

a=$(sed -n "${num}p" out)

围绕sed命令的双引号是不必要的,但它们不会造成任何伤害。一般来说,在扩展中使用它们是一个好主意。

据推测,你问题中的剧本是一个学习练习,这就是你分别完成所有步骤的原因。为了记录,你可以像这样一次完成整个过程:

awk 'END { print $NF }' /etc/userdomains.hristian

END块中,仍然可以访问文件中最后一行的值,因此您可以直接打印最后一个字段。

答案 1 :(得分:1)

您尝试评估变量$NUMp而不是$NUM。试试这个:

USER=`sed -n ${NUM}p /etc/userdomains.hristian`