我是shell脚本的新手:
我有以下内容:
old=/dev/sda
new=/dev/sda5
鉴于这些变量,我需要从“new”字符串中提取5
。
我应该怎么做? sed
? awk
?
尝试使用:
partitionno=$(echo $new | sed 's/$old//g')
答案 0 :(得分:3)
要在命令变化最小的情况下获得正确的结果,请尝试:
partitionno=$(echo "$new" | sed "s|$old||g")
这里有两个关键点:
Shell变量不会在单引号内展开。因此,'$old'
仍然是原始的四个字符:$
,o
,l
和d
。要扩展shell变量,请使用双引号。
sed "s/$old//g"
仍然无法工作,因为有太多的斜杠。替换命令使用三个斜杠。 shell扩展$old
后,有五个斜杠。解决方案是为substitute命令使用不同的分隔符。我之所以选择|
,是因为|
不太可能是文件名。
答案 1 :(得分:1)
$ old=/dev/sda
$ new=/dev/sda5
$ echo "${new#$old}"
5
$ {参数#字}
$ {参数##字}
这个词被扩展为产生一个模式,就像文件名扩展一样(参见文件名扩展)。如果模式匹配参数的扩展值的开头,则扩展的结果是具有最短匹配模式('#'大小写)或最长匹配模式('##'大小写)的参数的扩展值删除。如果参数是'@'或'',则模式删除操作依次应用于每个位置参数,并且扩展是结果列表。如果参数是使用'@'或''下标的数组变量,则模式删除操作依次应用于数组的每个成员,并且扩展是结果列表。