在命令行中使用变量

时间:2017-07-25 16:10:37

标签: unix command-line

我写了一段代码并且效果很好,但我需要使用变量代替静态数字作为范围8和16

cat /etc/passwd | sed '/^#/d' | sed -n 'n;p' | sed 's/:\(.*\) //g' | sed 's/ /,/g' | sed 's/\(.*\),/\1./' | sort -r | sed 's/*rav://g' | sed "s/:.*//" | rev | sed -n -e '8,16p' | xargs | sed -e 's/ /, /g' | sed '/:[0-9]*$/ ! s/$/./'

我已将代码更改为

cat /etc/passwd | sed '/^#/d' | sed -n 'n;p' | sed 's/:\(.*\) //g' | sed 's/ /,/g' | sed 's/\(.*\),/\1./' | sort -r | sed 's/*rav://g' | sed "s/:.*//" | rev | sed -n -e '$FT_LINE1,$FT_LINE2+p' | xargs | sed -e 's/ /, /g' | sed '/:[0-9]*$/ ! s/$/./'

但我收到了错误

sed: 1: "$FT_LINE1,$FT_LINE2p": invalid command code F

2 个答案:

答案 0 :(得分:1)

使用大括号包围变量,以便shell知道变量名称的结束位置:

sed -n -e "${FT_LINE1},${FT_LINE2}p"

编辑 - D'哦,我不敢相信我错过了单引号。它们需要是双引号,正如其他人指出的那样,会发生变量替换。

答案 1 :(得分:1)

单引号中包含的变量不会被shell扩展,因此sed命令会逐字地看到参数$FT_LINE1,$FT_LINE2p。使用双引号,你会没事的:

sed -n -e "$FT_LINE1,${FT_LINE2}p"

另见: