2015-02-07 97 views
0

有人可以请帮助,因为我似乎无法找到解决方案。我有以下脚本正常工作:使用BASH脚本变量执行命令

#!/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的新手。请帮助:)

+0

你没有尝试所有的组合:'USER = \'sed -n $ {NUM} p /etc/userdomains.hristian \''。作为一个方面说明:_不要在Bash中使用大写变量名!_在这里你做错了:'USER'很可能是一个变量集并被你的系统使用;你可能迟早会发生冲突!作为附加说明:不要使用反引号,而应使用'$(...)'代替:'USER = $(sed -n $ {NUM} p /etc/userdomains.hristian)'。 – 2015-02-07 14:27:24

+1

你想打印文件的最后一行吗?如果是这样,'tail -n1/etc/userdomains.hristian'将更有效地完成这项工作。 – 2015-02-07 14:34:04

+0

显然是最后一行的最后一个字段。最简单的方法是'awk'END {print $ NF}'/ etc/userdomains.hristian',尽管使用'tail -n1 /etc/userdomains.hristian | awk'{print $ NF}''对于大文件会更有效率。 – Wintermute 2015-02-07 14:37:43

回答

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使用。我也建议你使用更现代化的$()语法命令替换:

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

周围的sed命令的双引号是没有必要的,但他们没有做任何伤害。一般来说,在扩展中使用它们是个好主意。

大概在你的问题中的脚本是一个学习练习,这就是为什么你分开完成所有步骤。根据记录,你可以做整个事情的一个是这样的:

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

END块,从文件的最后一行的值仍然可以访问,这样你就可以直接打印的最后一个字段。

+1

哦,我的工作。非常感谢您提供的信息和建议。注意到了。 – Neekoy 2015-02-07 14:40:12

1

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

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